rhandycan1

3Pushbuttons + RTC + LCD

Oct 9th, 2025 (edited)
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.44 KB | None | 0 0
  1. /*
  2. PROGRAMMED BY: RANDY N. CAÑADA
  3. MY YOUTUBE CHANNEL: ElectroCrafters:
  4. https://www.youtube.com/channel/UCu1aqzUdTqSnTN5BHNlbVgA
  5.  
  6. MY FB CHANNEL: FB PAGE:
  7. Arduino:
  8. https://www.facebook.com/rhacan2?__tn__=R
  9.  
  10. PLS ALSO SUPPORT MY OTHER PAGE:FB PAGES:
  11. Playlist.ph:
  12. https://www.facebook.com/profile.php?id=61573177858722
  13.  
  14. SUPPORT MY OTHER YOUTUBE CHANNEL:
  15. PlaylistPH
  16. https://www.youtube.com/@PlaylistPh-h2v
  17. */
  18.  
  19. #include <LiquidCrystal_I2C.h>
  20. #include <ThreeWire.h>
  21. #include <RtcDS1302.h>
  22.  
  23. LiquidCrystal_I2C lcd(0x27, 16, 2);
  24. ThreeWire myWire(11, 13, 12); // DAT, CLK, RST
  25. RtcDS1302<ThreeWire> Rtc(myWire);
  26.  
  27. // Pushbutton pins
  28. const int btnSet     = 2;//set
  29. const int btnInc     = 3;//increment
  30. const int btnConfirm = 4;//save
  31.  
  32. enum TimeField { NONE, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DONE };
  33. TimeField currentField = NONE;
  34.  
  35. int year, month, day, hour, minute, second;
  36. bool settingMode = false;
  37.  
  38. // Long press detection
  39. unsigned long setPressStart = 0;
  40. bool setHeld = false;
  41.  
  42. // Debounce timing
  43. unsigned long lastIncPress = 0;
  44. unsigned long lastConfirmPress = 0;
  45. const unsigned long debounceDelay = 200;
  46.  
  47. void setup() {
  48.   lcd.init();
  49.   lcd.backlight();
  50.   Rtc.Begin();
  51.  
  52.   pinMode(btnSet, INPUT_PULLUP);
  53.   pinMode(btnInc, INPUT_PULLUP);
  54.   pinMode(btnConfirm, INPUT_PULLUP);
  55. }
  56.  
  57. void loop() {
  58.   if (!settingMode) {
  59.     // Normal display mode
  60.     RtcDateTime now = Rtc.GetDateTime();
  61.  
  62.     char dateBuffer[11]; // DD/MM/YYYY
  63.     sprintf(dateBuffer, "%02d/%02d/%04d", now.Day(), now.Month(), now.Year());
  64.  
  65.     char timeBuffer[9]; // HH:MM:SS
  66.     sprintf(timeBuffer, "%02d:%02d:%02d", now.Hour(), now.Minute(), now.Second());
  67.  
  68.     lcd.clear();
  69.     lcd.setCursor(0, 0);
  70.     lcd.print("Date: ");
  71.     lcd.print(dateBuffer);
  72.  
  73.     lcd.setCursor(0, 1);
  74.     lcd.print("Time: ");
  75.     lcd.print(timeBuffer);
  76.  
  77.     // Long press to reset and enter setting mode
  78.     if (digitalRead(btnSet) == LOW) {
  79.       if (!setHeld) {
  80.         setPressStart = millis();
  81.         setHeld = true;
  82.       } else if (millis() - setPressStart > 1000) {
  83.         year = 2000;
  84.         month = 1;
  85.         day = 1;
  86.         hour = 0;
  87.         minute = 0;
  88.         second = 0;
  89.         currentField = YEAR;
  90.         settingMode = true;
  91.         setHeld = false;
  92.         delay(300);
  93.       }
  94.     } else {
  95.       setHeld = false;
  96.     }
  97.  
  98.     delay(500);
  99.     return;
  100.   }
  101.  
  102.   // Time setting mode
  103.   lcd.clear();
  104.   lcd.setCursor(0, 0);
  105.   lcd.print("Enter ");
  106.   lcd.print(fieldName(currentField));
  107.  
  108.   lcd.setCursor(0, 1);
  109.   lcd.print("Value: ");
  110.   lcd.print(paddedValue(currentField));
  111.  
  112.   // Increment field with debounce
  113.   if (digitalRead(btnInc) == LOW && millis() - lastIncPress > debounceDelay) {
  114.     incrementField(currentField);
  115.     lastIncPress = millis();
  116.   }
  117.  
  118.   // Confirm field with debounce
  119.   if (digitalRead(btnConfirm) == LOW && millis() - lastConfirmPress > debounceDelay) {
  120.     currentField = static_cast<TimeField>(currentField + 1);
  121.     lastConfirmPress = millis();
  122.  
  123.     if (currentField == DONE) {
  124.       RtcDateTime newTime(year, month, day, hour, minute, second);
  125.       Rtc.SetDateTime(newTime);
  126.       lcd.clear();
  127.       lcd.setCursor(0, 0);
  128.       lcd.print("Time Saved!");
  129.       delay(1000);
  130.       settingMode = false;
  131.       currentField = NONE;
  132.     }
  133.   }
  134.  
  135.   delay(50); // smooth loop
  136. }
  137.  
  138. String fieldName(TimeField field) {
  139.   switch (field) {
  140.     case YEAR: return "Year";
  141.     case MONTH: return "Month";
  142.     case DAY: return "Day";
  143.     case HOUR: return "Hour";
  144.     case MINUTE: return "Minute";
  145.     case SECOND: return "Second";
  146.     default: return "";
  147.   }
  148. }
  149.  
  150. String paddedValue(TimeField field) {
  151.   char buffer[5];
  152.   int value = getFieldValue(field);
  153.   if (field == YEAR) {
  154.     sprintf(buffer, "%04d", value);
  155.   } else {
  156.     sprintf(buffer, "%02d", value);
  157.   }
  158.   return String(buffer);
  159. }
  160.  
  161. int getFieldValue(TimeField field) {
  162.   switch (field) {
  163.     case YEAR: return year;
  164.     case MONTH: return month;
  165.     case DAY: return day;
  166.     case HOUR: return hour;
  167.     case MINUTE: return minute;
  168.     case SECOND: return second;
  169.     default: return 0;
  170.   }
  171. }
  172.  
  173. void incrementField(TimeField field) {
  174.   switch (field) {
  175.     case YEAR: year++; break;
  176.     case MONTH: month = (month % 12) + 1; break;
  177.     case DAY: day = (day % 31) + 1; break;
  178.     case HOUR: hour = (hour + 1) % 24; break;
  179.     case MINUTE: minute = (minute + 1) % 60; break;
  180.     case SECOND: second = (second + 1) % 60; break;
  181.     default: break;
  182.   }
  183. }
  184.  
Advertisement
Add Comment
Please, Sign In to add comment