DS1302와 TM1637 이용
이제 TM1637(4자리 7 segment LED 디스플레이)을 추가하여 실제 디지털시계와 흡사한 작품을 완성하여 보자.
32편에서 만들었던 회로에 LED 패널을 추가하려면, 앞서 사용한 것처럼 핀 4개를 아두이노와 연결하여야 한다.
VCC-5V
GND-GND
CLK- pin2
DIO-pin3
이렇게 연결을 추가하여 본 사진은 아래와 같다.
시간과 분이 콜론(:) 좌우로 보이고 중간의 콜론 표시는 1초를 주기로 반짝거리게 된다.
화면과 같이 시간을 표시하는 코드를 앞의 코드에 추가해 보자.
추가된 내용만 설명해 보면...
Line 1의 #include <TM1637 Display.h>는 TM1637을 이용하기 위한 라이브러리로 앞선 강좌에서 이미 설치한 것이다.
Line 5~7도 이미 설명한 내용이다. CLK와 DIO를 연결할 핀을 정의한 것이다.
아래의 const int와 #define으로 정의된 내용을 비교해 보시라.
Line 15~26과 같이 요일에 관련된 모든 사항은 LED 표시와는 상관없지만, Serial Monitor에서 보여주기 위한 코드라고 생각하시면 된다.
Line 37의 displayData(t.hr, t.min, t.sec); 은 새로 정의된 displayData 함수를 부르는 부분이다.
이때 디지털시계에서 꼭 필요한 시간, 분, 초 이렇게 세 가지 데이터만을 전달한다.
Line 41~48까지의 displayData는 TM1637 LED에 시간을 표시하는 함수이다.
void displayData(int h, int m, int s)
{
int data=h*100+m;
// 가운데 콜론 사용
display.showNumberDecEx(data, (s%2? 0x00:0x40), true);
}
시간에 100을 곱하여 자릿수를 좌측 2자리로 옮기고 여기에 분을 추가하여 4자리 시각을 표시하는 부분은 지금까지 따라온 독자라면 아마 이해하실 것이다.
여기서 콜론을 표시하기 위한 아주 간단한 노력 하나가 있다.
C 프로그램뿐 아니라 많은 프로그래밍 언어에서
s%2?0x00:0x40와 같은 형식으로 참 또는 거짓의 경우를 따지는 명령을 정의할 수 있는데,
위의 경우 s를 2로 나누어 그 나머지가 1이면 0x00, 0이면 0x40을 반환하라는 명령이다.
C 언어에서는 1은 true, 0은 false로 사용되기도 하는데, 이를 기반으로 이렇게 간단한 명령을 넣을 수 있다.
어찌 되었건 display.showNumberDecEx의 두 번째 파라미터가 0x40일 경우 콜론이 보이고, 0x00일 경우 콜론이 보이지 않게 되므로 반짝거리는 결과를 나타낼 수 있다.
Line 56~59까지의 코드는 앞 서 말한 것과 같이 시간을 다시 세팅하는 명령이므로 시간이 이미 맞춰진 이후에는 코멘트 처리하여 원하지 않는 시간으로 세팅되는 것을 막아야 한다.