I'm trying to make a very simple time and date clock display for beginners. (I took the basic code from someone else, modified for ease of use, simplicity and made sure to label every line to help beginners better understand what is actually going on)
My question for you guys is how can I display the leading zeros in a number (Example: 01 as opposed to 1)
//Arduino IDE ver. 1.8.5
//Arduino Uno R3
//DFRobot LCD Keypad Shield ver. 1.1
#include <LiquidCrystal.h> //LCD display library name
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Tells the Arduino which pins are being used by the LCD display. You will need to change the numbers to suit the LCD display you're using.
int hour = 23; //Change this to set the clock hour
int minute = 59; //Change this to set the clock minute
int second = 54; //Change this to set the clock minute
int month = 7; //Change this to set the clock month
int day = 24; //Change this to set the clock day
int year = 2018; //Change this to set the clock year
void setup()
{
lcd.begin(16, 2); //Tells the Arduino that the LCD is using 2 rows, 16 characters each
}
void loop()
//TIME
{
lcd.setCursor(0, 0); //LCD curser begins on the top row, far left side
lcd.print("TIME: "); //The LCD prints "TIME: "
lcd.print(hour); //The LCD prints the hour
lcd.print(":"); //The LCD prints ":"
lcd.print(minute); //The LCD prints the minute
lcd.print(":"); //The LCD prints ":"
lcd.print(second); //The LCD prints the second(s)
if (hour < 12)lcd.print("AM"); //If the hour is less than 12, the LCD prints AM
if (hour == 12)lcd.print("PM"); //If the hour is equal to 12, the LCD prints PM
if (hour > 12)lcd.print("PM"); //If the hour is greater than 12, the LCD prints PM
if (hour == 24)hour = 01; //If the hour is equal to 24, reset the hour back to 1 (1AM)
second = second + 1; //Add +1 second, every second
delay(1000); //Refresh the LCD every second
lcd.clear(); //Clears the LCD
if (second == 60) //If the seconds equal 60
{
second = 0; //Reset the seconds back to 0
minute = minute + 1; //Add +1 to the minute(s)
}
if (minute == 60) //If the minutes equal 60
{
minute = 0; //Reset the minute(s) back to 0
hour = hour + 1; //Add +1 to the hour(s)
}
if (hour == 24) //If the hours are equal to 24 (Midnight)
{
hour = 1; //Reset the hours back to 1 (1AM)
}
//DATE
lcd.setCursor(0, 1); //LCD curser begins on the bottom row, far left side
lcd.print("DATE: "); //The LCD prints "DATE: "
lcd.print(month); //The LCD prints the month
lcd.print("/"); //The LCD prints "/"
lcd.print(day); //The LCD prints the day
lcd.print("/"); //The LCD prints "/"
lcd.print(year); //The LCD prints the year
if (((hour > 22) && (minute > 58) && (second > 58))) //If the hour is greater than 22, the minute is greater than 58 and the second is greater than 58
{
day = day + 1; //Add +1 to the day
}
//MONTHS
//January
if (month == 1) //If it's the first month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in January)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//February
if (month == 2) //If it's the second month of the year
{
if (day == 29) //If the days are equal to 29 (28 days in February for a non-leap year. 29 days in February for a leap-year
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//March
if (month == 3) //If it's the third month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in March)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//April
if (month == 4) //If it's the fourth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in April)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//May
if (month == 5) //If it's the fifth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in May)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//June
if (month == 6) //If it's the sixth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in June)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//July
if (month == 7) //If it's the seventh month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in July)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//August
if (month == 8) //If it's the eighth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in August)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//September
if (month == 9) //If it's the nineth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in September)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//October
if (month == 10) //If it's the tenth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in October)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//November
if (month == 11) //If it's the eleventh month of the year
{
if (day == 31)//If the days are equal to 31 (30 days in November)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//December
if (month == 12) //If it's the twelfth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in December)
{
day = 1; //Reset the days back to 1
month = 1; //Add +1 to the month
year = year + 1; //Add +1 to the year
}
}
}
You simply replace all your annoying statements e.g.
lcd.print(hour); //The LCD prints the hour
with a call to your helper function
print02(hour); //The LCD prints the hour
There are lots of other ways to do it. For example using sprintf() to format all your output in one go and then printing the result on the LCD. This makes a project far easier to maintain.
I note that you have verbal diarrhoea when it comes to writing comments.
There are algorithms that will calculate the days in a month. Or you can simply use a lookup table.
Comments are for your benefit. Use the style that you feel happiest with.
Attractive code might encourage people to read and help you.
(haha, verbal diarrhea. I was just trying to comment it so that beginners could understand without it reading too technical)
However, I also am still curious to do it your way, so I'm trying it again. And I'll also look into the sprint() as you suggested.
Btw, here's how I did it the long way:
//Arduino IDE ver. 1.8.5
//Arduino Uno R3
//DFRobot LCD Keypad Shield ver. 1.1
#include <LiquidCrystal.h> //LCD display library name
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Tells the Arduino which pins are being used by the LCD display. You will need to change the numbers to suit the LCD display you're using.
int hour = 23; //Change this to set the clock hour
int minute = 59; //Change this to set the clock minute
int second = 54; //Change this to set the clock minute
int month = 7; //Change this to set the clock month
int day = 24; //Change this to set the clock day
int year = 2018; //Change this to set the clock year
void setup()
{
lcd.begin(16, 2); //Tells the Arduino that the LCD is using 2 rows, 16 characters each
}
void loop()
{
//TIME
lcd.setCursor(0, 0); //LCD curser begins on the top row, far left side
lcd.print("TIME: "); //The LCD prints "TIME: "
lcd.print(hour); //The LCD prints the hour
lcd.print(":"); //The LCD prints ":"
lcd.print(minute); //The LCD prints the minute
lcd.print(":"); //The LCD prints ":"
lcd.print(second); //The LCD prints the second(s)
if (hour == 24)hour = 01; //If the hour is equal to 24, reset the hour back to 1 (1AM)
//TIME - LEADING ZEROS
if (hour < 10)
{
lcd.setCursor(0, 0); //LCD curser begins on the top row, far left side
lcd.print("TIME: 0"); //The LCD prints "TIME: "
lcd.print(hour); //The LCD prints the hour
lcd.print(":"); //The LCD prints ":"
lcd.print(minute); //The LCD prints the minute
lcd.print(":"); //The LCD prints ":"
lcd.print(second); //The LCD prints the second(s)
}
if (minute < 10)
{
lcd.setCursor(0, 0); //LCD curser begins on the top row, far left side
lcd.print("TIME: 0"); //The LCD prints "TIME: "
lcd.print(hour); //The LCD prints the hour
lcd.print(":0"); //The LCD prints ":"
lcd.print(minute); //The LCD prints the minute
lcd.print(":"); //The LCD prints ":"
lcd.print(second); //The LCD prints the second(s)
}
if (second < 10)
{
lcd.setCursor(0, 0); //LCD curser begins on the top row, far left side
lcd.print("TIME: 0"); //The LCD prints "TIME: "
lcd.print(hour); //The LCD prints the hour
lcd.print(":0"); //The LCD prints ":"
lcd.print(minute); //The LCD prints the minute
lcd.print(":0"); //The LCD prints ":"
lcd.print(second); //The LCD prints the second(s)
}
second = second + 1; //Add +1 second, every second
delay(1000); //Refresh the LCD every second
lcd.clear(); //Clears the LCD
if (second == 60) //If the seconds equal 60
{
second = 0; //Reset the seconds back to 0
minute = minute + 1; //Add +1 to the minute(s)
}
if (minute == 60) //If the minutes equal 60
{
minute = 0; //Reset the minute(s) back to 0
hour = hour + 1; //Add +1 to the hour(s)
}
if (hour == 24) //If the hours are equal to 24 (Midnight)
{
hour = 1; //Reset the hours back to 1 (1AM)
}
//DATE
lcd.setCursor(0, 1); //LCD curser begins on the bottom row, far left side
lcd.print("DATE: "); //The LCD prints "DATE: "
lcd.print(month); //The LCD prints the month
lcd.print("/"); //The LCD prints "/"
lcd.print(day); //The LCD prints the day
lcd.print("/"); //The LCD prints "/"
lcd.print(year); //The LCD prints the year
if (((hour > 22) && (minute > 58) && (second > 58))) //If the hour is greater than 22, the minute is greater than 58 and the second is greater than 58
{
day = day + 1; //Add +1 to the day
}
//MONTHS
//January
if (month == 1) //If it's the first month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in January)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//February
if (month == 2) //If it's the second month of the year
{
if (day == 29) //If the days are equal to 29 (28 days in February for a non-leap year. 29 days in February for a leap-year
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//March
if (month == 3) //If it's the third month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in March)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//April
if (month == 4) //If it's the fourth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in April)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//May
if (month == 5) //If it's the fifth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in May)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//June
if (month == 6) //If it's the sixth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in June)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//July
if (month == 7) //If it's the seventh month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in July)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//August
if (month == 8) //If it's the eighth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in August)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//September
if (month == 9) //If it's the nineth month of the year
{
if (day == 31) //If the days are equal to 31 (30 days in September)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//October
if (month == 10) //If it's the tenth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in October)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//November
if (month == 11) //If it's the eleventh month of the year
{
if (day == 31)//If the days are equal to 31 (30 days in November)
{
day = 1; //Reset the days back to 1
month = month + 1; //Add +1 to the month
}
}
//December
if (month == 12) //If it's the twelfth month of the year
{
if (day == 32) //If the days are equal to 32 (31 days in December)
{
day = 1; //Reset the days back to 1
month = 1; //Add +1 to the month
year = year + 1; //Add +1 to the year
}
}
}
You have not fixed it at all. You just get :09 followed by :010
Regarding verbal diarrhoea. I just blank it out. My brain refuses to read it.
The long-winded way of doing your problem is:
if (hour < 10) lcd.print("0");
lcd.print(hour); //The LCD prints the hour
...
if (minute < 10) lcd.print("0");
lcd.print(minute); //The LCD prints the minute
...
DR2727:
I'm trying to make a very simple time and date clock display for beginners. (I took the basic code from someone else, modified for ease of use, simplicity and made sure to label every line to help beginners better understand what is actually going on)
My question for you guys is how can I display the leading zeros in a number (Example: 01 as opposed to 1)
This is a very common problem. Unfortunately, there is no "clean" solution, because whoever wrote the Arduino print() functions did not see fit to support leading zeros. This leads to posts like yours.
Perhaps the most "beginner-friendly" way to deal with this problem is what david_prentice suggested. For clarity, I will reformat and comment his suggestion.
if (hour < 10) // This checks for single digit hours (anything less than 10 will be a single digit)
{
lcd.print("0"); // The LCD prints a zero before the hours
}
lcd.print(hour); //The LCD prints the hour
lcd.print(":"); // The LCD prints a colon between hours and minutes
if (minute < 10) // This checks for single digit minutes (anything less than 10 will be a single digit)
{
lcd.print("0"); // The LCD prints a zero before the minutes
}
lcd.print(minute); //The LCD prints the minute
Then there is the way I would do it.
char buf[21]; // a place to put a character string
sprintf(buf, "%02d:%02d:%02d", hour, minute, second); // put a character string showing the time (hour:minute:second) into buf
lcd.print(buf); // the LCD prints the character string from buf