아두이노 시계

DS1302 모듈과 LCD 디스플레이를 조합하여 독자적으로 작동되는 시계를 만들어 보려고 합니다.
시리얼 모니터가 필요 없기 때문에 PC는 개발 과정에서만 필요하며, 프로그래밍이 완료된 후에는 아두이노를 아무 USB 포트에 꽂기만 하면 시계가 작동됩니다.

DS1302 모듈을 사용하였기 때문에 전원이 차단되어도 시계 데이터는 초기화되지 않습니다.
아두이노는 매초마다 DS1302 모듈에서 시간 데이터를 받아온 다음, 해당 데이터를 LCD 모듈에 출력하게 됩니다.

모듈 연결은 아래와 같습니다.
회로가 많이 복잡합니다.

라이브러리 설치

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

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

소스 파일

#include 
#include 

// 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);

// LCD 핀번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// 요일 코드에 알맞는 문자열 출력
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 "";
}
 
// 날짜, 시간 출력
void printTime() {
  // 칩에 저장된 시간을 읽어옵니다. 
  Time t = rtc.time();
 
  // 요일 코드에 알맞는 문자열 가져오기
  const String day = dayAsString(t.day);

  // 날짜 출력
  char buf[20];
  snprintf(buf, sizeof(buf), "%04d-%02d-%02d %s", t.yr, t.mon, t.date, day.c_str());
  lcd.setCursor(1, 0);
  lcd.print(buf);

  // 시간 출력
  snprintf(buf, sizeof(buf), "%02d:%02d:%02d", t.hr, t.min, t.sec);
  lcd.setCursor(3, 1);
  lcd.print(buf);
}

void setup() {
  Serial.begin(9600);
 
  // 새로운 날짜와 시간 정보를 칩에 저장합니다. 
  // 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다.
  // rtc.writeProtect(false);
  // rtc.halt(false);
  // Time t(2017, 6, 17, 14, 49, 00, Time::kSaturday);
  // rtc.time(t);

  // 사용된 LCD의 글자수
  lcd.begin(16, 2);
}

// 1초마다 날짜와 시간을 출력합니다.
void loop() {
  printTime();
  delay(1000);
}

현재 시각이 맞지 않는 경우

  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);

목차