[아두이노] RTC 모듈 사용하기


안녕하세요 대짜이찐입니다.
이번시간에는 RTC 모듈을 아두이노로 제어해 보겠습니다.




RTC(Real Time Clock)란 이름 그대로  실시간 시계를 뜻합니다.
아두이노가 전원이 꺼졌을 때도 내부에 있는 코인 배터리를 통해서,
시간을 계산하여 실시간으로 시간을 저장 할 수 있는 모듈입니다.

DS1302칩을 사용한 RTC 모듈을 사용하기 위해서는 DS1302라이브러리가 필요합니다.


https://github.com/msparks/arduino-ds1302

Clone or download 버튼을 눌러 DS1302라이브러리를 다운로드해주세요.

아래 예제는 RTC 모듈을 사용하여, 날짜 시간을 저장하는 코드입니다.


준비물 :  아두이노 우노, 점퍼선, RTC 모듈 (DS1302)

아두이노
RTC 모듈
비고
5V
VCC
VCC
GND
GND
Ground
D5
CLOCK
Serial Clock
D6
DATA
Serial Data
D7
RST
Chip Enable

/*
RTC(DS1302) 모듈
<DS1302.h>라이브러리가 필요. 아래링크에서 다운로드
https://github.com/msparks/arduino-ds1302

www.devicemart.co.kr

*/

#include <DS1302.h>

// RTC 모듈과 아두이노의 연결
const int RST   = 7;   // RESET(RST)핀 (Chip Enable)
const int DATA   = 6;   // DATA핀 (I/O)
const int CLOCK = 5;   // Clock 핀 (Serial Clock)

//  DS1302 객체 생성
DS1302 rtc(RST, DATA, CLOCK);

// 일요일~토요일까지 알맞는 문자열 반환
String dayAsString(const Time::Day day)
{
 switch (day)
 {
   case Time::kSunday: return "Sun";
   case Time::kMonday: return "Mon";
   case Time::kTuesday: return "Tue";
   case Time::kWednesday: return "Wed";
   case Time::kThursday: return "Thu";
   case Time::kFriday: return "Fri";
   case Time::kSaturday: return "Sat";
 }
 return "(unknown day)";
}

void printTime() // 날짜 출력 함수
{
// 칩에서 현재 시간과 날짜를 가져옴
Time t = rtc.time();

// 요일 코드에 알맞는 문자열 가져옴
const String day = dayAsString(t.day);

// 날짜와 시간 정보를 형식화하고 임시 버퍼에 형식 넣음
char buf[50];
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d  %s",
         t.yr, t.mon, t.date,
         t.hr, t.min, t.sec,
         day.c_str());
        
// 시간을 볼 수 있도록 형식화된 문자열을 출력
Serial.println(buf);
}

void setup()
{
 Serial.begin(9600);

 /* 아래 1~4번의 작업은 처음 날짜를 세팅하고 업로드 한후,
    주석 처리하여 다시 업로드 해야 합니다.
    그렇지 않으면 아두이노가 off->on 될 때 마다 시간을 초기화 합니다.*/

 /*1. 쓰기 방지 기능을 끈다.*/
 //rtc.writeProtect(false);

 /*2. 동작 모드로 설정 */
 //rtc.halt(false);

 /*3. 새로운 시간과 날짜를 세팅
        2019년, 1월, 12일, 01시, 25분, 00초, 월요일*/
 //Time t(2019, 1, 12, 01, 25, 00, Time::kMonday);

 /*4. 칩에 시간과 날짜를 설정*/
 //rtc.time(t);
}

void loop()
{
 printTime(); //날짜와 시간을 출력
 delay(1000); // 1초 딜레이
}


소스 코드에서 처음시간을 세팅해줄 때는

/* 아래 1~4번의 작업은 처음 날짜를 세팅하고 업로드 한후,
    주석 처리하여 다시 업로드 해야 합니다.
    그렇지 않으면 아두이노가 off->on 될 때 마다 시간을 초기화 합니다.*/

 /*1. 쓰기 방지 기능을 끈다.*/
 rtc.writeProtect(false);

 /*2. 동작 모드로 설정 */
 rtc.halt(false);

 /*3. 새로운 시간과 날짜를 세팅
        2019년, 1월, 12일, 01시, 25분, 00초, 월요일*/
 Time t(2019, 1, 12, 01, 25, 00, Time::kMonday);

 /*4. 칩에 시간과 날짜를 설정*/
 rtc.time(t);

해당부분의 주석(//)을 제거하고, 업로드 합니다.

/* 아래 1~4번의 작업은 처음 날짜를 세팅하고 업로드 한후,
    주석 처리하여 다시 업로드 해야 합니다.
    그렇지 않으면 아두이노가 off->on 될 때 마다 시간을 초기화 합니다.*/

 /*1. 쓰기 방지 기능을 끈다.*/
 //rtc.writeProtect(false);

 /*2. 동작 모드로 설정 */
 //rtc.halt(false);

 /*3. 새로운 시간과 날짜를 세팅
        2019년, 1월, 12일, 01시, 25분, 00초, 월요일*/
 //Time t(2019, 1, 12, 01, 25, 00, Time::kMonday);

 /*4. 칩에 시간과 날짜를 설정*/
 //rtc.time(t);

그 후 주석 처리하고 다시 업로드합니다. 

이유는 주석에서도 설명했듯이 시간을 세팅한 코드를 주석 처리를 하지 않게 되면,
아두이노가 켜질 때마다 세팅한 시간대로 다시 초기화를 시키기 때문입니다. 
시간을 맞춰줄 때만 주석을 풀고 업로드를 해주면 됩니다.

아래링크에서 제품을 구매하실 수 있습니다.
감사합니다.



댓글 쓰기

0 댓글