#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,20,4);
#define DS1307_ADDRESS 0x68 // I2C address of DS1307
const int button1=3, button2=5, button3=6;
int b=18;
//bool Show_Alarm_1_Hour = true;
unsigned long lastBlinkTrack = 0, lastBlinkTrackyyy = 0; // Last time colon toggled
const unsigned long AlarmblinkInterval = 1000; // 1 second
byte Alarm_1_Hour, Alarm_2_Hour, Alarm_1_Minute, Alarm_2_Minute, Alarm_3_Hour, Alarm_3_Hour, Alarm_4_Minute, Alarm_4_Minute, Alarm_5_Hour, Alarm_6_Hour, Alarm_7_Minute, Alarm_7_Minute, Alarm_8_Hour, Alarm_8_Hour, Alarm_1_Minute, Alarm_2_Minute;
void writeToRTC(int address, byte data) {
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(address); // SRAM address (0x08 to 0x3F)
Wire.write(data); // Data byte
Wire.endTransmission();
}
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(4,OUTPUT); //Set the BUZZER pin as output pin
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
lcd.begin (20,4); // initialize the lcd
lcd.backlight(); //To Power ON the back light
if (! rtc.begin()) {
lcd.print("RTC not found");
while (1);
}
if (! rtc.isrunning()){
lcd.print("RTC is OFF!");
}
// Example: Write value 123 to SRAM address 0x08
writeToRTC(0x08, 1);
writeToRTC(0x09, 1);
writeToRTC(0x0A, 2);
writeToRTC(0x0B, 2);
writeToRTC(0x0C, 3);
writeToRTC(0x0D, 3);
writeToRTC(0x0E, 4);
writeToRTC(0x0F, 4);
writeToRTC(0x10, 5);
writeToRTC(0x11, 5);
writeToRTC(0x12, 6);
writeToRTC(0x13, 6);
writeToRTC(0x14, 7);
writeToRTC(0x15, 7);
writeToRTC(0x16, 8);
writeToRTC(0x17, 8);
//lcd.print("Data written.");
Copy_Alarm();
}
byte readFromRTC(int address) {
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 1);
return Wire.available() ? Wire.read() : 0;
}
void loop() {
if(!digitalRead(button2) && b==18){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
lastBlinkTrackyyy = millis();
Display_Alarm_Screen() ;
b=0;
}
if (millis() - lastBlinkTrackyyy >= 3000 && b==0){
b=18;
lcd.clear();
}
// Alarm 1 -------------------------
if(!digitalRead(button1) && b==0){ // If button 1 is pressed and A equal to 0 GOTO set hour portal
b=1;
lcd.clear();
Display_Alarm_1_Hour_Screen() ;
delay(200);
}
if(!digitalRead(button2) && b==1){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
Alarm_1_Hour=Alarm_1_Hour+1;
Display_Alarm_1_Hour_Screen() ;
delay(200);
}
if(!digitalRead(button1) && b==1){ // If button 1 is pressed and A equal to 0 GOTO set hour portal
b=2;
Display_Alarm_1_Hour_Screen() ;
Display_Alarm_1_Minute_Screen();
delay(200);
}
if(!digitalRead(button2) && b==2){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
Alarm_1_Minute=Alarm_1_Minute+1;
Display_Alarm_1_Minute_Screen() ;
delay(200);
}
// Alarm 1 End ---------------------------------------------
// Alarm 2 -------------------------
if(!digitalRead(button1) && b==2){ // If button 1 is pressed and A equal to 0 GOTO set hour portal
b=3;
lcd.clear();
Display_Alarm_2_Hour_Screen() ;
delay(200);
}
if(!digitalRead(button2) && b==3){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
Alarm_2_Hour=Alarm_2_Hour+1;
Display_Alarm_2_Hour_Screen() ;
delay(200);
}
if(!digitalRead(button1) && b==3){ // If button 1 is pressed and A equal to 0 GOTO set hour portal
b=4;
Display_Alarm_2_Hour_Screen() ;
Display_Alarm_2_Minute_Screen();
delay(200);
}
if(!digitalRead(button2) && b==4){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
Alarm_2_Minute=Alarm_2_Minute+1;
Display_Alarm_2_Minute_Screen() ;
delay(200);
}
// Alarm 2 End ---------------------------------------------
if(!digitalRead(button3) ){ // If button 2 is pressed and A equal to 0 GOTO set hour portal
Save_Alarm();
b=18;
lcd.clear();
}
}
//*********************************************************************
// COPY ALARM (FUNCTION)
//*********************************************************************
void Copy_Alarm(){
Alarm_1_Hour = readFromRTC(0x08);
Alarm_1_Minute = readFromRTC(0x09);
Alarm_2_Hour = readFromRTC(0x0A);
Alarm_2_Minute = readFromRTC(0x0B);
Alarm_3_Hour = readFromRTC(0x0C);
Alarm_3_Minute = readFromRTC(0x0D);
Alarm_4_Hour = readFromRTC(0x0E);
Alarm_4_Minute = readFromRTC(0x0F);
Alarm_5_Hour = readFromRTC(0x18);
Alarm_5_Minute = readFromRTC(0x11);
Alarm_6_Hour = readFromRTC(0x12);
Alarm_6_Minute = readFromRTC(0x13);
Alarm_7_Hour = readFromRTC(0x14);
Alarm_7_Minute = readFromRTC(0x15);
Alarm_8_Hour = readFromRTC(0x16);
Alarm_8_Minute = readFromRTC(0x17);
}
//*********************************************************************
// DISPLAY ALARM SCREEN (FUNCTION)
//*********************************************************************
void Display_Alarm_Screen(){
lcd.setCursor(0, 0);
lcd.print("A1[");
lcd.print(Alarm_1_Hour);
lcd.print(":");
lcd.print(Alarm_1_Minute);
lcd.print("] A2[");
lcd.print(Alarm_2_Hour);
lcd.print(":");
lcd.print(Alarm_2_Minute);
lcd.print("]");
}
//*********************************************************************
// ALARM 1 HOUR SCREEN (FUNCTION)
//*********************************************************************
void Display_Alarm_1_Hour_Screen(){
char SetAlarmOneHour [4];
lcd.setCursor(0, 0); // Time MINUTE display pattern
lcd.print("SET ALARM 1");
lcd.setCursor(1, 1);
lcd.print("HOUR - ");
sprintf(SetAlarmOneHour, "%02d", Alarm_1_Hour); // Convert numbers into two digits
lcd.print(SetAlarmOneHour);
}
void Display_Alarm_1_Minute_Screen(){
char SetAlarmOneMinute [4];
lcd.setCursor(1, 2);
lcd.print("MINUTE - ");
sprintf(SetAlarmOneMinute, "%02d", Alarm_1_Minute); // Convert numbers into two digits
lcd.print(SetAlarmOneMinute);
}
//*********************************************************************
// ALARM 2 HOUR SCREEN (FUNCTION)
//*********************************************************************
void Display_Alarm_2_Hour_Screen(){
char SetAlarmTwoHour [4];
lcd.setCursor(0, 0); // Time MINUTE display pattern
lcd.print("SET ALARM 2");
lcd.setCursor(1, 1);
lcd.print("HOUR - ");
sprintf(SetAlarmTwoHour, "%02d", Alarm_2_Hour); // Convert numbers into two digits
lcd.print(SetAlarmTwoHour);
}
void Display_Alarm_2_Minute_Screen(){
char SetAlarmTwoMinute [4];
lcd.setCursor(1, 2);
lcd.print("MINUTE - ");
sprintf(SetAlarmTwoMinute, "%02d", Alarm_2_Minute); // Convert numbers into two digits
lcd.print(SetAlarmTwoMinute);
}
//*********************************************************************
// SAVE ALARM (FUNCTION)
//*********************************************************************
void Save_Alarm(){
writeToRTC(0x08, Alarm_1_Hour);
writeToRTC(0x09, Alarm_1_Minute);
writeToRTC(0x0A, Alarm_2_Hour);
writeToRTC(0x0B, Alarm_2_Minute);
writeToRTC(0x0C, Alarm_3_Hour);
writeToRTC(0x0D, Alarm_3_Minute);
writeToRTC(0x0E, Alarm_4_Hour);
writeToRTC(0x0F, Alarm_4_Minute);
writeToRTC(0x18, Alarm_5_Hour);
writeToRTC(0x11, Alarm_5_Minute);
writeToRTC(0x12, Alarm_6_Hour);
writeToRTC(0x13, Alarm_6_Minute);
writeToRTC(0x14, Alarm_7_Hour);
writeToRTC(0x15, Alarm_7_Minute);
writeToRTC(0x16, Alarm_8_Hour);
writeToRTC(0x17, Alarm_8_Minute);
}