시리얼 모니터가 필요 없기 때문에 PC는 개발 과정에서만 필요하며, 프로그래밍이 완료된 후에는 아두이노를 아무 USB 포트에 꽂기만 하면 시계가 작동됩니다.
DS1302 모듈을 사용하였기 때문에 전원이 차단되어도 시계 데이터는 초기화되지 않습니다.
아두이노는 매초마다 DS1302 모듈에서 시간 데이터를 받아온 다음, 해당 데이터를 LCD 모듈에 출력하게 됩니다.
모듈 연결은 아래와 같습니다.
회로가 많이 복잡합니다.
라이브러리 설치
DS1302 모듈을 쉽게 제어하기 위한 라이브러리를 추가합니다. (이미 설치된 경우 건너뜁니다.)
- https://github.com/msparks/arduino-ds1302에 접속하여 라이브러리 zip 파일을 다운로드 합니다.
- 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); }
현재 시각이 맞지 않는 경우
- 아래와 같이 소스 파일 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 - 시리얼 모니터를 열어서 시각이 제대로 세팅되었는지 확인합니다.
- 아래와 같이 소스 파일 54 ~ 57 라인을 주석(//) 처리하고 다시 한번 업로드 합니다. (무한 세팅 방지)
// 새로운 날짜와 시간 정보를 칩에 저장합니다. // 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다. // rtc.writeProtect(false); // rtc.halt(false); // Time t(2017, 6, 17, 14, 49, 00, Time::kSaturday); // rtc.time(t);
목차
- 아두이노 고급키트 무작정 따라하기
- 아두이노 8×8 LED Matrix
- 아두이노 Remote Control Test
- 아두이노 Stepper Speed Control
- 아두이노 RFID Reading Test
- 아두이노 LCD Test
- 아두이노 DHT11 온습도 센서 테스트
- 아두이노 3-Color LED Test
- 아두이노 4×4 Keypad Test
- 아두이노 DS1302 Realtime Clock Test
- 아두이노 시계
- 아두이노 초음파 센서 HC-SR04
- 아두이노 초음파 거리측정기
- 아두이노 LCD Test (I2C 모듈 사용)
- 아두이노 초음파 거리측정기 (I2C LCD 사용)
- 아두이노 LM35 온도계 (with Processing)
- 아두이노 미로게임 (MPU-6050 + 프로세싱)