Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- PROGRAMMED BY: RANDY N. CAÑADA
- MY YOUTUBE CHANNEL: ElectroCrafters:
- https://www.youtube.com/channel/UCu1aqzUdTqSnTN5BHNlbVgA
- MY FB CHANNEL: FB PAGE:
- Arduino:
- https://www.facebook.com/rhacan2?__tn__=R
- PLS ALSO SUPPORT MY OTHER PAGE:FB PAGES:
- Playlist.ph:
- https://www.facebook.com/profile.php?id=61573177858722
- SUPPORT MY OTHER YOUTUBE CHANNEL:
- PlaylistPH
- https://www.youtube.com/@PlaylistPh-h2v
- */
- #include <LiquidCrystal_I2C.h>
- #include <ThreeWire.h>
- #include <RtcDS1302.h>
- LiquidCrystal_I2C lcd(0x27, 16, 2);
- ThreeWire myWire(11, 13, 12); // DAT, CLK, RST
- RtcDS1302<ThreeWire> Rtc(myWire);
- // Pushbutton pins
- const int btnSet = 2;//set
- const int btnInc = 3;//increment
- const int btnConfirm = 4;//save
- enum TimeField { NONE, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DONE };
- TimeField currentField = NONE;
- int year, month, day, hour, minute, second;
- bool settingMode = false;
- // Long press detection
- unsigned long setPressStart = 0;
- bool setHeld = false;
- // Debounce timing
- unsigned long lastIncPress = 0;
- unsigned long lastConfirmPress = 0;
- const unsigned long debounceDelay = 200;
- void setup() {
- lcd.init();
- lcd.backlight();
- Rtc.Begin();
- pinMode(btnSet, INPUT_PULLUP);
- pinMode(btnInc, INPUT_PULLUP);
- pinMode(btnConfirm, INPUT_PULLUP);
- }
- void loop() {
- if (!settingMode) {
- // Normal display mode
- RtcDateTime now = Rtc.GetDateTime();
- char dateBuffer[11]; // DD/MM/YYYY
- sprintf(dateBuffer, "%02d/%02d/%04d", now.Day(), now.Month(), now.Year());
- char timeBuffer[9]; // HH:MM:SS
- sprintf(timeBuffer, "%02d:%02d:%02d", now.Hour(), now.Minute(), now.Second());
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Date: ");
- lcd.print(dateBuffer);
- lcd.setCursor(0, 1);
- lcd.print("Time: ");
- lcd.print(timeBuffer);
- // Long press to reset and enter setting mode
- if (digitalRead(btnSet) == LOW) {
- if (!setHeld) {
- setPressStart = millis();
- setHeld = true;
- } else if (millis() - setPressStart > 1000) {
- year = 2000;
- month = 1;
- day = 1;
- hour = 0;
- minute = 0;
- second = 0;
- currentField = YEAR;
- settingMode = true;
- setHeld = false;
- delay(300);
- }
- } else {
- setHeld = false;
- }
- delay(500);
- return;
- }
- // Time setting mode
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Enter ");
- lcd.print(fieldName(currentField));
- lcd.setCursor(0, 1);
- lcd.print("Value: ");
- lcd.print(paddedValue(currentField));
- // Increment field with debounce
- if (digitalRead(btnInc) == LOW && millis() - lastIncPress > debounceDelay) {
- incrementField(currentField);
- lastIncPress = millis();
- }
- // Confirm field with debounce
- if (digitalRead(btnConfirm) == LOW && millis() - lastConfirmPress > debounceDelay) {
- currentField = static_cast<TimeField>(currentField + 1);
- lastConfirmPress = millis();
- if (currentField == DONE) {
- RtcDateTime newTime(year, month, day, hour, minute, second);
- Rtc.SetDateTime(newTime);
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Time Saved!");
- delay(1000);
- settingMode = false;
- currentField = NONE;
- }
- }
- delay(50); // smooth loop
- }
- String fieldName(TimeField field) {
- switch (field) {
- case YEAR: return "Year";
- case MONTH: return "Month";
- case DAY: return "Day";
- case HOUR: return "Hour";
- case MINUTE: return "Minute";
- case SECOND: return "Second";
- default: return "";
- }
- }
- String paddedValue(TimeField field) {
- char buffer[5];
- int value = getFieldValue(field);
- if (field == YEAR) {
- sprintf(buffer, "%04d", value);
- } else {
- sprintf(buffer, "%02d", value);
- }
- return String(buffer);
- }
- int getFieldValue(TimeField field) {
- switch (field) {
- case YEAR: return year;
- case MONTH: return month;
- case DAY: return day;
- case HOUR: return hour;
- case MINUTE: return minute;
- case SECOND: return second;
- default: return 0;
- }
- }
- void incrementField(TimeField field) {
- switch (field) {
- case YEAR: year++; break;
- case MONTH: month = (month % 12) + 1; break;
- case DAY: day = (day % 31) + 1; break;
- case HOUR: hour = (hour + 1) % 24; break;
- case MINUTE: minute = (minute + 1) % 60; break;
- case SECOND: second = (second + 1) % 60; break;
- default: break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment