온도 보정이 되지 않아, 수정 진동자의 진동주기가 변해서 시간의 오차가 큼.
시계는 오차가 적은 RTC3231추천
#include <Wire.h> // hd44780 호환 LCD 사용을 위한 라이브러리 불러옴
#include <LiquidCrystal_I2C.h> // i2c lcd 제어 라이브러리
#include <DS1302.h> // DS1302 시계라이브러리를 불러옴
#include <DHT.h> // HDT11 온습도계 라이브러리
#define DHTPIN 7 // 디지털 7번핀 사용
#define DHTTYPE DHT11 // DHT 11 모델사용 (DHT21/22 사용 가능)
LiquidCrystal_I2C lcd(0x27, 16, 2); // 16x2 LCD객체를 생성(I2C 주소는 LCD에 맞게 수정 0x3F, 0x27에서 선택, 안보이면 가변저항조정)
DS1302 rtc(2,3,4); // DS1302선언(RST, DAt, CLK 순으로 지정): DS1302 클레스를 rtc란 이름으로 생성
//----------------------------------------------------------------------------
// 요일 코드에 알맞는 문자열 출력
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(); // DS1302칩에 저장된 시간을 읽어와 t에 저장합니다.
const String day = dayAsString(t.day); // 요일 코드에 알맞는 문자열 가져오기
// 날짜 출력
char buf[20]; //버퍼를 크기20으로 생성
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %s", t.yr, t.mon, t.date, day.c_str()); //년,월,일을 각각 4,2,2자리로표시
lcd.setCursor(1, 0); // LCD에 커서 위치
lcd.print(buf); // 저장된 buf내용을 LCD에 출력
// 시간 출력
snprintf(buf, sizeof(buf), "%02d:%02d:%02d", t.hr, t.min, t.sec); //시간,분,초를 각각 2자리로 표시
lcd.setCursor(3, 1); // LCD에 커서 위치
lcd.print(buf); // 저장된 buf내용을 LCD에 출력
}
//------------------------------------------------------------------------
// 각 센서의 초기값을 지정합니다. 전원이 켜진 후 한번만 실행 됩니다.
void setup() {
Serial.begin(9600); //시리얼모니터 시작
// 새로운 날짜와 시간 정보를 칩에 저장합니다.
// 이 작업은 시간을 맞출때만 사용하며, 평상시에는 주석(//) 처리되어 있어야 합니다.
// rtc.writeProtect(false); //쓰기 금지를 해지
// rtc.halt(false);
// Time t(2024, 5, 4, 19, 43, 00, Time::kSaturday); //년,월,일,시간,분,초,요일
// rtc.time(t);
lcd.begin(16, 2); // 사용된 LCD의 글자수 지정
}
// 무한 반복되는 작업을 정의합니다.
void loop() {
printTime(); // LCD에 위에서 계산한 날짜와 시간을 출력합니다.
delay(1000); // LCD에 표시한 날짜와 시간을 1초간 유지합니다.
}