본문 바로가기
아두이노 기타모듈

[기타/RTC breakout] 실시간 시간을 알려주는 RTC breakout(DS1307 혹은 DS3231)

by 작동미학 2015. 4. 18.
반응형

언제 어디서나 전원을 껐다켜도 현재 시간을 알 수 있는 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 모듈의 현재 시간을 셋팅한다. 한번만 이렇게 해주면 수은전지가 살아있는 한 시간이 지속 저장/유지된다.

 

▶ 구매 가이드

RTC breakout : http://www.aliexpress.com/premium/arduino-RTC.html?ltype=wholesale&SearchText=arduino+RTC&d=y&origin=y&initiative_id=SB_20150417064154&isViewCP=y&catId=0

DS1307, DS3231 두가지 모두 비슷하나 DS1307의 오차도 월 5분 미만이므로 비교적 정확한 편이다. 미리 납땜이 되어 있는 것을 사면 더 편하다.

 

강의 키워드

DS1307, DS3231, Arduino RTC breakout, RCTlib, 아두이노 시계, Arduino clock

 

반응형