반응형

【 아두이노모듈#9】 TM1637 & DS1307 리얼타임 시계 만들기


 지난시간 RTC 모듈의 기본사용법에 대해 학습해보았다. 이번 시간에는 이 RTC 모듈의 기록된 시간을 동기화 하여 시계회로의 전원이 차단 되더라도 흘러가는 시간이 유지되는 시계회로를 완성해 보고자 한다. 



▶ 선수 학습 :

   1. [아두이노 모듈#8] DS1307 리얼타임클럭 모듈 ☜ (클릭)

   2. [아두이노 모듈#9] TM1637(시:분) 시계 만들기 ☜ (클릭)


▶ DS1307 세부 스팩 


※ .라이브러리 다운로드

 - DS1307RTC:https://github.com/PaulStoffregen/DS1307RTC

 - RTClib : https://github.com/adafruit/RTClib  


  RTC(리얼 타임 클럭) 모듈은 DS1307과 DS3231 두 종류가 많이 사용된다. 두 모듈의 차이는 DS3231 모듈의 오차가 1년에 수분 정도로 조금 더 정밀도가 높아 진 것인데, DS1307을 사용해도 큰 오차가 나는 것이 아니기에 걱정말고 사용해보자. 
(DS1307 : 한 달 약 5분 미만,  DS3231 : 1년 약 5분 미만 오차)


【 RTC 모듈 시계의 구동원리 】 

: 시계를 만들때 현재의 시간을 맞추어 주어야 하는데, RTC를 가지고 PC와의 시간을 동기화 시키면,그 시간이 RTC모듈의 메모리에 저장되며, 모듈에 있는 베터리로 인해 시계회로에 공급되는 전원이 차단 되어도 메모리에 저장된 기준시간은 유지된되게 된다.  시계회로에서는 이 RTC 모듈에서 보통 1초마다 현재 시간값을 가지고와서 출력(사용)하게 된다. 



▶ 실습 목표 :  

  1. [ RTC 모듈에 대해 이해할 수 있다. 

 2. [ PC의 현재 시간을 RTC모듈에 동기화 시킬 수 있다.]

 3. [ 동기화된 시간을 아두이노 IDE의 시리얼 모니터 창을 통해 출력할 수 있다. ]

 4. [ TM1637 모듈에 14:49 (시 : 분) 형태로 출력해 볼 수 있다. ]

 5. [ 전원이 차단 되어도 시간이 유지되는 것을 확인 할 수 있다 ]

 


▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 실습 절차  : 


1.   필요한 라이브러리 등을 '라이브러리 매니저'등을 통해서 설치한다. ( <RTClib.h> , <Wire.h>  )

2.   i2c 통신을 이용하는 모듈이기 때문에 <Wire.h> 라이브러리가 필요하며, 비교적 연결이 간단하고 쉽다. 


3. RTC의 메모리에 현재시간 값을 기록 하기 위해, Set Time 코드를 실행시킨다.(선수학습의 1번 항목 참고1. [아두이노 모듈#8] )

4. 아래의 코드를 실행시켜 시계프로그램을 완성한다. 


▶ 프로그램 코드 및 설명 : 


/* RTC 모듈에 있는 시간 값을 불러와 TM1637로 출력  */


#include <TM1637Display.h> // FND 시계모듈 라이브러리

#include <RTClib.h>     // RTC 기본 라이브러리

RTC_DS1307 RTC;         // RTC 모듈 객체 생성

#define CLK 8

#define DIO 9

TM1637Display display(CLK, DIO);

int Time, Minute;

char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};      //요일 관련 배열 선언 (생략가능)


void setup ( ) {

Serial.begin(9600);  

  display.setBrightness(7);    // 0~7, 밝기 조절

  Serial.begin(9600);

  RTC.begin();

  if (! RTC.begin()) {     // RTC모듈 연결 확인 루틴

    Serial.println("Couldn't find RTC");

    while (1);

  }

  if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

  }

}


void loop ( )  {

  DateTime now=RTC.now(); // RTC에 저장된 값을 불러옴

  Serial.print(now.year(), DEC);

  int Time = now.hour();

  int Minute = now.minute();

  

  int digitoneT = Time / 10;

  int digittwoT = Time % 10;

  int digitoneM = Minute / 10;

  int digittwoM = Minute % 10;


   uint8_t data[] = { 0x0, 0x0, 0x0, 0x0};

   uint8_t segto;

   data[0]=display.encodeDigit(digitoneT); 

   data[1]=display.encodeDigit(digittwoT);

   data[2]=display.encodeDigit(digitoneM); 

   data[3]=display.encodeDigit(digittwoM); 


// 시와 분 사이 ' : ' 출력하고 깜빡임

   segto = 0x80 | display.encodeDigit(digittwoT);

   display.setSegments(&segto,1,1);

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이

   display.setSegments(data);     

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이


// 아래는 시리얼 모니터창에 시간출력(생략 가능) 

  Serial.print(now.year(), DEC);

  Serial.print('-');

  Serial.print(now.month(), DEC);

  Serial.print('-');

  Serial.print(now.day(), DEC);

  Serial.print(" (");

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

  Serial.print(") ");

  Serial.print(now.hour(), DEC);

  Serial.print(':');

  Serial.print(now.minute(), DEC);

  Serial.print(':');

  Serial.print(now.second(), DEC);

  Serial.println();

}


▶ 실행영상 :  

(전체화면 보기로 보세요)




▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)


[ 위 시계 프로그램-아두이노- ]

OK_ds1307_4digit_Watch.zip



[ RTC 타이머에 현재시간 셋팅 프로그램-아두이노-   순서상으로 이걸 먼저하고 바로 위 코드를 다시 업로드 시켜야 합니다.]

(RTC 타이머에 PC로 부터 동기된 현지 시간을 셋팅해주는 프로그램입니다.

따라서 현재시간을 RTC모듈에 이프로그램으로 기록하고 나서, 다시 위 프로그램을 업로드 하면, 

수정된 현지시간으로 시계가 돌아가게 됩니다. )

DS1307_SetTime2.zip


[ 만약 <TM1637Display.h> 관련한 에러가 나는 경우  해당 라이브러리가 설치 되지 않았거나 중복 설치, 잘못된 라이브러리 설치 등의 이유입니다.    해당 라이브러리 설치 안내는 선수학습: https://rasino.tistory.com/209  참고하시고,  별도로 라이브러리는 아래 다시 첨부하니 다운받아 설치해서 다시 실행해보세요 ]  


TM1637Display 라이브러리 다운로드 :  (압축풀지말고 라이브러리 메니저 창에서 zip 형태로 추가하기)

TM1637-master.zip


TM1637 Grove 제품의 경우 핀배열이 Catalex 사와 같을 거예요.  하지만, 핀이 달려있는 위치가 다르니, 역시 핀배열을 잘 확인 하셔야 해요.  Grove 사 모듈을 뒤집어 보면 위에서 부터 GND, VCC, DIO, CLK 이런 순으로 되어 있을 거예요.  그럼 연결만 그 핀에 맞추어 제대로 하면 됩니다. 

그리고 제일 중요한 것, DIO핀과 CLK핀을 아두이노에 연결 한 핀 번호랑, 코드에서 적어준 번호와 일치해야 제대로 동작합니다. 


아래 아두이노 코드는 TM1637 Grove사에서 제공하는 테스트 프로그램 이에요.  아래 코드를 다운받아 핀번호 확인후 업로드해서 실행시켜 보세요.

TM1637_Grove.zip


  


반응형