언제 어디서나 전원을 껐다켜도 현재 시간을 알 수 있는 RTC 모듈을 알아본다
▶ 이 가이드를 따라하면
- RTC breakout(DS1307 or DS3231칩 탑재)모듈로부터 시간을 얻을 수 있다.
▶ 먼저 읽으면 좋은 글
- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1
▶ 부품 설명 및 회로 구성
DS1307이나 DS3231(DS1307보다 온도영향을 덜 받아 10배 정확하다고 한다. 일년 5분 미만 오차) 칩을 탑재한 RTC breakout 모듈($2)은 수은전지에 기반에 시간을 저장 및 계산하고 있다가 필요할 때, I2C 통신을 통해 전달할 수 있는 모듈이다. 늘 정확한 시간을 파악하고 싶을 때 사용한다. 여기서는 ZS-042라는 중국산 보드를 사용했다. 다만, 보드 이름은 상관없고 DS1307이나 DS3231 칩을 사용하고 I2C통신을 지원하면(SCL,SDA 핀 존재) 기능은 유사하다.
<DS3231 RTC breakout연결 모습>
<DS3231 RTC모듈이다. SCL/SDA를 UNO의 SCL/SDA에 연결하고 VCC/GND는 5V/GND에 연결>
DS3132/DS1307 RTC 모듈은 https://github.com/adafruit/RTClib 을 활용해 사용할 수 있다.
▶ 라이브러리 설치
먼저 아래 라이브러리를 설치한다.
https://github.com/adafruit/RTClib
▶ 소스 코드 입력 및 구동
소스코드는 간단히 https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code 를 참조한다.
------------------------------------------------------------------------------------------------------------
// 발췌 https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since 1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
}
------------------------------------------------------------------------------------------------------------
소스를 upload 버튼을 눌러 실행하고, 시리얼모니터를 띄우면 시간이 출력된다. 단, 수은전지를 맨 처음 연결한 RTC모듈의 경우에는, 초기 시간 셋팅이 필요한데, 상기 소스코드 아래 라인을 주석처리를 풀어 실행하자.
RTC.adjust(DateTime(__DATE__, __TIME__));
이러면 Arduino Sketch가 컴파일시에 시간을 자동으로 삽입해서 컴파일해주므로(__DATE__, __TIME__자리), 코드가 실행되자마자 RTC 모듈의 현재 시간을 셋팅한다. 한번만 이렇게 해주면 수은전지가 살아있는 한 시간이 지속 저장/유지된다.
▶ 구매 가이드
DS1307, DS3231 두가지 모두 비슷하나 DS1307의 오차도 월 5분 미만이므로 비교적 정확한 편이다. 미리 납땜이 되어 있는 것을 사면 더 편하다.
▶ 강의 키워드
DS1307, DS3231, Arduino RTC breakout, RCTlib, 아두이노 시계, Arduino clock
'아두이노 기타모듈' 카테고리의 다른 글
[기타/로직레벨컨버터] 3.3V to 5V logic level converter를 이해하자 (0) | 2020.07.14 |
---|---|
[복합/TM1638] TM1638 8 digits, 8 LEDs (7 segments), 8 keys 세트 (1) | 2015.12.13 |
[메모리/SD카드쉴드] Arduino에 저장장치가 필요한가요?SD Card Shield를 써보세요. (0) | 2015.11.01 |
[기타/케이스] Arduino UNO/Mega, 라즈베리파이 플라스틱 케이스를 씌워보자 (2) | 2015.10.14 |
[에디슨/USB드라이브] 에디슨의 USB drive(storage)를 자체에서 마운트해서 사용하기 (0) | 2015.09.12 |
[기타/레이저] 아두이노로 레이저를 쏴보자. TTL 레이저 모듈! (0) | 2015.06.22 |
[쉴드/종합] DFRobot blunoAccessory 쉴드로 OLED+DHT11+LED+Joystick 등을 종합 사용 (0) | 2015.06.03 |