아두이노 코딩 : DS1302 RTC 시간 기록하고 불러오기
Lucy Archive
Lucy 2023
2020. 8. 7. 01:12

Arduino DS1302 RTCArduino DS1302 RTC

Arduino Uno DS1302 RTC 시간 기록하고, 시리얼 포트로 시간 출력하기

아두이노로 현재 시간을 활용한 어플리케이션이 필요한 경우 RTC를 사용 할 수 있습니다. 본 포스트에서는

DS1302 Module 에 아두이노 우노를 연결하여 시간을 저장하고 읽어오는 예제

를 소개합니다.

RTC

현재 시간을 측정하기 위해, 아두이노 내부에는 타이머가 있어 시간을 카운트 할 수 있지만, 전원이 꺼지는 경우 저장한 시간을 잊어버리는 문제가 있습니다. 이 때 사용 가능한 것이 RTC입니다. RTC는 Real Time Clock의 약자로 현재의 시간을 유지시키는 장치입니다. RTC는 소비 전력이 낮고, 시간 정확도가 높아, RTC 장치에 별도의 베터리를 연결하여 시간을 유지하도록 시스템을 구성합니다. 

DS1302 Module

DS1302 모듈은 아래 그림과 같이 32.768 kHz 크리스탈, 3V 리튬전지 및 DS1302 IC 로 구성되어 있으며, 외부 핀의 VCC 핀에 전원이 차단되어도 리튬 전지로 대기 전력을 사용하여 시간 유지가 가능합니다.

Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • DS1302 Module x 1EA
  • Jumper Wires

회로도 및 연결

아두이노 우노 DS1302 연결 회로도아두이노 우노 DS1302 연결 회로도

DS1302를 사용하기 위해 아두이노 우노의 D2, D3, D4 핀을 각각 DS1302의 RST, DAT, CLK 핀에 연결하였습니다. DS1302에 연결되는 CLK, DAT, RST 핀은 다른 핀을 사용해도 무방합니다. 

DS1302 

Arduino Uno

VCC

5V

GND

GND

CLK

D4

DAT

D3

RST

D2


DS1302 라이브러리 추가

DS1302 라이브러리를 추가하기 위해 아래 그림과 같은 순서로 아두이노 라이브러리 매니저에서 DS1302 라이브러리를 검색하여 설치 합니다. 

DS1302 라이브러리 설치DS1302 라이브러리 설치

본 예제에서는 RTCLib by NeoioN 라이브러리를 사용하였습니다. 다른 라이브러리를 사용하셔도 되지만, 코드 사용법에 차이가 있을 수 있습니다.

예제1 : DS1302 에 시간 저장

코드

DS1302 모듈에 시간을 기록 하는 코드 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <DS1302.h>
 
/* 자신의 보드에 맞게 숫자를 수정 */
#define SCK_PIN 4 // 보드의 CLK 핀 입력
#define IO_PIN 3 // 보드의 DAT 핀 입력
#define RESET_PIN 2 // RST 핀 입력
 
// DS1302 클래스 생성
DS1302 myDS1302(RESET_PIN, IO_PIN, SCK_PIN);
 
void setup() {
    // halt(false) DS1302 동작 시작
    // halt(true) DS1302 대기 모드로 동작
    myDS1302.halt(false);
    // writeProject(false) 데이터 쓰기 동작
    // writeProject(true) 데이터 쓰기 금지
    myDS1302.writeProtect(false);
    myDS1302.setDOW(THURSDAY); //요일 기록 : MONDAY ~ SUNDAY
    myDS1302.setDate(6,8,2020); // 날짜 기록 : dd/mm/yyyy 
    myDS1302.setTime(23,30,00); // 시간 기록 : hh/mm/ss (※ 24시간 단위)
}
 
void loop() {
}
cs

코드 설명

  • 4~6줄 : 본 예제의 회로도와 DS1302를 다르게 연결 한 경우 선언문에서 핀 매칭 수정이 가능합니다.
  • 9줄 : DS1302 클래스 객체를 생성합니다.
  • 14줄 : myDS1302.halt(false) DS1302의 클럭을 활성화합니다. 
  • 17줄 : myDS1302.writeProtect(false) DS1302를 쓰기 가능한 모드로 설정합니다.
  • 18~20줄 : DS102에 요일, 날짜, 시간을 기록합니다.


예제2 : 날짜,시간 불러오기

코드

DS1302에서 날짜와 시간을 불러오는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <DS1302.h>
 
/* 자신의 보드에 맞게 숫자를 수정 */
#define SCK_PIN 4 // 보드의 CLK 핀 입력
#define IO_PIN 3 // 보드의 DAT 핀 입력
#define RESET_PIN 2 // RST 핀 입력
 
// DS1302 클래스 생성
DS1302 myDS1302(RESET_PIN, IO_PIN, SCK_PIN);
 
void setup()
{
    // halt(false) DS1302 동작 시작
    // halt(true) DS1302 대기 모드로 동작
    myDS1302.halt(false);
    // writeProject(false) 데이터 쓰기 동작
    // writeProject(true) 데이터 쓰기 금지
    myDS1302.writeProtect(true);
    Serial.begin(9600);
    while(!Serial){;}
    delay(500);
    Serial.println("Serial Port Connected..");
}
 
void loop()
{
    Serial.print("@Date > ");
    Serial.print(myDS1302.getDOWStr()); //요일 불러오기
    Serial.print(",");
    Serial.println(myDS1302.getDateStr(2,1,'-')); //날짜 불러오기 dd-mm-yyyy 형식
    Serial.print("@Time > ");
    Serial.print(myDS1302.getTimeStr()); // 시간 불러오기 hh:mm:ss 형식
    Serial.println("");
    delay(1000);
}
cs

코드 설명

  • 18줄 : myDS1302.writeProtect(true) -> DS1302 쓰기를 금지 모드로 설정합니다.
  • 28줄 : myDS1302.getDOWStr() -> DS1302 로 부터 요일을 불러 옵니다.
  • 30줄 : myDS1302.getDateStr(2,1,'-') DS1302 로 부터 날짜를 dd-mm-yyyy 형식으로 불러옵니다.
  • 32줄 : myDS1302.getTimeStr() -> DS1302 로 시간을 hh:mm:ss 형식으로 불러옵니다.

실행 결과


마무리

본 예제에서는

DS1302 모듈을 이용하여 RTC 사용 방법

에 대해 알아보았습니다. 질문이나 궁금한점이 있으시면 댓글 부탁드립니다.

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

👉 아두이노 RTC 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기