아두이노와 DS1302 RTC를 이용한 타이머 제작
사무실 이전을 위한 짐 정리를 핑계로 한 달이 넘도록 글을 쓰지 않았다.
꼼지락 거리며 계속 무언가를 만들고는 있었지만 관련된 글을 쓰지 않으면 아무런 기록이 남지 않았다...
더 이상 글을 쓰지 않다가는 다시 깊은 동면을 할 듯하여...
그간 만들었던 것들 중 UV 레진을 이용한 공작용 UV 램프를 사용하는 분께서 요청하여 만들었던 타이머를, 전기를 사용하는 모든 제품에 범용으로 사용할 수 있는 타이머로 구성하여 보고 관련 작업을 설명하려고 한다.
UV 레진을 이용하여 공작을 하시는 분들은 일정 시간 동안 자외선램프를 켜서 액체 레진을 고체로 변경시키는 작업을 반복하는데, 그 시간을 세팅하여 램프를 켜기를 원했다.
이런 작업이야 모든 전기 작업을 하는 경우에 필요한 작업일 듯하여 새롭게 만들어 보았다.
라면 끓이기를 숙련된 감각으로 하지 않고, 타이머를 맞춰 두고 하시는 분들께도 필요할 듯하다.
(이럴 경우를 위하여 분(min.)을 세팅하는 것에 추가하여 30초(sec.) 간격으로 세팅이 가능하게 만들었다.
참고로 신라면 블랙의 끓이기 권고 시간이 4분 30초이더라. )
먼저 기존 글(32. 디지털시계 만들기#1, 33. 디지털시계 만들기#2)을 통하여 디지털시계를 만드는 방법을 숙지하면 제작 방법을 이해하기 쉬울 것이다.
리얼타임 클럭(DS1302)과 LED 디스플레이(TM1637)에 대한 설명은 앞 서 이야기한 글을 참조하시고, 타이머에 대한 개념을 설명하는 것에 집중하겠다.
디지털시계를 가지고 만들 수 있는 타이머의 종류를 생각해 보면,
1. 정해진 시간 후에 꺼지거나 켜지는 기능
2. 정해진 날짜와 시간에 꺼지거나 켜지는 기능
3. 2번의 기능을 정기적으로 수행하는 기능
이번 글에서는 가장 단순한 1번 만을 만들어 보고, 차후에 디지털시계와 타이머를 이용한 다양한 응용 작품을 만들어 보도록 하자.
이에 추가하여 다음과 같이 필요한 조건을 만들어 범용 타이머를 만들어 보자.
1. 원하는 시간을 세팅한다. (1분에서 59분까지만 세팅하면 된다.) 시간은 30초 단위로 세팅할 수 있다.
2. 시간을 세팅하고 시작 버튼을 누르면 전원이 연결되고(ON) 초를 가리키는 신호가 하나씩 줄어들어 0까지 가고 전원이 차단된다.(OFF)
3. 같은 작업을 반복할 수 있으므로 전원이 차단되면 다시 1번에 세팅한 시간으로 돌아간다.
4. 평상시에는 디지털시계로 사용한다.
이를 구현하기 위하여 필요한 부품은 다음과 같다.
1. 아두이노 우노 또는 아두이노 나노 (샘플 제작은 나노로 하였다)
2. DS1302 RTC(리얼타임 클럭)
3. TM1637 LED 디스플레이
4. 릴레이
5. 릴레이와 연결을 하기 위한 전기 콘센트 및 플러그
- 보기에는 220V 가정용 전원을 위한 전구를 직접 연결하 컨텐트와 플러그가 사용되었으나 사용자의 요구에 맞추어 DC용 커넥터와 전원 공급 장치가 사용되어도 된다.
6. LED 램프, 택트 스위치, 연결용 전선, 저항 및 브레드 보드 등등
RTC와 LED 모듈의 구성은 기존 구성과 같고, 릴레이와 버튼을 추가하여 아래와 같이 회로를 구성했다.
다시 한번 핀 연결을 보면,
모든 경우 VCC와 GND는 아두이노의 5V와 GND에 연결하고,
1. DS1302 RTC : CLK-7번 / DAT-6번 / RST-9번
2. TM1637 LED : CLK-2번 / DIO - 3번
3. RELAY와 타이머 켜짐 확인 LED : IN - 8번
4. CLOCK / TIMER 구분을 위한 LED
5. CLOCK 전환 버튼 : 10번
6. TIMER 전환 버튼 : 9번
7. 타이머 + 버튼 : 11번
8. 타이머 - 버튼 : 12번
9. 타이머 세팅 확인 LED : 13번
32, 33번 글을 읽어 본 분들이라면 위의 내용에 대한 설명은 필요 없을 것이다.
단, 전역 변수로 사용된 settimer는 true 값일 경우 타이머 시간을 맞추고 있는 중을 표시하는 것이고, starttimer는 true 일 경우 세팅된 시간으로 타이머가 시작된 것을 표시하는 변수이다.
tmin과 tsec은 타이머에 표시되는 시간 중 분, 초의 값이다.
타이머를 세팅하려고 하면 3:00과 같이 3분을 기본 시간으로 한다.
다섯 개의 함수가 위에 만들어져 있다. 각각의 기능은 아래와 같다.
printTime은 현재의 시간을 타이머에서 읽고 이를 LED 디스플레이에 표시하는 기능을 갖는다.
LED 디스플레이에 표시하는 함수가 displayData이다. h, m은 각각 현재의 시간과 분을 표시하는 기능을 갖고, s는 현재의 초를 표시하는데, 초는 숫자로 표시하는 것이 아니고 중간에 있는 세미콜론을 깜빡이는 기능만을 갖는다.
diplayData를 이용하여 타이머를 세팅하고, 타이머를 카운트 다운하는 경우에는 시와 분을 표시하는 자리에 분과 초를 각각 표시하게 된다.
timer_mode는 현재의 디스플레이가 시간을 표시하는 것이 아니고 타이머를 표시하는 경우 작동되는 함수이다. 아래의 loop 함수에서 9번 택트 스위치가 눌렸을 경우 settimer가 false일 경우에는 이를 true로 변경하고 13번 핀의 led를 켜는 작업을 하고, settimer가 true일 경우에는 starttimer가 false 일 경우 타이머를 작동시킨다. 따라서 9번에 연결된 스위치는 타이머로 전환하는 스위치이고 동시에 타이머를 작동시키는 스위치이기도 하다.
clock_mode는 10번 핀의 스위치가 눌렸을 경우 작동되는 버튼이다. 타이머를 세팅하는 경우였으면 시계 모드로 다시 돌아오게 된다. 그런데 만일 타이머가 작동 중이었으면 시계 모드에서는 타이머의 중단을 하는 시점을 놓치게 되는 에러를 발생시킬 것이다. 일단은 이를 피해 가도록 하고(타이머를 스타트시키고 나서는 타이머가 끝날 때까지 시계 모드로 가지 않으면 된다), 이를 해결하는 방법과 디지털시계에 관련된 추가 기능은 다음 강좌에서 추가할 예정이다.
set_timer는 타이머의 시간을 세팅하는 함수이다. 11번에 연결된 버튼스위치를 누르게 되면 시간이 30초씩 타이머 시간이 증가하고 12번에 연결된 버튼스위치를 누르게 되면 시간이 30초씩 줄어든다.
이 시간은 0초부터 59분 30초까지 변경할 수 있다.
loop 함수에서는
line 103~104는 각 버튼스위치로 타이머와 시계 모드를 전환하는 것을 보여주고,
line 106부터 타이머 모드에서의 작업을 보여준다.
line 107~112 까지는 타이머 시간을 늘리거나 줄이는 것을 보여준다.
타이머 모드가 아닐 경우에는 시계 모드 이므로 line 131의 printTime을 통하여 현재의 시간을 보여준다.
타이머가 1초씩 카운트 다운하는 모습을 보여주는 부분이 line 115~126까지이다. 타이머 시작 시간부터 현재의 시간 사이만큼을 계산하여 이를 displayData로 LED에 보여주는 것이다.
실제로 위의 코드를 실행해 보면 스위치를 오래 누르고 있을 경우나 의도하지 않고 타이머가 작동 중 시계 모드로 변경할 경우 에러가 발생할 수 있다. 이러한 부분을 해결하기 위한 작업은 다음 기회로 넘겨두고 실제로 타이머를 작동시킬 경우의 영상을 아래에 첨부하였다.
처음 영상은 타이머를 시작시키는 모습이고, 두 번째 영상은 타이머가 종료되어 전등이 꺼지는 모습을 보여준다.
타이머로 릴레이를 작동시키고 중단시키는 내용은 앞선 이야기(28. 스위치와 릴레이)를 참조하기 바란다.
디지털시계를 가지고 만들 수 있는 수많은 응용 작품 중 첫 번째 작품이었다. 여기에 더하여 다양한 디지털시계의 기능을 구현해 보도록 하겠다.