#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
const char* week_days[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
char t0[17]="";
char t1[17]="";
byte mode = 0;
int year, month, day;
int hour, minute, second;
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.clear();
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
if (mode > 6) {
rtc.adjust(DateTime(year, month, day, hour, minute, second));
mode = 0;
}
else if (mode == 0) {
year = now.year();
month = now.month();
day = now.day();
hour = now.hour();
minute = now.minute();
second = now.second();
sprintf(t0, "%04d-%02d-%02d %s", year, month, day, week_days[now.dayOfTheWeek()]);
sprintf(t1, "%02d:%02d:%02d", hour, minute, second);
}
else {
if (millis()/500%2) {
second = 0;
switch(mode) {
case 1:
sprintf(t0, " -%02d-%02d", month, day);
break;
case 2:
sprintf(t0, "%04d- -%02d", year, day);
break;
case 3:
sprintf(t0, "%04d-%02d- ", year, month);
break;
case 4:
sprintf(t1, " :%02d:%02d", minute, second);
break;
case 5:
sprintf(t1, "%02d: :%02d", hour, second);
break;
case 6:
sprintf(t1, "%02d:%02d: ", hour, minute);
break;
}
}
else {
sprintf(t0, "%04d-%02d-%02d", year, month, day);
sprintf(t1, "%02d:%02d:%02d", hour, minute, second);
}
}
lcd.setCursor(0, 0);
lcd.print(t0);
lcd.setCursor(0, 1);
lcd.print(t1);
if (digitalRead(2) == LOW) changeMode();
if (digitalRead(3) == LOW) changeValue();
delay(100);
}
void changeMode() {
++mode;
}
void changeValue() {
switch(mode) {
case 1:
++year;
if (year > 2040) year = 2020;
break;
case 2:
++month;
if (month > 12) month = 1;
break;
case 3:
++day;
if (day > 31) day = 1;
break;
case 4:
++hour;
if (hour > 23) hour = 0;
break;
case 5:
++minute;
if (minute > 59) minute = 0;
break;
}
}