Arduino: LCD 1602 very Simple Clock
Jump to navigation
Jump to search
/* Arduino 'Clock' with LCD (20x4) I2C. This I2C LCD backpack contains the PCF8574 port-expander IC. Beware that this sketch can work with backpacks that contains this IC, but may not work with variations. Components: - Arduino Uno - LCD I2C (20x4) Libraries: - LiquidCrystal_I2C library Created on 25 June 2022 by c010rblind3ngineer */ #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); const int a_sec = 900; // clock second hand int Hrs, Mins; int Secs = 0; String AmPm; // to store the string data to display 'AM' or 'PM' int ampm; // to store user input int day, d, m, yr; // char *DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; // char *MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; String DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; String MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); clkInit(); } void loop() { //...Display Time to LCD... lcd.setCursor(3, 1); // lcd.print(" "); printolcd(Hrs); lcd.print(":"); printolcd(Mins); lcd.print(":"); printolcd(Secs); lcd.print(AmPm); //...Clock starts... Secs++; if (Secs == 60) { Secs = 0; Mins++; } if (Mins == 60) { Mins = 0; Hrs++; } if (Hrs == 13) { Hrs = 1; } if (Hrs == 12 && Mins == 00 && Secs == 00) { if (AmPm == " AM") { AmPm = " PM"; } else { AmPm = " AM"; d++; reset_dom(m); // reset the day to 1 when the days of the month exceed it's limit //...Reset LCD row 0 and update date... lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print(DAYS[day]); // mon, tues, wed... etc. lcd.print(", "); printolcd(d); lcd.print(" "); lcd.print(MONTHS[m - 1]); lcd.print(" "); lcd.print(yr); day++; } } delay(a_sec); // delay acts as the clock second hand } /////////////////////////////////////// ////Initialise the 'clock' settings//// /////////////////////////////////////// void clkInit() { Serial.println("What is the day today? (1 - 7)"); Serial.println("\t(1) Monday\n\t(2) Tuesday\n\t(3) Wednesday\n\t(4) Thursday\n\t(5) Friday\n\t(6) Saturday\n\t(7) Sunday"); while (Serial.available() == 0) {}; // wait for user input day = Serial.parseInt(); // store what day is today in integer variable 'day' delay(500); Serial.println("\nWhat is today's date?"); Serial.print("Day (1 - 31): "); while (Serial.available() == 0) {}; // wait for user input d = Serial.parseInt(); // store day in integer variable 'd' printoserial(d); Serial.print("\nMonth (1 - 12): "); while (Serial.available() == 0) {}; // wait for user input m = Serial.parseInt(); // store month in integer variable 'm' Serial.print(MONTHS[m - 1]); Serial.print("\nYear (YYYY): "); while (Serial.available() == 0) {}; // wait for user input yr = Serial.parseInt(); // store year in integer variable 'yr' Serial.print(yr); delay(500); Serial.print("\n\n\tToday is "); Serial.print(DAYS[day - 1]); Serial.print(", "); printoserial(d); Serial.print(" "); Serial.print(MONTHS[m - 1]); Serial.print(" "); Serial.print(yr); Serial.print("\n\nIs it - (1)AM or (2)PM ?"); while (Serial.available() == 0) {}; ampm = Serial.parseInt(); delay(500); if (ampm == 1) { AmPm = "AM"; Serial.print("\nClock set to AM\n\n"); } if (ampm == 2) { AmPm = "PM"; Serial.print("\nClock set to PM\n\n"); } delay(500); Serial.print("Input Hours (1 - 12) : "); while (Serial.available() == 0) {} // wait till the user inputs data Hrs = Serial.parseInt(); printoserial(Hrs); delay(500); Serial.print("\nInput Minutes (0 - 59) : "); while (Serial.available() == 0) {} // wait till the user inputs data Mins = Serial.parseInt(); printoserial(Mins); delay(500); Serial.print("\n\n\tClock set to : "); //...Display time to Serial Monitor... printoserial(Hrs); Serial.print(":"); printoserial(Mins); Serial.print(AmPm); //... Display Date to LCD... lcd.setCursor(0, 0); lcd.print(DAYS[day - 1]); lcd.print(", "); printolcd(d); lcd.print(" "); lcd.print(MONTHS[m - 1]); lcd.print(" "); lcd.print(yr); } ////////////////////////////////////////////////////////////////////////// ////To put an extra '0' infront of the variables on the Serial Monitor//// ////////////////////////////////////////////////////////////////////////// void printoserial(int val) { if (val < 10) { Serial.print("0"); Serial.print(val); } else { Serial.print(val); } } /////////////////////////////////////////////////////////////// ////To put an extra '0' infront of the variables on the LCD//// /////////////////////////////////////////////////////////////// void printolcd(int val) { if (val < 10) { lcd.print("0"); lcd.print(val); } else { lcd.print(val); } } void reset_dom(int var) { switch (var) { case 1: // Jan - 31 days if (d == 32) { d = 1; m++; } break; case 2: // Feb - 28 days if (d == 29) { d = 1; m++; } break; case 3: // March - 31 days if (d == 32) { d = 1; m++; } break; case 4: // April - 30 days if (d == 31) { d = 1; m++; } break; case 5: // May - 31 days if (d == 32) { d = 1; m++; } break; case 6: // June - 30 days if (d == 31) { d = 1; m++; } break; case 7: // July - 31 days if (d == 32) { d = 1; m++; } break; case 8: // August - 31 days if (d == 32) { d = 1; m++; } break; case 9: // September - 30 days if (d == 31) { d = 1; m++; } break; case 10: // October - 31 days if (d == 32) { d = 1; m++; } break; case 11: // November - 30 days if (d == 31) { d = 1; m++; } break; case 12: // December - 31 days if (d == 32) { d = 1; m++; } break; } }