프로그래밍 / C++ / 언리얼

Programming/Arduino

[Arduino] 아두이노 DS1302 RTC 모듈 활용하기

아트성 2020. 7. 26. 14:21

 

 

 

 

 

   DS1302 RTC모듈의 개요

 

DS1302 RTC모듈

DS1302 RTC 모듈은 내부 클럭 과 오래 지속되는 배터리를 사용하여 실시간으로 시간을 출력하는 장치이다.  RealTimeClock을 줄여서 흔히 RTC라고 부르는데,  이 장치는 각종 전자기기의 시간이나 타이머기능이 있는 모든제품에 사용된다. (왠만하면 디지털시계에는 꼭 탑재되는게 RTC모듈이다)

 

이 모듈에는 5V 핀이있는 초소형보드에 3V 리튬 이온 배터리, 32kHz 크리스탈 모듈 및 DS1302 칩이 함께 들어있다.  DS1302칩은 효율적으로 전력을 운용할수있고, 3V배터리는 최대 5년동안 쓸 수 있다.

보드구성도 단순하고 실시간 시간모듈중에서 가장 저렴해서 실시간 시간을 기록해야되는 제품에 널리 쓰이고있다. 

 

 

 

 

 

   예제실습 - RTC모듈 작동확인

 

이번에는 예제를 통해서 RTC모듈이 어떤식으로 작동하는지 한번 알아보도록 하자.

우선 RTC모듈을 사용하기 앞서서 관련된 라이브러리를 설치해주어야한다.

라이브러리 관리를 통해서 설치하는 방법이 있지만, ZIP파일을 이용해서 라이브러리를 추가해보도록 하자.

 

RTC.zip
0.24MB

 

먼저 위에 올려놓은 파일 RTC.zip 를 받아주도록 한다.

 

 

스케치 - 라이브러리 포함하기 - ZIP 라이브러리 추가를 눌러준다.

 

 

그러면 위와같은 창이 뜰텐데, 방금 받은파일을 누르고 열기버튼 눌러준다. 그러면 이제 RTC모듈 라이브러리를 사용할 준비를 끝마쳤다.

 

 

그 다음에 파일 - 예제 - RTC 로들어가서 virtuabotixRTC_version1 예제를 클릭하도록한다. 

 

#include <virtuabotixRTC.h>

virtuabotixRTC myRTC(6, 7, 8);

void setup()  {
  Serial.begin(9600);
  myRTC.setDS1302Time(00, 48, 8, 7, 25, 7, 2020); //초, 분, 시간, 요일, 일, 월, 년 설정
}

void loop()  {
  myRTC.updateTime(); //시간 업데이트
  Serial.print("Current Time : ");
  Serial.print(myRTC.year); //년
  Serial.print(" / ");   
  Serial.print(myRTC.month); //월
  Serial.print(" / ");
  Serial.print(myRTC.dayofmonth); //날짜
  Serial.print(" / ");
  switch (myRTC.dayofweek) { //요일설정, 1-일, 2-월, 3-화, 4-수, 5-목, 6-금, 7-토
    case 1:  
      Serial.print("Sun");
      break;
    case 2:   
      Serial.print("MON");
      break;
    case 3:   
      Serial.print("TUE");
      break;
    case 4:   
      Serial.print("WED");
      break;
    case 5:   
      Serial.print("THU");
      break;
    case 6:     
      Serial.print("FRI");
      break;
    case 7:    
      Serial.print("SAT");
      break;
  }  
  Serial.print(" / ");  
  Serial.print(myRTC.hours); //시간
  Serial.print(":");
  Serial.print(myRTC.minutes); //분
  Serial.print(":");
  Serial.println(myRTC.seconds); //초
  delay(1000);
}

 

예제를 들어가보면 위와 비슷한 코드가 나올텐데, 필요없는 주석을 제거하고 필요한 주석만 남겨둔다. 

여기서 myRTC 함수를 통해서 시간을 업데이트 해줄 수 있고, 초, 분, 시간, 요일, 일, 월, 년을 순차적으로 정의할 수 있다.

요일은 1~7까지 숫자로 표현되는데, switch-case문을 이용해서 문자타입으로 바꿔주도록한다. 

그리고 업로드 할때만다 myRTC.setDS1302Time 함수에 입력된 값이 초기화가 되는데, 사용자가 현재시간기준으로 꼭 정확하게 설정해 주어야한다.

 

 

RTC모듈의 회로구성은 위와같다.  RST - 디지털8, DAT - 디지털7, CLK - 디지털6, GND - GND, VCC-5V 순차적으로 연결시켜주면된다. 데이터를 주고받는건 6,7,8번 핀이다.

 

 

 

컴파일을 모두 끝마치면, 위와같이 시리얼모니터를 통해서 시간이 실시간으로 출력이 되는것을 확인할 수 있다. 

시간을 5초단위로 업데이트 하고 싶으면, 코드 맨아래 delay값을 1000에서 5000으로 바꿔주면 된다.

1초는 1000(ms)이다.

 

 

   예제실습 - LCD를 이용해서 전자시계 만들기

 

이번에는 LCD를 이용해서 RTC 데이터값을 출력해보자. 우리가 시리얼 모니터를 매번 확인하는것은 번거로우므로 건전지를 활용해서 USB케이블을 분리한 상태에서도 RTC모듈이 작동하도록 한번 설계해보자.

 

RTC-LCD 회로연결과 실제 연결한 사진

 

회로구성은 위와같다. RTC모듈 회로는 앞전 설명에서 이야기 했듯이 구성하면되고, LCD는 VCC-Vin, GND는 알맞게 연결하고, SDA - 아날로그4번, SCL - 아날로그5번에다가 연결해주면 된다.

 

#include <virtuabotixRTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

virtuabotixRTC myRTC(6, 7, 8);
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()  {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  myRTC.setDS1302Time(00, 48, 8, 7, 25, 7, 2020);
}

void loop()  {
  myRTC.updateTime();
  lcd.setCursor(1,0);
  lcd.print(myRTC.year);
  lcd.print("/");
  lcd.print(myRTC.month);
  lcd.print("/");
  lcd.print(myRTC.dayofmonth); 
  lcd.print("/");
  switch (myRTC.dayofweek) {
    case 1: 
      lcd.print("Sun");
      break;
    case 2: 
      Serial.print("MON");
      break;
    case 3: 
      lcd.print("TUE");
      break;
    case 4:   
      lcd.print("WED");
      break;
    case 5:  
      lcd.print("THU");
      break;
    case 6:   
      lcd.print("FRI");
      break;
    case 7:    
      lcd.print("SAT");
      break;
  }     
  lcd.setCursor(5,1);
  lcd.print(myRTC.hours);
  lcd.print(":");
  lcd.print(myRTC.minutes);
  lcd.print(":");
  lcd.print(myRTC.seconds);

  delay(1000);
  lcd.clear();
}

 

아까 코드와는 비슷하지만 ,LCD라이브러리를 추가해서 Serial 값을 lcd값으로 바꾸었다.(Serial.print → lcd.print)

LCD라이브러리는 liLiquidCrystal_I2C를 통해서 클래스를 RTC예제에 연결시켰다. LCD에 관한 자세한 설명은 아래 링크를 들어가면 자세하게 나와있다. 

 

여기서 중요한것은 LCD상에서 줄을 바꿔주지 않으면 글자가 깨져서 나온다. LCD상에서 한줄에 글자를 모두 표기하는데 한계가 있기때문에,  setCursor를 이용해서 줄을 바꿔주도록 한다.

필자는 첫줄에는 년도,월,날짜,요일을 적어두었고, 두번째 줄에는 시간,분,초를 출력하도록 하였다.

 

컴파일을 모두 끝내고 건전지를 연결하게되면 위와같이 LCD상에 시간이 표시되는것을 확인할 수 있다. 

3D모델링을 이용해서 LCD가 들어갈 자리를 만들어주고 케이스를 제작해서 각자 다양한 전자시계를 만들어 보도록 하자!

반응형