/* RTC clock with lcd and setbuttons. Date and time are displayed by ISO 8601 rules https://www.robkalmeijer.nl/wetenschap/astronomie/tijd/index.html Rob Kalmeijer */ #include #include #include #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 #define btnUNKNOWN 6 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); DS3231 rtc; RTCDateTime dt; char daysOfTheWeek[8][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; // Sunday is 0 en 7 int readkeypad(){ int adc_key_in = analogRead(0); int ret = btnUNKNOWN; if (adc_key_in < 50) ret = btnRIGHT; if ((adc_key_in > 120) && (adc_key_in < 150)) ret = btnUP; if ((adc_key_in > 250) && (adc_key_in < 350)) ret = btnDOWN; if ((adc_key_in > 450) && (adc_key_in < 500)) ret = btnLEFT; if ((adc_key_in > 700) && (adc_key_in < 750)) ret = btnSELECT; if ((adc_key_in > 850) && (adc_key_in < 1150)) ret = btnNONE; return ret; } void(* resetFunc) (void) = 0; //declare reset function at address 0 int setValue(int a) { while(readkeypad() != btnSELECT) { if (readkeypad() == btnUP) { a++; lcd.setCursor(0,1); lcd.print(a); delay(500); } if (readkeypad() == btnDOWN) { a--; lcd.setCursor(0,1); lcd.print(a); delay(500); } } return a; } void setClock() { int year, month, day, hour, minute,second; lcd.clear(); lcd.setCursor(0,0); lcd.print("Set RTC"); dt = rtc.getDateTime(); year = dt.year; month = dt.month; day = dt.day; hour = dt.hour; minute = dt.minute; second = dt.second; delay(1500); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set year"); lcd.setCursor(0,1); lcd.print(year); delay(500); year = setValue(year); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set month"); lcd.setCursor(0,1); lcd.print(month); delay(500); month = setValue(month); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set day"); lcd.setCursor(0,1); lcd.print(day); delay(500); day = setValue(day); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set hour"); lcd.setCursor(0,1); lcd.print(hour); delay(500); hour = setValue(hour); lcd.clear(); lcd.setCursor(0,0); lcd.print("Set minute"); lcd.setCursor(0,1); lcd.print(minute); delay(500); minute = setValue(minute); lcd.clear(); lcd.setCursor(0,0); lcd.print("Reset second"); lcd.setCursor(0,1); lcd.print(second); delay(500); while(readkeypad() != btnSELECT) { if (readkeypad() == btnUP || readkeypad() == btnDOWN) { second = 0; lcd.setCursor(0,1); lcd.print("00"); delay(500); } } // Manual (YYYY, MM, DD, HH, II, SS) rtc.setDateTime(year, month, day, hour, minute, second); delay(1500); resetFunc(); //call reset } void setup() { Wire.begin(); lcd.begin(16, 2); rtc.begin(); if (readkeypad() == btnSELECT) { setClock(); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Real Time Clock"); lcd.setCursor(0,1); delay(3000); lcd.clear(); } void loop() { dt = rtc.getDateTime(); lcd.setCursor(0,0); lcd.print(rtc.dateFormat("Y-m-d", dt)); lcd.setCursor(13,0); lcd.print(daysOfTheWeek[(dt.dayOfWeek)]); lcd.setCursor(0,1); lcd.print(rtc.dateFormat("H:i:s", dt)); }