별건 아니고, 정리하는 의미에서 몇 가지 다른 효과를 만들어 보겠습니다.
기본 적인 코드 구성과 필요한 설명은 이전 글들에서 다루었기 때문에 이번 글에선 소개 정도로만 설명하겠습니다.
우선, 이전 글에서 다루었던 예제를 손을 좀 보겠습니다. LED 매트릭스에 출력하기 위해선 패턴 데이터가 미리 저장되어 있어야 합니다. 그래서, 어떤 LED를 켜서 그림을 만들지 일일이 배열로 저장해서 다루었는데, 이 때문에 프로그램 소스가 너무 길어지는 단점이 있습니다.
패턴 데이터는 변하지 않기 때문에 헤더 파일로 만들어서 접근하는 편이 프로그램도 간단해져서 훨씬 좋고, 또 단순히 데이터만 담는 헤더 파일은 만들기도 쉽습니다. 적당한 파일명으로 텍스트 파일을 만든 후, 프로그램 소스와 동일한 폴더에 넣어 주면 아두이노 개발 환경이 자동으로 불러와 줍니다!
#include "LedControl.h"
//
LedControl lc = LedControl(12,11,10,4);
byte data[26][8] = {
{
B00000000,
B00111100,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01100110,
B01100110,
B01111100
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01100000,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01111100
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01101110,
B01100110,
B00111100
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B00111100,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00111100
},{
B00000000,
B00011110,
B00001100,
B00001100,
B00001100,
B01101100,
B01101100,
B00111000
},{
B00000000,
B01100110,
B01101100,
B01111000,
B01110000,
B01111000,
B01101100,
B01100110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01100011,
B01110111,
B01111111,
B01101011,
B01100011,
B01100011,
B01100011
},{
B00000000,
B01100011,
B01110011,
B01111011,
B01101111,
B01100111,
B01100011,
B01100011
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01111100,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01101110,
B00111100,
B00000110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01111000,
B01101100,
B01100110
},{
B00000000,
B00111100,
B01100110,
B01100000,
B00111100,
B00000110,
B01100110,
B00111100
},{
B00000000,
B01111110,
B01011010,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000
},{
B00000000,
B01100011,
B01100011,
B01100011,
B01101011,
B01111111,
B01110111,
B01100011
},{
B00000000,
B01100011,
B01100011,
B00110110,
B00011100,
B00110110,
B01100011,
B01100011
},{
B00000000,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01111110,
B00000110,
B00001100,
B00011000,
B00110000,
B01100000,
B01111110
}};
//
void setup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.shutdown(2, false);
lc.shutdown(3, false);
//
lc.setIntensity(0,8);
lc.setIntensity(1,8);
lc.setIntensity(2,8);
lc.setIntensity(3,8);
//
lc.clearDisplay(0);
lc.clearDisplay(1);
lc.clearDisplay(2);
lc.clearDisplay(3);
}
//
void loop() {
//
int i, j, k;
byte buffers[4+1][8];
//
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
buffers[i][j] = B00000000;
}
}
// 문자 슬라이드 처리
for (i = 0; i < 26; i++) { // 전체 글자수 만큼 반복
memcpy(&buffers[4], &data[i], sizeof(data[0]));
//
for (j = 0; j < 8; j++) { // 한 글자는 8열이므로, 글자당 8번 수행
for (k = 0; k < 8; k++) { // 한 글자는 8행
// 슬라이드 처리
buffers[0][k] = (buffers[0][k] << 1) | (buffers[1][k] >> 7);
buffers[1][k] = (buffers[1][k] << 1) | (buffers[2][k] >> 7);
buffers[2][k] = (buffers[2][k] << 1) | (buffers[3][k] >> 7);
buffers[3][k] = (buffers[3][k] << 1) | (buffers[4][k] >> 7);
buffers[4][k] = (buffers[4][k] << 1);
}
for (k = 0; k < 8; k++) { // 슬라이드 처리후 출력
// 출력 코드
lc.setRow(0, k, buffers[0][k]);
lc.setRow(1, k, buffers[1][k]);
lc.setRow(2, k, buffers[2][k]);
lc.setRow(3, k, buffers[3][k]);
}
delay(10);
}
}
delay(1000);
}
이전 글에서 만든 소스입니다. 가로 방향으로 알파벳 26글자를 슬라이드 하는 소스인데, 26글자에 대한 패턴이 상당히 긴 부분을 차지합니다. 이 부분을 헤더 파일로 따로 만들겠습니다.
우선, 프로그램 소스 파일과 동일한 폴더에 메모장 등을 이용해 적당한 이름의 텍스트 파일을 만듭니다. 확장자는 꼭 "h" 한 글자로 지정하고, 패턴 데이터를 옮겨서 저장해 줍니다.
헤더 파일을 생성한 후, 프로그램 소스를 닫았다 다시 열면 위와 같이 별도의 탭으로 알아서 열어 줍니다. 편집도 여기서 하면 되구요!
#include "LedControl.h"
#include "LedData.h"
//
LedControl lc = LedControl(12,11,10,4);
//
마지막으로, 프로그램 소스에서 #include문을 이용해 이 헤더 파일을 사용하겠다고 선언해주면 됩니다. 이렇게 하고 실행해 보면 동일한 결과를 확인할 수 있습니다.
일정 시간안에 여러 개의 프레임을 순서대로 출력하면 애니메이션 효과를 표현할 수 있겠죠! 그럴 듯한 패턴이 없어서 그냥 화살표를 돌려 보도록 하겠습니다.
const byte arrow[][8] = {
{
B00000000,
B00001000,
B00011100,
B00111110,
B01111111,
B00011100,
B00011100,
B00011100
},{
B00000000,
B00011100,
B00011100,
B00011100,
B01111111,
B00111110,
B00011100,
B00001000
},{
B00000000,
B00001000,
B00001100,
B01111110,
B01111111,
B01111110,
B00001100,
B00001000
},{
B00000000,
B00001000,
B00011000,
B00111111,
B01111111,
B00111111,
B00011000,
B00001000
}};
우선 상, 하, 좌, 우, 4개의 화살표를 패턴으로 헤더 파일에 저장하였습니다. "const"는 데이터의 변동이 없는 상수 데이터를 의미합니다.
void bufInMotion() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 8; k++) {
lc.setRow(0, k, arrow[j][k]);
if (i > 1) {
lc.setRow(1, k, arrow[j][k]);
}
if (i > 3) {
lc.setRow(2, k, arrow[j][k]);
}
if (i > 5) {
lc.setRow(3, k, arrow[j][k]);
}
}
delay(100);
}
}
}
애니메이션 수행 코드입니다. 가장 바깥 쪽 for문의 "i" 값은 전체 실행 횟수입니다. 두 번째 for문은 패턴 4개를 돌아가며 출력하기 위한 것이고, 가장 안쪽 for문은 8개의 행을 출력하여 하나의 패턴을 완성하는 코드입니다. 단순한 코드인데, 중간의 if문은 각 모듈의 시작 시간을 달리 하기 위함입니다.
이제 까지의 슬라이드 효과는 항상 오른쪽에서 왼쪽으로 흘러 가는 소스만 작성했는데, 아래와 같이 반대 방향 코드도 작성해 보았습니다. for문의 인수만 잘 지정하면 쉽게 구현할 수 있습니다.
const byte shift[8] = {
B00001111,
B00011111,
B00111111,
B01111111,
B11111110,
B11111100,
B11111000,
B11110000
};
출력할 패턴을 헤더 파일에 삽입했습니다.
void bufInShift2() {
int i, j, k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
if (j == 0) memcpy(&buffers[4], &shift, sizeof(buffers[0]));
for (k = 0; k < 8; k++) {
buffers[3][k] = (buffers[3][k] >> 1) | (buffers[2][k] << 7);
buffers[2][k] = (buffers[2][k] >> 1) | (buffers[1][k] << 7);
buffers[1][k] = (buffers[1][k] >> 1) | (buffers[0][k] << 7);
buffers[0][k] = (buffers[0][k] >> 1) | (buffers[4][k] << 7);
buffers[4][k] = (buffers[4][k] >> 1);
}
for (k = 0; k < 8; k++) {
lc.setRow(0, k, buffers[0][k]);
lc.setRow(1, k, buffers[1][k]);
lc.setRow(2, k, buffers[2][k]);
lc.setRow(3, k, buffers[3][k]);
}
delay(30);
}
}
}
완성된 코드입니다. 보는 바와 같이 루프가 반대쪽 부터 돌도록 for문 내의 배열 첨자만 조절하였습니다.
이번에는 페이드 인 효과를 흉내내 보겠습니다. 출력 데이터의 첫 번째 열부터 마지막 열까지 순차적으로 출력하여 마치 페이드 인 효과처럼 보이도록 하는데, 기존의 setRow() 함수로는 좀 어렵습니다. 각 모듈의 1번 열부터 8번 열(코드상 0번 ~ 7번)까지 한 번에 출력하기 때문에 구현하기가 복잡합니다. 대신, setLed() 함수는 개별 LED 단위로 on/off 할 수 있으므로 간단하게 처리할 수 있습니다.
// fade In 처음부터
void bufInFadeFirst() {
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 8; k++) {
lc.setLed(i, k, j, bitRead(fade1[i][k], 7 - j));
}
delay(50);
}
}
}
출력할 데이터는 fade1[][8] 배열에 저장되어 있습니다. 이 데이터는 byte type이기 때문에 8비트가 하나의 단위인데, setLed() 함수는 하나의 비트값만 필요합니다. bitRead() 함수는 특정 데이터에서 원하는 자리의 비트값을 읽어 반환해주는 함수이며, 이를 이용해서 byte 단위 데이터의 특정 비트값을 구할 수 있습니다.
바깥 for문은 모듈 0번부터 3번까지, 중간 for문은 0번 열부터 7번 열까지, 안쪽 for문은 0번 행부터 7번 행까지 반복해 줍니다.
// fade In 끝부터
void bufInFadeEnd() {
int i, j, k;
for (i = 3; i >= 0 ; i--) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 8; k++) {
lc.setLed(i, k, 7 - j, bitRead(fade2[i][k], j));
}
delay(50);
}
}
}
같은 동작인데, 끝부터 출력되는 코드입니다.
// fade In 중간부터
void bufInFadeMid() {
int Cnt, i, j, k;
int m1 = 1, m2 = 2;
for (Cnt = 0; Cnt < 16; Cnt++) {
if (Cnt >= 8) {
m1 = 0;
m2 = 3;
i = 15 - Cnt;
j = Cnt - 8;
} else {
i = 7 - Cnt;
j = Cnt;
}
for (k = 0; k < 8; k++) {
lc.setLed(m1, k, i, bitRead(fade3[m1][k], i));
lc.setLed(m2, k, j, bitRead(fade3[m2][k], j));
}
delay(50);
}
}
화면 중간부터 페이드 인하는 코드입니다. 위에서 만든 두 코드를 조합하여 반씩 완성하도록 구성하였습니다.
이제 까지 만든 표현들을 적당히 섞이서 만든 소스입니다. 전체 소스 및 헤더 파일, 실행 동영상을 아래와 같이 확인할 수 있습니다.
#include "LedControl.h"
#include "LedData.h"
//
LedControl lc = LedControl(12,11,10,4);
//
byte buffers[4+1][8];
//
void setup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.shutdown(2, false);
lc.shutdown(3, false);
//
lc.setIntensity(0,8);
lc.setIntensity(1,8);
lc.setIntensity(2,8);
lc.setIntensity(3,8);
//
lc.clearDisplay(0);
lc.clearDisplay(1);
lc.clearDisplay(2);
lc.clearDisplay(3);
}
//
void loop() {
//
bufIn();
delay(1000);
bufInBlink();
delay(1000);
bufInMotion();
delay(1000);
bufInShift();
delay(1000);
bufInShift2();
delay(1000);
bufInFadeFirst();
delay(1000);
bufInFadeEnd();
delay(1000);
bufInFadeMid();
delay(1000);
}
// 출력 데이터를 buffers에 전송
void bufIn() {
for (int i = 0; i < 4; i++) {
memcpy(&buffers[i], &led[i], sizeof(buffers[0]));
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
lc.setRow(i, j, buffers[i][j]);
}
}
}
// 깜박임 효과
void bufInBlink() {
bool flag = true;
for (int Cnt = 0; Cnt < 6; Cnt++) {
if (flag) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
lc.setRow(i, j, 0);
}
}
flag = false;
} else {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
lc.setRow(i, j, buffers[i][j]);
}
}
flag = true;
}
delay(100);
}
}
// 문자 슬라이드 효과
void bufInShift() {
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
buffers[i][j] = 0;
}
}
for (i = 0; i < welcomeLen; i++) {
for (j = 0; j < 8; j++) {
if (j == 0) memcpy(&buffers[4], &welcome[i], sizeof(buffers[0]));
for (k = 0; k < 8; k++) {
buffers[0][k] = (buffers[0][k] << 1) | (buffers[1][k] >> 7);
buffers[1][k] = (buffers[1][k] << 1) | (buffers[2][k] >> 7);
buffers[2][k] = (buffers[2][k] << 1) | (buffers[3][k] >> 7);
buffers[3][k] = (buffers[3][k] << 1) | (buffers[4][k] >> 7);
buffers[4][k] = (buffers[4][k] << 1);
}
for (k = 0; k < 8; k++) {
lc.setRow(0, k, buffers[0][k]);
lc.setRow(1, k, buffers[1][k]);
lc.setRow(2, k, buffers[2][k]);
lc.setRow(3, k, buffers[3][k]);
}
delay(30);
}
}
}
void bufInShift2() {
int i, j, k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
if (j == 0) memcpy(&buffers[4], &shift, sizeof(buffers[0]));
for (k = 0; k < 8; k++) {
buffers[3][k] = (buffers[3][k] >> 1) | (buffers[2][k] << 7);
buffers[2][k] = (buffers[2][k] >> 1) | (buffers[1][k] << 7);
buffers[1][k] = (buffers[1][k] >> 1) | (buffers[0][k] << 7);
buffers[0][k] = (buffers[0][k] >> 1) | (buffers[4][k] << 7);
buffers[4][k] = (buffers[4][k] >> 1);
}
for (k = 0; k < 8; k++) {
lc.setRow(0, k, buffers[0][k]);
lc.setRow(1, k, buffers[1][k]);
lc.setRow(2, k, buffers[2][k]);
lc.setRow(3, k, buffers[3][k]);
}
delay(30);
}
}
}
void bufInMotion() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 8; k++) {
lc.setRow(0, k, arrow[j][k]);
if (i > 1) {
lc.setRow(1, k, arrow[j][k]);
}
if (i > 3) {
lc.setRow(2, k, arrow[j][k]);
}
if (i > 5) {
lc.setRow(3, k, arrow[j][k]);
}
}
delay(100);
}
}
}
// fade In 처음부터
void bufInFadeFirst() {
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 8; k++) {
lc.setLed(i, k, j, bitRead(fade1[i][k], 7 - j));
}
delay(50);
}
}
}
// fade In 끝부터
void bufInFadeEnd() {
int i, j, k;
for (i = 3; i >= 0 ; i--) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 8; k++) {
lc.setLed(i, k, 7 - j, bitRead(fade2[i][k], j));
}
delay(50);
}
}
}
// fade In 중간부터
void bufInFadeMid() {
int Cnt, i, j, k;
int m1 = 1, m2 = 2;
for (Cnt = 0; Cnt < 16; Cnt++) {
if (Cnt >= 8) {
m1 = 0;
m2 = 3;
i = 15 - Cnt;
j = Cnt - 8;
} else {
i = 7 - Cnt;
j = Cnt;
}
for (k = 0; k < 8; k++) {
lc.setLed(m1, k, i, bitRead(fade3[m1][k], i));
lc.setLed(m2, k, j, bitRead(fade3[m2][k], j));
}
delay(50);
}
}
byte data[26][8] = {
{
B00000000,
B00111100,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01100110,
B01100110,
B01111100
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01100000,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01111100
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01101110,
B01100110,
B00111100
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B00111100,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00111100
},{
B00000000,
B00011110,
B00001100,
B00001100,
B00001100,
B01101100,
B01101100,
B00111000
},{
B00000000,
B01100110,
B01101100,
B01111000,
B01110000,
B01111000,
B01101100,
B01100110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01100011,
B01110111,
B01111111,
B01101011,
B01100011,
B01100011,
B01100011
},{
B00000000,
B01100011,
B01110011,
B01111011,
B01101111,
B01100111,
B01100011,
B01100011
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01111100,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01101110,
B00111100,
B00000110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01111000,
B01101100,
B01100110
},{
B00000000,
B00111100,
B01100110,
B01100000,
B00111100,
B00000110,
B01100110,
B00111100
},{
B00000000,
B01111110,
B01011010,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000
},{
B00000000,
B01100011,
B01100011,
B01100011,
B01101011,
B01111111,
B01110111,
B01100011
},{
B00000000,
B01100011,
B01100011,
B00110110,
B00011100,
B00110110,
B01100011,
B01100011
},{
B00000000,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01111110,
B00000110,
B00001100,
B00011000,
B00110000,
B01100000,
B01111110
}};
const byte led[][8] = {
{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01111100
},
{
B00000000,
B00100010,
B01110111,
B01111111,
B01111111,
B00111110,
B00011100,
B00001000
}};
const byte arrow[][8] = {
{
B00000000,
B00001000,
B00011100,
B00111110,
B01111111,
B00011100,
B00011100,
B00011100
},{
B00000000,
B00011100,
B00011100,
B00011100,
B01111111,
B00111110,
B00011100,
B00001000
},{
B00000000,
B00001000,
B00001100,
B01111110,
B01111111,
B01111110,
B00001100,
B00001000
},{
B00000000,
B00001000,
B00011000,
B00111111,
B01111111,
B00111111,
B00011000,
B00001000
}};
const byte welcome[][8] = {
{
B00000000,
B01111110,
B01011010,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01111000,
B01101100,
B01100110
},{
B00000000,
B01111110,
B01011010,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B00111100,
B01100110,
B01100000,
B00111100,
B00000110,
B01100110,
B00111100
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B01100000,
B01100000
},{
B00000000,
B01100110,
B01101100,
B01111000,
B01110000,
B01111000,
B01101100,
B01100110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01111000,
B01101100,
B01100110
}};
const int welcomeLen = sizeof(welcome)/8;
const byte fade1[][8] = {
{
B11111111,
B10000000,
B10011100,
B10111110,
B10111110,
B10111110,
B10011100,
B11111111
},{
B11111111,
B00000000,
B00011100,
B00111110,
B00111110,
B00111110,
B00011100,
B11111111
},{
B11111111,
B00000000,
B00011100,
B00111110,
B00111110,
B00111110,
B00011100,
B11111111
},{
B11111111,
B00000001,
B00011101,
B00111111,
B00111111,
B00111111,
B00011101,
B11111111
}};
const byte fade2[][8] = {
{
B00000000,
B00001000,
B00011100,
B00011100,
B00111110,
B00111110,
B01111111,
B01111111
},{
B00000000,
B01111111,
B01111111,
B00111110,
B00111110,
B00011100,
B00011100,
B00001000
},{
B00000000,
B01100000,
B01111000,
B01111110,
B01111111,
B01111110,
B01111000,
B01100000
},{
B00000000,
B00000011,
B00001111,
B00111111,
B01111111,
B00111111,
B00001111,
B00000011
}};
const byte fade3[][8] = {
{
B11111111,
B11111111,
B11100011,
B11011101,
B11011101,
B11011101,
B11100011,
B11111111
},{
B11111111,
B11111111,
B11100011,
B11011101,
B11011101,
B11011101,
B11100011,
B11111111
},{
B11111111,
B11111111,
B11100011,
B11011101,
B11011101,
B11011101,
B11100011,
B11111111
},{
B11111111,
B11111111,
B11100011,
B11011101,
B11011101,
B11011101,
B11100011,
B11111111
}};
const byte shift[8] = {
B00001111,
B00011111,
B00111111,
B01111111,
B11111110,
B11111100,
B11111000,
B11110000
};
이상으로 LED matrix에 대한 연재를 마치겠습니다.