달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
 
 
부품:
8x8 도트 매트릭스, 220옴 저항 8개
 
회로연결:
+RED핀의 {13,14,15,16,17,18,19,20}의 순서대로 아두이노의 디지털 핀 {2,3,4,5,6,7,8,9}에 연결합니다.
공통음극의 {1,2,3,4,21,22,23,24}의 순서대로 아두이노의 디지털 핀 10,11,12,13,14,15,16,17에 연결합니다.
이때 저항을 공통음극과 아두이노 핀 사이에 하나씩 넣어주고요
도트 매트릭스 1 강의랑 연결이 반대로 되어 있는데, 이것은 코드때문에 이렇게 바뀐거구요. 
앞으로 쓰실 때는 이런식으로 하드웨어를 연결하는 것이 더 좋을 것입니다.​ 
 
코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const int xPin[] = {2,3,4,5,6,7,8,9};
const int yPin[] = {10,11,12,13,14,15,16,17};
byte bigHeart[] = {
  B00000000,
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00011000
};
byte smallHeart[] = {
  B00000000,
  B00000000,
  B00000000,
  B00010100,
  B00111110,
  B00111110,
  B00011100,
  B00001000
};
 
void setup()
{
  for(int i=0; i<8; i++)
  {
    pinMode(xPin[i], OUTPUT);
    digitalWrite(xPin[i], LOW);//off
    pinMode(yPin[i], OUTPUT);
    digitalWrite(yPin[i], HIGH);//off
  }
}
 
void loop()
{
  showAnimation(bigHeart, 580);
  showAnimation(smallHeart, 200);
}
 
void showAnimation(byte* image, int duration)
{
  unsigned long start = millis();
  while(start + duration > millis())
     multiplexing(image);
}
 
void multiplexing(byte* image)
{
  for(int i = 0; i<8; i++)
  {
    digitalWrite(yPin[i], LOW); //on
    for(int j=0; j<8; j++)
    {
      boolean pixel = bitRead(image[i], j);
      digitalWrite(xPin[j], pixel);
      
      delayMicroseconds(300);
      //delay(300);
      
      digitalWrite(xPin[j], LOW); //off
    }
    digitalWrite(yPin[i], HIGH); //Off
  }
}

 

 

코드설명:

앞서 한거랑 비슷 합니다. 다만 이미지가 두개라는 것 뿐이죠.

1. loop()함수

showMatrix(smallHeart, 580)은  

smallHeart이미지를 580밀리초 동안 띄운다는 것 입니다. 

이렇게 showMatrix(smallHeart, 580)과 showMatrix(bigHeart, 200)이  

계속 무한 반복되는 것입니다.

 

2. showMatrix()함수

먼저 입력된 duration 시간동안 이미지를 나타내기 위해서 while문을 쓰고 있는데요~

괄호안에 조건을 보면 start + duration > millis() 라고 되어 있습니다.

millis()함수는 프로그램을 시작한 이후 경과한 시간을 밀리초 단위로 반환합니다.

그래서 loop()함수에서 showMatrix()함수를 시작한지 duration동안의 시간이 지나면 while문의 조건이 거짓이 되어

while문의 실행문장인 multiplexing()함수를 더 이상 반복하지 않고 마치는 것이죠.

따라서 showMatrix()함수는 입력된 시간동안에 입력된 이미지를 반복하는 함수입니다.

3. multiplexing()함수

multipexing()함수를 보면 두개의 for문이 있습니다.

for문의 조건들을 보면 0에서 8로 증가하면서 각각의 매트릭스 위치의 LED를 켜는데,

이 함수는 앞서 도트 매트릭스 1의 multiplexing()함수 같습니다.

함수내부에 있는 bitRead()함수는 8비트 변수에 접근해서 각 비트를 읽습니다. 

bigHeart배열과 smallHeart배열이 있는데, bigHeart[]에서 제일 처음의 원소는 8개 중에 맨위에있는 B00000000입니다.

그리고 1바이트(8비트) 값에서 제일 처음의 비트위치는 가장 오른쪽에 있는 값입니다.

이러한 비트값을 읽는 함수가 bitRead()입니다


:
Posted by youjin.A