Difference between revisions of "Arduino: LCD 1602 very Simple Clock"
Jump to navigation
Jump to search
Onnowpurbo (talk | contribs) (Created page with " /* Arduino 'Clock' with LCD (16x2) I2C. This I2C LCD backpack contains the PCF8574 port-expander IC. Beware that this sketch can work with backpacks that contai...") |
Onnowpurbo (talk | contribs) |
||
| Line 1: | Line 1: | ||
| − | /* Arduino 'Clock' with LCD ( | + | /* Arduino 'Clock' with LCD (20x4) I2C. |
This I2C LCD backpack contains the PCF8574 port-expander | This I2C LCD backpack contains the PCF8574 port-expander | ||
IC. Beware that this sketch can work with backpacks that | IC. Beware that this sketch can work with backpacks that | ||
| − | contains this IC, but may not work with variations. | + | contains this IC, but may not work with variations. |
Components: | Components: | ||
| Line 27: | Line 27: | ||
int day, d, m, yr; | int day, d, m, yr; | ||
// char *DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; | // char *DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; | ||
| − | // char *MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; | + | // char *MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; |
String DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; | String DAYS[] = { "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun" }; | ||
String MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; | String MONTHS[] = { "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" }; | ||
| + | |||
void setup() | void setup() | ||
| Line 42: | Line 43: | ||
{ | { | ||
//...Display Time to LCD... | //...Display Time to LCD... | ||
| − | lcd.setCursor( | + | lcd.setCursor(3, 1); |
| − | lcd.print(" | + | // lcd.print(" "); |
printolcd(Hrs); | printolcd(Hrs); | ||
lcd.print(":"); | lcd.print(":"); | ||
| Line 53: | Line 54: | ||
//...Clock starts... | //...Clock starts... | ||
Secs++; | Secs++; | ||
| − | + | if (Secs == 60) { | |
Secs = 0; | Secs = 0; | ||
Mins++; | Mins++; | ||
| Line 65: | Line 66: | ||
} | } | ||
if (Hrs == 12 && Mins == 00 && Secs == 00) { | if (Hrs == 12 && Mins == 00 && Secs == 00) { | ||
| − | if (AmPm == "AM") { | + | if (AmPm == " AM") { |
| − | AmPm = "PM"; | + | AmPm = " PM"; |
} | } | ||
else { | else { | ||
| − | AmPm = "AM"; | + | AmPm = " AM"; |
d++; | d++; | ||
| − | reset_dom(m); // reset the day to 1 when the days of the month exceed it's limit | + | 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... | //...Reset LCD row 0 and update date... | ||
| Line 88: | Line 89: | ||
} | } | ||
delay(a_sec); // delay acts as the clock second hand | delay(a_sec); // delay acts as the clock second hand | ||
| − | } | + | } |
| − | + | ||
/////////////////////////////////////// | /////////////////////////////////////// | ||
////Initialise the 'clock' settings//// | ////Initialise the 'clock' settings//// | ||
/////////////////////////////////////// | /////////////////////////////////////// | ||
| − | void clkInit() { | + | void clkInit() { |
Serial.println("What is the day today? (1 - 7)"); | 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"); | 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 | while (Serial.available() == 0) {}; // wait for user input | ||
| − | day = Serial.parseInt(); // store what day is today in integer variable 'day' | + | day = Serial.parseInt(); // store what day is today in integer variable 'day' |
delay(500); | delay(500); | ||
| Line 118: | Line 119: | ||
Serial.print(yr); | Serial.print(yr); | ||
| − | delay(500); | + | delay(500); |
| − | + | ||
Serial.print("\n\n\tToday is "); | Serial.print("\n\n\tToday is "); | ||
Serial.print(DAYS[day - 1]); | Serial.print(DAYS[day - 1]); | ||
| Line 130: | Line 131: | ||
Serial.print("\n\nIs it - (1)AM or (2)PM ?"); | Serial.print("\n\nIs it - (1)AM or (2)PM ?"); | ||
while (Serial.available() == 0) {}; | while (Serial.available() == 0) {}; | ||
| − | ampm = Serial.parseInt(); | + | ampm = Serial.parseInt(); |
| − | delay(500); | + | delay(500); |
if (ampm == 1) { | if (ampm == 1) { | ||
| Line 141: | Line 142: | ||
AmPm = "PM"; | AmPm = "PM"; | ||
Serial.print("\nClock set to PM\n\n"); | Serial.print("\nClock set to PM\n\n"); | ||
| − | } | + | } |
| − | |||
| − | |||
| + | delay(500); | ||
| + | |||
Serial.print("Input Hours (1 - 12) : "); | Serial.print("Input Hours (1 - 12) : "); | ||
while (Serial.available() == 0) {} // wait till the user inputs data | while (Serial.available() == 0) {} // wait till the user inputs data | ||
Hrs = Serial.parseInt(); | Hrs = Serial.parseInt(); | ||
| − | printoserial(Hrs); | + | printoserial(Hrs); |
| − | delay(500); | + | delay(500); |
Serial.print("\nInput Minutes (0 - 59) : "); | Serial.print("\nInput Minutes (0 - 59) : "); | ||
while (Serial.available() == 0) {} // wait till the user inputs data | while (Serial.available() == 0) {} // wait till the user inputs data | ||
Mins = Serial.parseInt(); | Mins = Serial.parseInt(); | ||
| − | printoserial(Mins); | + | printoserial(Mins); |
| − | delay(500 | + | delay(500); |
| − | |||
| − | |||
| + | Serial.print("\n\n\tClock set to : "); | ||
//...Display time to Serial Monitor... | //...Display time to Serial Monitor... | ||
printoserial(Hrs); | printoserial(Hrs); | ||
Serial.print(":"); | Serial.print(":"); | ||
printoserial(Mins); | printoserial(Mins); | ||
| − | Serial.print(AmPm); | + | Serial.print(AmPm); |
//... Display Date to LCD... | //... Display Date to LCD... | ||
| Line 177: | Line 177: | ||
lcd.print(yr); | lcd.print(yr); | ||
} | } | ||
| − | + | ||
////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////// | ||
| Line 191: | Line 191: | ||
Serial.print(val); | Serial.print(val); | ||
} | } | ||
| − | } | + | } |
/////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////// | ||
| Line 205: | Line 205: | ||
lcd.print(val); | lcd.print(val); | ||
} | } | ||
| − | } | + | } |
void reset_dom(int var) { | void reset_dom(int var) { | ||
Latest revision as of 17:42, 1 April 2023
/* 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;
}
}