본문 바로가기
아두이노_프로세싱/아두이노

도트 매트릭스 문자 흐름

by 돌돌쌤 2023. 10. 2.

아래 내용은 도트매트리스와 8개의 저항을 이용하여 16개의 핀을 아두이노와 연결하여

문자를 흐르는 표현을 구성한 것이다.

조금 더 편하게 5개의 핀으로 구성하려면 아래링크의 모듈 추천!!

https://www.icbanq.com/P014162738 

 

도트 매트릭스를 이용하여 문자가 흐르는 표현 하기

gitgub에서 라이브러리 검색 FrequencyTimer2

FrequencyTimer2 라이브러리는  루키와 paulstoffregen 중

paulstoffregen을 사용

https://github.com/PaulStoffregen/FrequencyTimer2

매트릭스는

공통 애노드 공통 캐소드 형에 따라

스케치 소스 중 일부를 HIGH와 LOW를 변형해야 함.

 

  • 원형 숫자는 매트릭스 핀번호임.

  • 매트릭스 뒷면 핀 번호 순서

  • 아두이노와 매트릭스 연결

#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 E { \
 {0, 1, 1, 1, 1, 1, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 0} \
 }
 #define L { \
 {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}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 0} \
 }
 #define O { \
 {0, 0, 0, 1, 1, 0, 0, 0}, \
 {0, 0, 1, 0, 0, 1, 0, 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}, \
 {0, 0, 1, 0, 0, 1, 0, 0}, \
 {0, 0, 0, 1, 1, 0, 0, 0} \
}


/// 미리 문자를 만들어 놓고


byte col = 0;
 byte leds[8][8];
 
 // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy
 int pins[17]= {-1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 };     //  매트릭스의 핀번호 1~16 번까지 연결되는 아두이노 핀을  순서대로 
                                                                   // 맨 앞 -1은 임의용
 // 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] };
 
 // 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] };

const int numPatterns = 6;        // 글자수를 늘리려면 그수만큼 넘버패턴 수 지정
byte patterns[numPatterns][8][8] = { 
  H,E,L,L,O,SPACE                // 도트메트릭스에 지나갈 문자 넣기
};
 
 int pattern = 0;
 
 void setup() {
   // sets the pins as output
   for (int i = 1; i <= 16; i++) {
     pinMode(pins[i], OUTPUT);
   }
 
   // set up cols and rows
   for (int i = 1; i <= 8; i++) {
     digitalWrite(cols[i - 1], LOW);
   }
 
   for (int i = 1; i <= 8; i++) {
     digitalWrite(rows[i - 1], LOW);
   }
 
   clearLeds();
 
   // Turn off toggling of pin 11
   FrequencyTimer2::disable();
   // Set refresh rate (interrupt timeout period)
   FrequencyTimer2::setPeriod(2000);
   // Set interrupt routine to be called
   FrequencyTimer2::setOnOverflow(display);
 
   setPattern(pattern);
 }
 
 void loop() {
    pattern = ++pattern % numPatterns;
    slidePattern(pattern, 80);       // 80은 속도
}




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);
   }
 }
 // Interrupt routine
 void display() {
   digitalWrite(cols[col], HIGH);  // Turn whole previous column off==>다이오드 타입에 따라 LOW(cathode일떄)
   col++;
   if (col == 8) {
     col = 0;
   }
   for (int row = 0; row < 8; row++) {
     if (leds[col][7 - row] == 1) {
       digitalWrite(rows[row], HIGH);  // Turn on this led ==>다이오드 타입에 따라 LOW
     }
     else {
       digitalWrite(rows[row], LOW); // Turn off this led ==>다이오드 타입에 따라 HIGH
     }
   }
   digitalWrite(cols[col],LOW); // Turn whole column on at once (for equal lighting times) ==>다이오드 타입에 따라 HIGH
}

작동 영상

https://youtube.com/shorts/l02p5KTeGF8