Arduino: LCD 1602 very Simple Clock

From OnnoWiki
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;
  }
}