내가 보려고 만든 블로그

아두이노 LED매트릭스 본문

아두이노

아두이노 LED매트릭스

hjh1023 2020. 9. 7. 14:21
반응형

빵판에 하려고 했는데 자리가 부족해서 그냥 끼웠다.

선이 너저분함;;

택트 스위치 누르면 8x8 led matrix의 글자가 변경되는 걸 하려고 했는데 누르니깐 너무 빠르게 바뀐다.
방법을 찾아야겠다.

저항이 이상한가 있는거 끼웠는뎅...;; 사야하나봄

-----------------------

저항 1k옴 해야한다고 해서 붙였는데 조금 나아지긴했지만 동작이 원하는대로 안나오네

원래 버튼이 이런가보다..;;

어쨌든 더 나아진거에 의의를 두자..

https://www.arduino.cc/en/Tutorial/RowColumnScanning

 

Arduino - RowColumnScanning

Row-columm Scanning to control an 8x8 LED Matrix LED displays are often packaged as matrixes of LEDs arranged in rows of common anodes and columns of common cathodes, or the reverse. Here's a typical example, and its schematic: These can be very useful dis

www.arduino.cc

여기서 라이브러리 다운받아야함

다운 받은 라이브러리 파일을 아두이노에 추가합니다.
아두이노 > 스케치 > 라이브러리 포함하기 > .ZIP 라이브러리 추가…

#include <FrequencyTimer2.h>

#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 D { \
    {1, 1, 1, 1, 1, 0, 0, 0},\
    {1, 1, 0, 0, 1, 1, 0, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 0, 1, 1, 0},\
    {1, 1, 0, 0, 1, 1, 0, 0},\
    {1, 1, 1, 1, 1, 0, 0, 0},\
}
 
#define U { \
    {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, 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, 1, 1, 1, 0, 0}  \
} 
 
#define I { \
    {0, 0, 1, 1, 1, 1, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
    {0, 0, 1, 1, 1, 1, 0, 0},\
}

#define N { \
    {0, 1, 0, 0, 0, 0, 1, 0},\
    {0, 1, 1, 0, 0, 0, 1, 0},\
    {0, 1, 0, 1, 0, 0, 1, 0},\
    {0, 1, 0, 1, 0, 0, 1, 0},\
    {0, 1, 0, 0, 1, 0, 1, 0},\
    {0, 1, 0, 0, 1, 0, 1, 0},\
    {0, 1, 0, 0, 0, 1, 1, 0},\
    {0, 1, 0, 0, 0, 0, 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}  \
} 
 
#define HEART { \
    {0, 0, 1, 0, 0, 1, 0, 0},\
    {0, 1, 0, 1, 1, 0, 1, 0},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {1, 0, 0, 0, 0, 0, 0, 1},\
    {0, 1, 0, 0, 0, 0, 1, 0},\
    {0, 0, 1, 0, 0, 1, 0, 0},\
    {0, 0, 0, 1, 1, 0, 0, 0},\
}

int tact = A5;      // 택트 스위치 a%에 연결
byte col = 0;       // COL을 0으로 초기화
byte leds[8][8];    // 현재 출력해야 할 LED 모양 업로드하는 배열

// 맨 처음 PINS[0]은 사용하지 않기때문에 -1로 설정. 1~16번까지의 핀을 PIN에 연결
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};

// 행 0~7번까지 핀 연결해 주기
int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[6], pins[11], pins[15], pins[16]};

// 열 0~ 7번까지 핀 연결해 주기
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};

const int numPatterns = 7;      // 총 사용할 패턴 수
byte patterns[numPatterns][8][8] = { E, D, U, I, N, O, HEART };   // 위에서 정의한 led 모양을 patterns에 입력해 주기

int pattern = 0;          

void setup() {
  // 1~16번 까지의 핀을 출력으로 설정
  for (int i = 1; i <= 16; i++) {
    pinMode(pins[i], OUTPUT);
  }

  // 행 0~7번까지를 high로 
  for (int i = 0; i < 8; i++) {
    digitalWrite(cols[i], HIGH );
  }
  // 열 0~7번 까지를 low로
  for (int i = 0; i < 8; i++) {
    digitalWrite(rows[i], HIGH);
  }

  clearLeds();   // led 초기화
  
  FrequencyTimer2::setOnOverflow(display);  // leds를 보여주기 위해서 setOnOverFlow를 사용

  pinMode(tact, INPUT); // SW 를 설정, 아두이노 풀업저항 사용
  
  setPattern(pattern);      
}

void loop() {
    int readTact = digitalRead(tact);

    if(readTact == HIGH){     // 택트 스위치가 high일때 
      if(pattern == 6) pattern = 0;   //패턴의 끝(heart)까지 다 출력하고 다시 처음 E 출력
      else pattern++;                // 다음 패턴 출력을 위해 pattern ++
     // delay(300);                 // 길게 눌러 패턴이 순식간에 넘거가지 않기 위해서 딜레이를 줌
    }    
       setPattern(pattern);           // 패턴 출력
}

void clearLeds() {  // led 다 초기화
  for (int i = 0; i < 8; i++) 
    for (int j = 0; j < 8; j++) 
      leds[i][j] = 0;  
}

void setPattern(int pattern) {        // LED 배열에 PATTREN 입력하기
  for (int i = 0; i < 8; i++) 
    for (int j = 0; j < 8; j++) 
      leds[i][j] = patterns[pattern][i][j];   
}

// Interrupt routine
void display() {
  digitalWrite(cols[col], HIGH);  // 이전 행들 다 꺼지게끔 해주기.
  col++;
  if (col == 8) {
    col = 0;
  }
  for (int row = 0; row <= 7; row++) {
    if (leds[col][7 - row] == 1) {        // 위의 배열에서 1일때 해당되는 위치 불빛 켜주기
      digitalWrite(rows[row], HIGH);
    }
    else {                          // 위 배열에서 0일때 해당되는 위치 불빛 꺼주기
      digitalWrite(rows[row], LOW);
    }
  }
  digitalWrite(cols[col], LOW);     // 다음 패턴을 위해 led 다 꺼주기
}
반응형