아두이노 DS1302 Realtime Clock Test

DS1302

DS1302 모듈은 실제 시간을 기록해 두었다가 필요시 읽을 수 있도록 해 줍니다.
일반적으로 DS1302 칩 옆에는 항상 배터리가 있는 것을 볼 수 있습니다.
이 배터리는 DS1302 칩이 시간을 계속 카운트 할 수 있도록 전원을 공급해주는 역할을 합니다.
배터리의 수명이 끝났거나 배터리가 모듈에서 분리되는 경우 DS1302 칩에 기록된 시간은 초기화(리셋)되어 버리니 주의 해야 합니다.
그러면, DS1302 모듈에 시간을 기록하고 꺼내보는 작업을 해 보겠습니다.

라이브러리 설치

DS1302 모듈을 쉽게 제어하기 위한 라이브러리를 추가합니다. (이미 설치된 경우 건너뜁니다.)

  1. https://github.com/msparks/arduino-ds1302에 접속하여 라이브러리 zip 파일을 다운로드 합니다.
  2. arduino-ds1302-master.zip 라이브러리 파일을 아두이노에 추가합니다.
    아두이노 > 스케치 > 라이브러리 포함하기 > .ZIP 라이브러리 추가…

DS1302 작동 테스트

  1. 아래와 같이 DS1302 모듈을 연결합니다.
  2. 아두이노 프로그램에 아래 소스를 입력합니다.
    #include <stdio.h>
    #include <DS1302.h>
     
    namespace {
     
    // DS1302와 연결되는 아두이노 핀 번호
    const int kCePin   = 8;   // Chip Enable
    const int kIoPin   = 7;   // Input/Output
    const int kSclkPin = 6;   // Serial Clock
     
    //  DS1302 오브젝트 생성
    DS1302 rtc(kCePin, kIoPin, kSclkPin);
     
    // 요일 코드에 알맞는 문자열 출력
    String dayAsString(const Time::Day day) {
      switch (day) {
        case Time::kSunday: return "Sunday";
        case Time::kMonday: return "Monday";
        case Time::kTuesday: return "Tuesday";
        case Time::kWednesday: return "Wednesday";
        case Time::kThursday: return "Thursday";
        case Time::kFriday: return "Friday";
        case Time::kSaturday: return "Saturday";
      }
      return "(unknown day)";
    }
     
    // 날짜, 시간 출력 함수
    void printTime() {
      // 칩에 저장된 시간을 읽어옵니다. 
      Time t = rtc.time();
     
      // 요일 코드에 알맞는 문자열 가져오기
      const String day = dayAsString(t.day);
     
      // 날짜와 시간 정보를 임시 버퍼에 형식에 맞추어 담아둡니다.
      char buf[50];
      snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
               day.c_str(),
               t.yr, t.mon, t.date,
               t.hr, t.min, t.sec);
     
      // 임시 버퍼의 내용을 출력합니다.
      Serial.println(buf);
    }
     
    }  // namespace
     
    void setup() {
      Serial.begin(9600);
     
      // 새로운 날짜와 시간 정보를 칩에 저장합니다. 
      // 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다.
      // rtc.writeProtect(false);
      // rtc.halt(false);
      // Time t(2017, 6, 17, 14, 49, 00, Time::kSaturday);
      // rtc.time(t);
    }
     
    // 1초마다 날짜와 시간을 출력합니다.
    void loop() {
      printTime();
      delay(1000);
    }
  3. 소스 파일을 아두이노에 업로드 한 다음 시리얼 모니터를 열어보면, 현재 날짜와 시각이 출력되는 것을 볼 수 있습니다.

현재 시각이 맞지 않는 경우

  1. 아래와 같이 소스 파일 54 ~ 57 라인의 주석(//)을 해제하고, 현재 시각을 입력합니다.
      // 새로운 날짜와 시간 정보를 칩에 저장합니다. 
      // 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다.
      rtc.writeProtect(false);
      rtc.halt(false);
      Time t(2017, 6, 17, 14, 49, 00, Time::kSaturday);
      rtc.time(t);

    (년, 월, 일, 시, 분, 초, 요일)
    요일은 다음 중 하나를 입력합니다.
    Time::kSunday
    Time::kMonday
    Time::kTuesday
    Time::kWednesday
    Time::kThursday
    Time::kFriday
    Time::kSaturday

  2. 시리얼 모니터를 열어서 시각이 제대로 세팅되었는지 확인합니다.
  3. 아래와 같이 소스 파일 54 ~ 57 라인을 주석(//) 처리하고 다시 한번 업로드 합니다. (무한 세팅 방지)
      // 새로운 날짜와 시간 정보를 칩에 저장합니다. 
      // 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다.
      // rtc.writeProtect(false);
      // rtc.halt(false);
      // Time t(2017, 6, 17, 14, 49, 00, Time::kSaturday);
      // rtc.time(t);

목차