Home
About Us
Achievement
Home
Raspberry-Pi Projects
_Raspberry Pi 4 Complete Guide
Arduino Project
_All Projects
Esp8266 Project
_All Projects
Esp32 Project
_Automation-with-feedback
Digital Alarm Clock Using 20*4 Lcd Display
Just Do Electronics
May 10, 2020
Real Time Clock with Alarm & Temperature Monitor using Arduino
Circuit Diagram :-
Code :-
//Prateek //www.prateeks.in #include
#include
LiquidCrystal lcd(12,11,10,9,8,7); const int button1 = 13; const int button2 = 14; const int button3 = 15; const int alarm_pin = 6; void setup() { pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); pinMode(15, INPUT_PULLUP); pinMode(6, OUTPUT); digitalWrite(alarm_pin, LOW); lcd.begin(20, 4); Wire.begin(); attachInterrupt(digitalPinToInterrupt(2), Alarm, FALLING); } bool alarm1_status, alarm2_status; char Time[] = " : : ", calendar[] = " / /20 ", alarm1[] = "A1: : :00", alarm2[] = "A2: : :00", temperature[] = "T: . C"; byte i, second, minute, hour, day, date, month, year, alarm1_minute, alarm1_hour, alarm2_minute, alarm2_hour, status_reg; void Alarm(){ digitalWrite(alarm_pin, HIGH); } void DS3231_read(){ Wire.beginTransmission(0x68); Wire.write(0); Wire.endTransmission(false); Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231 and release I2C bus at end of reading second = Wire.read(); // Read seconds from register 0 minute = Wire.read(); // Read minuts from register 1 hour = Wire.read(); // Read hour from register 2 day = Wire.read(); // Read day from register 3 date = Wire.read(); // Read date from register 4 month = Wire.read(); // Read month from register 5 year = Wire.read(); // Read year from register 6 } void alarms_read_display(){ // Function to read and display alarm1, alarm2 and temperature data byte control_reg, temperature_lsb; char temperature_msb; Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address Wire.write(0x08); // Send register address Wire.endTransmission(false); // I2C restart Wire.requestFrom(0x68, 11); // Request 11 bytes from DS3231 and release I2C bus at end of reading alarm1_minute = Wire.read(); // Read alarm1 minutes alarm1_hour = Wire.read(); // Read alarm1 hours Wire.read(); // Skip alarm1 day/date register alarm2_minute = Wire.read(); // Read alarm2 minutes alarm2_hour = Wire.read(); // Read alarm2 hours Wire.read(); // Skip alarm2 day/date register control_reg = Wire.read(); // Read the DS3231 control register status_reg = Wire.read(); // Read the DS3231 status register Wire.read(); // Skip aging offset register temperature_msb = Wire.read(); // Read temperature MSB temperature_lsb = Wire.read(); // Read temperature LSB // Convert BCD to decimal alarm1_minute = (alarm1_minute >> 4) * 10 + (alarm1_minute & 0x0F); alarm1_hour = (alarm1_hour >> 4) * 10 + (alarm1_hour & 0x0F); alarm2_minute = (alarm2_minute >> 4) * 10 + (alarm2_minute & 0x0F); alarm2_hour = (alarm2_hour >> 4) * 10 + (alarm2_hour & 0x0F); // End conversion alarm1[8] = alarm1_minute % 10 + 48; alarm1[7] = alarm1_minute / 10 + 48; alarm1[5] = alarm1_hour % 10 + 48; alarm1[4] = alarm1_hour / 10 + 48; alarm2[8] = alarm2_minute % 10 + 48; alarm2[7] = alarm2_minute / 10 + 48; alarm2[5] = alarm2_hour % 10 + 48; alarm2[4] = alarm2_hour / 10 + 48; alarm1_status = bitRead(control_reg, 0); // Read alarm1 interrupt enable bit (A1IE) from DS3231 control register alarm2_status = bitRead(control_reg, 1); // Read alarm2 interrupt enable bit (A2IE) from DS3231 control register if(temperature_msb < 0){ temperature_msb = abs(temperature_msb); temperature[2] = '-'; } else temperature[2] = ' '; temperature_lsb >>= 6; temperature[4] = temperature_msb % 10 + 48; temperature[3] = temperature_msb / 10 + 48; if(temperature_lsb == 0 || temperature_lsb == 2){ temperature[7] = '0'; if(temperature_lsb == 0) temperature[6] = '0'; else temperature[6] = '5'; } if(temperature_lsb == 1 || temperature_lsb == 3){ temperature[7] = '5'; if(temperature_lsb == 1) temperature[6] = '2'; else temperature[6] = '7'; } temperature[8] = 223; // Put the degree symbol lcd.setCursor(10, 0); lcd.print(temperature); // Display temperature lcd.setCursor(0, 2); lcd.print(alarm1); // Display alarm1 lcd.setCursor(17, 2); if(alarm1_status) lcd.print("ON "); // If A1IE = 1 print 'ON' else lcd.print("OFF"); // If A1IE = 0 print 'OFF' lcd.setCursor(0, 3); lcd.print(alarm2); // Display alarm2 lcd.setCursor(17, 3); if(alarm2_status) lcd.print("ON "); // If A2IE = 1 print 'ON' else lcd.print("OFF"); // If A2IE = 0 print 'OFF' } void calendar_display(){ // Function to display calendar switch(day){ case 1: strcpy(calendar, "Sun / /20 "); break; case 2: strcpy(calendar, "Mon / /20 "); break; case 3: strcpy(calendar, "Tue / /20 "); break; case 4: strcpy(calendar, "Wed / /20 "); break; case 5: strcpy(calendar, "Thu / /20 "); break; case 6: strcpy(calendar, "Fri / /20 "); break; case 7: strcpy(calendar, "Sat / /20 "); break; default: strcpy(calendar, "Sat / /20 "); } calendar[13] = year % 10 + 48; calendar[12] = year / 10 + 48; calendar[8] = month % 10 + 48; calendar[7] = month / 10 + 48; calendar[5] = date % 10 + 48; calendar[4] = date / 10 + 48; lcd.setCursor(0, 1); lcd.print(calendar); // Display calendar } void DS3231_display(){ // Convert BCD to decimal second = (second >> 4) * 10 + (second & 0x0F); minute = (minute >> 4) * 10 + (minute & 0x0F); hour = (hour >> 4) * 10 + (hour & 0x0F); date = (date >> 4) * 10 + (date & 0x0F); month = (month >> 4) * 10 + (month & 0x0F); year = (year >> 4) * 10 + (year & 0x0F); // End conversion Time[7] = second % 10 + 48; Time[6] = second / 10 + 48; Time[4] = minute % 10 + 48; Time[3] = minute / 10 + 48; Time[1] = hour % 10 + 48; Time[0] = hour / 10 + 48; calendar_display(); // Call calendar display function lcd.setCursor(0, 0); lcd.print(Time); // Display time } void Blink(){ byte j = 0; while(j < 10 && (digitalRead(button1) || i >= 5) && digitalRead(button2) && (digitalRead(button3) || i < 5)){ j++; delay(25); } } byte edit(byte x, byte y, byte parameter){ char text[3]; while(!digitalRead(button1) || !digitalRead(button3)); // Wait until button B1 is released while(true){ while(!digitalRead(button2)){ // If button B2 is pressed parameter++; if(((i == 0) || (i == 5)) && parameter > 23) // If hours > 23 ==> hours = 0 parameter = 0; if(((i == 1) || (i == 6)) && parameter > 59) // If minutes > 59 ==> minutes = 0 parameter = 0; if(i == 2 && parameter > 31) // If date > 31 ==> date = 1 parameter = 1; if(i == 3 && parameter > 12) // If month > 12 ==> month = 1 parameter = 1; if(i == 4 && parameter > 99) // If year > 99 ==> year = 0 parameter = 0; if(i == 7 && parameter > 1) // For alarms ON or OFF (1: alarm ON, 0: alarm OFF) parameter = 0; lcd.setCursor(x, y); if(i == 7){ // For alarms ON & OFF if(parameter == 1) lcd.print("ON "); else lcd.print("OFF"); } else{ sprintf(text,"%02u", parameter); lcd.print(text); } if(i >= 5){ DS3231_read(); // Read data from DS3231 DS3231_display(); // Display DS3231 time and calendar } delay(200); // Wait 200ms } lcd.setCursor(x, y); lcd.print(" "); // Print two spaces if(i == 7) lcd.print(" "); // Print space (for alarms ON & OFF) Blink(); // Call Blink function lcd.setCursor(x, y); if(i == 7){ // For alarms ON & OFF if(parameter == 1) lcd.print("ON "); else lcd.print("OFF"); } else{ sprintf(text,"%02u", parameter); lcd.print(text); } Blink(); if(i >= 5){ DS3231_read(); DS3231_display();} if((!digitalRead(button1) && i < 5) || (!digitalRead(button3) && i >= 5)){ i++; // Increment 'i' for the next parameter return parameter; // Return parameter value and exit } } } void loop() { if(!digitalRead(button1)){ // If B1 button is pressed i = 0; hour = edit(0, 0, hour); minute = edit(3, 0, minute); while(!digitalRead(button1)); // Wait until button B1 released while(true){ while(!digitalRead(button2)){ // If button B2 button is pressed day++; // Increment day if(day > 7) day = 1; calendar_display(); // Call display_calendar function lcd.setCursor(0, 1); lcd.print(calendar); // Display calendar delay(200); } lcd.setCursor(0, 1); lcd.print(" "); // Print 3 spaces Blink(); lcd.setCursor(0, 1); lcd.print(calendar); // Print calendar Blink(); // Call Blink function if(!digitalRead(button1)) // If button B1 is pressed break; } date = edit(4, 1, date); // Edit date month = edit(7, 1, month); // Edit month year = edit(12, 1, year); // Edit year // Convert decimal to BCD minute = ((minute / 10) << 4) + (minute % 10); hour = ((hour / 10) << 4) + (hour % 10); date = ((date / 10) << 4) + (date % 10); month = ((month / 10) << 4) + (month % 10); year = ((year / 10) << 4) + (year % 10); // End conversion // Write time & calendar data to DS3231 RTC Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address Wire.write(0); // Send register address Wire.write(0); // Reset sesonds and start oscillator Wire.write(minute); // Write minute Wire.write(hour); // Write hour Wire.write(day); // Write day Wire.write(date); // Write date Wire.write(month); // Write month Wire.write(year); // Write year Wire.endTransmission(); // Stop transmission and release the I2C bus delay(200); } if(!digitalRead(button3)){ // If B3 button is pressed while(!digitalRead(button3)); // Wait until button B3 released i = 5; alarm1_hour = edit(4, 2, alarm1_hour); alarm1_minute = edit(7, 2, alarm1_minute); alarm1_status = edit(17, 2, alarm1_status); i = 5; alarm2_hour = edit(4, 3, alarm2_hour); alarm2_minute = edit(7, 3, alarm2_minute); alarm2_status = edit(17, 3, alarm2_status); alarm1_minute = ((alarm1_minute / 10) << 4) + (alarm1_minute % 10); alarm1_hour = ((alarm1_hour / 10) << 4) + (alarm1_hour % 10); alarm2_minute = ((alarm2_minute / 10) << 4) + (alarm2_minute % 10); alarm2_hour = ((alarm2_hour / 10) << 4) + (alarm2_hour % 10); // Write alarms data to DS3231 Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address Wire.write(7); // Send register address (alarm1 seconds) Wire.write(0); // Write 0 to alarm1 seconds Wire.write(alarm1_minute); // Write alarm1 minutes value to DS3231 Wire.write(alarm1_hour); // Write alarm1 hours value to DS3231 Wire.write(0x80); // Alarm1 when hours, minutes, and seconds match Wire.write(alarm2_minute); // Write alarm2 minutes value to DS3231 Wire.write(alarm2_hour); // Write alarm2 hours value to DS3231 Wire.write(0x80); // Alarm2 when hours and minutes match Wire.write(4 | alarm1_status | (alarm2_status << 1)); // Write data to DS3231 control register (enable interrupt when alarm) Wire.write(0); // Clear alarm flag bits Wire.endTransmission(); // Stop transmission and release the I2C bus delay(200); // Wait 200ms } if(!digitalRead(button2) && digitalRead(alarm_pin)){ // When button B2 pressed with alarm (Reset and turn OFF the alarm) digitalWrite(alarm_pin, LOW); // Turn OFF the alarm indicator Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address Wire.write(0x0E); // Send register address (control register) // Write data to control register (Turn OFF the occurred alarm and keep the other as it is) Wire.write(4 | (!bitRead(status_reg, 0) & alarm1_status) | ((!bitRead(status_reg, 1) & alarm2_status) << 1)); Wire.write(0); // Clear alarm flag bits Wire.endTransmission(); // Stop transmission and release the I2C bus } DS3231_read(); // Read time and calendar parameters from DS3231 RTC alarms_read_display(); // Read and display alarms parameters DS3231_display(); // Display time & calendar delay(50); // Wait 50ms }
Poject Photo
0 Comments
Newer
Older
ESP32 Interfacing With LDR Sensor
How To Make RFID & Keypad Based Door Lock
Ultrasonic Sensor as a Counter with Arduino
IoT Based Patient Health Monitoring System Using Blynk App
How to Make Gas Leak Detector & Auto Exhaust Fan Using Arduino
MLX90614 Non-Contact Infrared Thermometer With Arduino
Measure CO2 Level in Air Using Arduino
Esp32 Cam Based Face Unlock
ESP32 Led Blink With Push Button
Smart Street Light Using Arduino
YouTube
Like on Facebook
Follow on Twitter
Follow on Google+
Follow on Instagram
Subscribe on Youtube
Hi WelCome To My Website If you have a creative mind and want to learn Electronics even without studying it then FRIENDS this Website And Youtube Channel is for you, I am crazy creators who love making Electronics things. I have a bunch of more than 130 Tutorial Videos on My YouTube Channel and I upload a new Tutorial every Sunday.
Tags
Arduino Project
Esp32 Project
Esp8266 Project
0 Comments