8-5 도트 매트릭스에 움직이는 글자와 모양 표시

공부하는 학생 A·2024년 2월 18일
0

아두이노 

목록 보기
42/74

도트 매트릭스

이번 실험은 도트 매트릭스에 글자와 모양을 움직이면서 표시하는 것이다. 도트 매트릭스에 모양을 만들 때 한 번에 만드는 것이 아니라 0번째 행부터 7번째 행까지 빠르게 번갈아 가면서 화면에 보여주는 것이다. 이것은 사람 눈의 잔상 효과를 이용한 것이며, 모든 줄이 빛이 나는 것처럼 보이게 된다.

스케치 8-8 도트 매트릭스를 이용하여 문자열 출력하기

#include <FrequencyTimer2.h>
#define SPACE { \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0} \
}

#define H { \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 1, 1, 1, 1, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}, \
  {0, 1, 0, 0, 0, 0, 1, 0}  \
}
#define I  { \
  {0, 0, 1, 1, 1, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 0, 1, 0, 0, 0, 0}, \
  {0, 0, 1, 1, 1, 0, 0, 0} \
}
#define Q { \
  {0, 0, 0, 0, 0, 0, 1, 0}, \
  {0, 0, 0, 0, 1, 1, 1, 0}, \
  {0, 0, 0, 0, 1, 1, 1, 0}, \
  {0, 0, 0, 1, 1, 1, 0, 0}, \
  {0, 0, 0, 1, 1, 0, 0, 0}, \
  {0, 0, 0, 0, 0, 0, 0, 0}, \
  {0, 1, 1, 0, 0, 0, 0, 0}, \
  {0, 1, 1, 0, 0, 0, 0, 0}  \
}
#define SMILE { \ 
  {0,0,0,0,0,0,0,0,},\
  {0,0,1,0,0,0,1,0,},\
  {0,1,0,1,0,1,0,1,},\
  {0,0,0,0,0,0,0,0,},\
  {0,0,0,0,1,0,0,0,},\
  {0,1,0,0,1,0,0,1,},\
  {0,0,1,0,0,0,1,0,},\
  {0,0,0,1,1,1,0,0,} \
}
byte col = 0;
byte leds[8][8];
 
// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9,8, 7, 6};

// row[xx] of leds = pin yy on led matrix
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1],pins[7], pins[2], pins[5]};
 
// col[xx] of leds = pin yy on led matrix
int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06],pins[11], pins[15], pins[16]};

const int numPatterns = 5;
byte patterns[numPatterns][8][8] = {
  H, I, Q, SMILE, SPACE
};
int pattern = 0;
void setup() {
  // put your setup code here, to run once:
  for (int i = 1; i <= 16; i++) {
    pinMode(pins[i], OUTPUT);
  }
  for (int i = 1; i <= 8; i++) {
    digitalWrite(cols[i - 1], HIGH);
  }
  // set up cols and rows
  for (int i = 1; i <= 8; i++) {
    digitalWrite(rows[i - 1], HIGH);
  }
  clearLeds();
  FrequencyTimer2::disable();
  FrequencyTimer2::setPeriod(2000);
  FrequencyTimer2::setOnOverflow(display);
  setPattern(pattern);
}
void loop() {
  pattern = ++pattern % numPatterns;
  slidePattern(pattern, 300);
}
void clearLeds() {
  // Clear display array
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      leds[i][j] = 0;
    }
  }
}
void setPattern(int pattern) {
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      leds[i][j] = patterns[pattern][i][j];
    }
  }
}
void slidePattern(int pattern, int del) {
  for (int l = 0; l < 8; l++) {
    for (int i = 0; i < 7; i++) {
      for (int j = 0; j < 8; j++) {
        leds[j][i] = leds[j][i + 1];
      }
    }
    for (int j = 0; j < 8; j++) {
      leds[j][7] = patterns[pattern][j][0 + l];
    }
    delay(del);
  }
}
void display() {
  digitalWrite(cols[col], HIGH);  
  col++;
  if (col == 8) {
    col = 0;
  }
  for (int row = 0; row < 8; row++) {
    if (leds[col][7 - row] == 1) {
      digitalWrite(rows[row], HIGH);  
    }
    else {
      digitalWrite(rows[row], LOW); 
    }
  }
  digitalWrite(cols[col], LOW); 
}

스케치 8-8 분석

#define을 이용하여 출력하고자 하는 문자와 모양을 8x8 배열에 넣는다. 8x8 배열에서 LED가 ON이면 '1'을 LED가 OFF이면 '0'을 넣는다. 각각의 문자에 대해 8x8 배열을 'H','I','Q'그리고 'SMILE'로 정의하였다.

clearLeds()는 LED를 초기화시킨다. setPattern( ) 함수는 출력하고자 하는 패턴을 저장한다.
void slidePattern( )은 패턴을 옆으로 한 칸씩 옮기면서 출력을 한다. 이때 주어진 'del'값에 의해 움직임 빠르기가 결정된다. 최종적으로 display( ) 함수를 이용하여 출력된다.

profile
Shine like a star, Just like a star

0개의 댓글