#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char daysOfWeek[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
const char months[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
const int SELECT_BUTTON = 2; // Replace with the actual pin numbers
const int INCREMENT_BUTTON = 3;
const int DECREMENT_BUTTON = 4;
int selectedField = 0; // 0: Hour, 1: Minute, 2: Day, 3: Month, 4: Year
//===============som mod ======
String modeDisplay = " (A)";
//===============som mod ======
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.begin(16, 2); lcd.backlight();
pinMode(SELECT_BUTTON, INPUT_PULLUP);
pinMode(INCREMENT_BUTTON, INPUT_PULLUP);
pinMode(DECREMENT_BUTTON, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now();
if (digitalRead(SELECT_BUTTON) == LOW) {
adjustTime(now);
} else {
displayClock(now);
}
delay(1000); // Update every second
}
void displayClock(DateTime now) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.print(" ");
lcd.print(daysOfWeek[now.dayOfTheWeek()]);
lcd.setCursor(0, 1);
lcd.print(now.day(), DEC); lcd.print(' ');
lcd.print(months[now.month() - 1]); lcd.print(' ');
lcd.print(now.year());
lcd.print(modeDisplay); // auto/manual mode display som
//lcd.print(now.year() % 100);// to display only last 2 digits
}
void adjustTime(DateTime now) {
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("Adjusting...");
while (digitalRead(SELECT_BUTTON) == LOW) {
lcd.setCursor(0, 1);
lcd.print(getFieldName());
lcd.setCursor(0, 0);
// int value = now.get(selectedField);
// lcd.print(value);
int value;
switch (selectedField) {
case 0: value = now.hour(); break;
case 1: value = now.minute(); break;
case 2: value = now.day(); break;
case 3: value = now.month(); break;
case 4: value = now.year() % 100; break;
default: value = 0;
}
lcd.print(value);
if (selectedField == 3) {
lcd.print(months[value - 1]);
} else {
lcd.print(" ");
}
lcd.blink();
if (digitalRead(INCREMENT_BUTTON) == HIGH) {
adjustValue(now, selectedField, 1);
} else if (digitalRead(DECREMENT_BUTTON) == HIGH) {
adjustValue(now, selectedField, -1);
}
delay(500);
}
lcd.noBlink();
rtc.adjust(now);
}
void adjustValue(DateTime& now, int field, int delta) {
// Adjust the specified field (Hour, Minute, Day, Month, Year) with delta
now = now + TimeSpan(0, 0, 0, (field == 4) ? delta * 100 : delta);
}
String getFieldName() {
switch (selectedField) {
case 0: return "Hour: ";
case 1: return "Min: ";
case 2: return "Day: ";
case 3: return "Month:";
case 4: return "Year: ";
default: return "";
}
}