/* :Project:Allarm_Clock :Author: Tiziano Bianchettin :Date: 10/02/2017 :Revision: 2 :License: Public Domain thanks to: http://arduinoenonsolo.blogspot.it/2012/12/orologio-con-arduino-e-il-ds1307.html http://www.mauroalfieri.it/ http://www.danielealberti.it/ http://www.maffucci.it/ My electronics laboratory professor "Perito Carli" //The following code was edited in order to be compatible with a 2x16 LCD display //as well as a DS1307 RTC //***********libraries**************/ #include #include #include //************************************// LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7) RTC_DS3231 RTC; //************Button*****************// int P1=8; // Button SET MENU' int P2=9; // Button + int P3=10; // Button - int P4=11; // SWITCH Alarm //**************Alarm***************// #define LED 12 #define buzzer 13 //************Variables**************// int hourupg; int minupg; //int yearupg; //int monthupg; //int dayupg; int menu =0; int setAll =0; uint8_t alarmHours = 0, alarmMinutes = 0; // Holds the current alarm time void setup() { lcd.begin(16,2); lcd.clear(); pinMode(P1,INPUT_PULLUP); // https://www.arduino.cc/en/Tutorial/InputPullupSerial pinMode(P2,INPUT_PULLUP); pinMode(P3,INPUT_PULLUP); pinMode(P4,INPUT_PULLUP); pinMode(LED,OUTPUT); pinMode(buzzer, OUTPUT); // Set buzzer as an output printAllOff(); Serial.begin(9600); Wire.begin(); RTC.begin(); if (! RTC.begin()) { Serial.println(" RTC Module not Present"); while (1); } if (RTC.lostPower()) { Serial.println("RTC power failure, reset the time!"); RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); } int menu=0; } void loop() { // check if you press the SET button and increase the menu index if(digitalRead(P1)== LOW) { menu=menu+1; } if((digitalRead(P2)== LOW)&&(digitalRead(P3)== LOW)) { DisplaySetHourAll(); DisplaySetMinuteAll(); lcd.clear(); lcd.setCursor(0,0); lcd.print("ALARM IS SET"); lcd.setCursor(0,1); lcd.print(alarmHours, DEC); lcd.print(":"); lcd.print(alarmMinutes, DEC); delay(1000); lcd.clear(); } // in which subroutine should we go? if (menu==0) { DisplayDateTime(); // void DisplayDateTime Alarm(); // Alarm control } if (menu==1) { DisplaySetHour(); } if (menu==2) { DisplaySetMinute(); } if (menu==3) { StoreAgg(); delay(500); menu=0; } delay(100); } void DisplayDateTime () { // We show the current date and time DateTime now = RTC.now(); lcd.setCursor(0, 0); lcd.print("Hour : "); if (now.hour()<=9) { lcd.print("0"); } lcd.print(now.hour(), DEC); hourupg=now.hour(); lcd.print(":"); if (now.minute()<=9) { lcd.print("0"); } lcd.print(now.minute(), DEC); minupg=now.minute(); lcd.print(":"); if (now.second()<=9) { lcd.print("0"); } lcd.print(now.second(), DEC); } void DisplaySetHour() { // time setting lcd.clear(); DateTime now = RTC.now(); if(digitalRead(P2)==LOW) { if(hourupg==23) { hourupg=0; } else { hourupg=hourupg+1; } } if(digitalRead(P3)==LOW) { if(hourupg==0) { hourupg=23; } else { hourupg=hourupg-1; } } lcd.setCursor(0,0); lcd.print("Set time:"); lcd.setCursor(0,1); lcd.print(hourupg,DEC); delay(200); } void DisplaySetMinute() { // Setting the minutes lcd.clear(); if(digitalRead(P2)==LOW) { if (minupg==59) { minupg=0; } else { minupg=minupg+1; } } if(digitalRead(P3)==LOW) { if (minupg==0) { minupg=59; } else { minupg=minupg-1; } } lcd.setCursor(0,0); lcd.print("Set Minutes:"); lcd.setCursor(0,1); lcd.print(minupg,DEC); delay(200); } void StoreAgg() { // Variable saving lcd.clear(); lcd.setCursor(0,0); lcd.print("SAVING IN"); lcd.setCursor(0,1); lcd.print("PROGRESS"); RTC.adjust(DateTime(0,0,0,hourupg,minupg,0)); delay(200); } void DisplaySetHourAll()// Setting the alarm minutes { while(digitalRead(P1)==HIGH){ lcd.clear(); if(digitalRead(P2)==LOW) { if(alarmHours==23) { alarmHours=0; } else { alarmHours=alarmHours+1; } } if(digitalRead(P3)==LOW) { if(alarmHours==0) { alarmHours=23; } else { alarmHours=alarmHours-1; } } lcd.setCursor(0,0); lcd.print("Set HOUR Alarm:"); lcd.setCursor(0,1); lcd.print(alarmHours,DEC); delay(200); } delay(200); } void DisplaySetMinuteAll()// Setting the alarm minutes { while(digitalRead(P1)==HIGH){ lcd.clear(); if(digitalRead(P2)==LOW) { if (alarmMinutes==59) { alarmMinutes=0; } else { alarmMinutes=alarmMinutes+1; } } if(digitalRead(P3)==LOW) { if (alarmMinutes==0) { alarmMinutes=59; } else { alarmMinutes=alarmMinutes-1; } } lcd.setCursor(0,0); lcd.print("Set MIN. Alarm:"); lcd.setCursor(0,1); lcd.print(alarmMinutes,DEC); delay(200); } delay(200); } void printAllOn(){ lcd.setCursor(0,3); lcd.print("Alarm: "); if (alarmHours <= 9) { lcd.print("0"); } lcd.print(alarmHours, DEC); lcd.print(":"); if (alarmMinutes <= 9) { lcd.print("0"); } lcd.print(alarmMinutes, DEC); } void printAllOff() { lcd.setCursor(0, 3); lcd.print("Alarm: Off "); } void Alarm(){ if(digitalRead(P4)== LOW) { setAll=setAll+1; } if (setAll==0) { printAllOff(); noTone (buzzer); digitalWrite(LED,LOW); } if (setAll==1) { printAllOn(); DateTime now = RTC.now(); if ( now.hour() == alarmHours && now.minute() == alarmMinutes ) { DateTime now = RTC.now(); digitalWrite(LED,HIGH); tone(buzzer,880); //play the note "A5" (LA5) delay (300); tone(buzzer,698); //play the note "F6" (FA5) } else{ noTone (buzzer); digitalWrite(LED,LOW); } } if (setAll==2) { setAll=0; } delay(200); }