#include "ST7565.h"
ST7565 glcd(9, 8, 7, 6, 5);
#include <Wire.h>
#include "RTClib.h"
int buttonPushCounter=-1;
int buttonPin=2;
int ledPin =13;
int pot, alarmState=0;
int lightStartTime = 20;
int Hr, Min, timeHr1, timeHr2, timeMin1, timeMin2, alarmHr1, alarmHr2, alarmMin1, alarmMin2, alarmHr, alarmMin;
RTC_DS1307 rtc;

void setup(){
  digitalWrite(ledPin, HIGH);
  glcd.begin(0x18);
  glcd.clear();
  glcd.drawstring(36,4,"RAGSALARM");
  glcd.display();
  Wire.begin();
  rtc.begin();
  attachInterrupt(0, buttonPush, RISING);
//rtc.adjust(DateTime(__DATE__, __TIME__));
}

void loop(){
  
  switch(buttonPushCounter){
    case 0: {
      if(alarmState==0){
  glcd.clear();
  displayTime();
  glcd.drawstring(36,6,"ALARM OFF");
  glcd.display();
  delay(10);
    }
    
    else if(alarmState==1){
  glcd.clear();
  displayTime();
  glcd.drawstring(18,6,"ALARM AT");
  glcd.drawchar(80, 6, alarmHr1+48);
  glcd.drawchar(86, 6, alarmHr2+48);
  glcd.drawstring(92,6,":");
  glcd.drawchar(98, 6, alarmMin1+48);
  glcd.drawchar(104, 6, alarmMin2+48);
  glcd.display();
  delay(10);
  alarmHr=(alarmHr1*10)+alarmHr2;
  alarmMin=(alarmMin1*10)+alarmMin2;  
  if(alarmHr-Hr==1 || Hr-alarmHr==23){
    if((alarmMin+60)-Min<=lightStartTime){
      digitalWrite(ledPin,LOW);
      Serial.println("alarmOn");
    }
  }
  
  if(alarmHr-Hr==0){
    if(alarmMin-Min<=lightStartTime && alarmMin-Min>0){
      digitalWrite(ledPin,LOW);
      Serial.println("alarmOn");
    }
  }
  
  if(alarmHr-Hr==0&&alarmMin-Min==0){
      Serial.println("alarmOn");    
    playMusicAndLight(); 
  }
    }
    }
    break;
    
    case 1: {
  digitalWrite(ledPin,HIGH);
  glcd.clear();
  glcd.drawstring(20,4,"ALARM    OFF ON");
  pot=analogRead(A0);
  pot=map(pot, 0, 1023, 1, 3);
  Serial.println(pot);
  if(pot==1){
  glcd.drawline(74, 41, 88, 41, BLACK);
  alarmState=0;
  }
  else if(pot==2){
  glcd.drawline(97, 41, 108, 41, BLACK);
  alarmState=1;
  }
  glcd.display();
  delay(10);
    }
    break;
    
  case 2:{
  pot=analogRead(A0);
  pot=map(pot, 0, 1023, 0, 3);
  glcd.clear();
  alarmHr1=pot;
  bigNumber(alarmHr1, 15);
  bigNumber(alarmHr2, 35);
  bigNumber(alarmMin1, 60);
  bigNumber(alarmMin2, 80);
  glcd.drawstring(36,6,"ALARM SET");
  glcd.display();  
  delay(1);
  }
  break;
  
  case 3:{
  pot=analogRead(A0);
  pot=map(pot, 0, 1023, 0, 10);
  glcd.clear();
  alarmHr2=pot;
  bigNumber(alarmHr1, 15);
  bigNumber(alarmHr2, 35);
  bigNumber(alarmMin1, 60);
  bigNumber(alarmMin2, 80);
  glcd.drawstring(36,6,"ALARM SET");
  glcd.display();  
  delay(1);
  }
  break;
  
   case 4:{
  pot=analogRead(A0);
  pot=map(pot, 0, 1023, 0, 6);
  glcd.clear();
  alarmMin1=pot;
  bigNumber(alarmHr1, 15);
  bigNumber(alarmHr2, 35);
  bigNumber(alarmMin1, 60);
  bigNumber(alarmMin2, 80);
  glcd.drawstring(36,6,"ALARM SET");
  glcd.display();  
  delay(1);
  }
  break;
  
   case 5:{
  pot=analogRead(A0);
  pot=map(pot, 0, 1023, 0, 10);
  glcd.clear();
  alarmMin2=pot;
  bigNumber(alarmHr1, 15);
  bigNumber(alarmHr2, 35);
  bigNumber(alarmMin1, 60);
  bigNumber(alarmMin2, 80);
  glcd.drawstring(36,6,"ALARM SET");
  glcd.display();  
  delay(1);
  }
  break;
  
  case 6:{
    buttonPushCounter=0;
    delay(1);
  }
  break;
     
}
}




void buttonPush()
{
  if(digitalRead(buttonPin)==HIGH){
  delayMicroseconds(1300) ;
   if(digitalRead(buttonPin)==HIGH){
     buttonPushCounter++;
   }
  }
}

void displayTime(){
  DateTime now = rtc.now();
  Hr=(now.hour());
  Min=(now.minute());
  Serial.println(Hr);
  timeHr2=(Hr%10);
  timeHr1=((Hr-timeHr2)/10);
  timeMin2=(Min%10);
  timeMin1=((Min-timeMin2)/10);
  Serial.println(timeHr2);
  bigNumber(timeHr1, 15);
  bigNumber(timeHr2, 35);
  bigNumber(timeMin1, 60);
  bigNumber(timeMin2, 80);  
}

void bigNumber(int select, int offset){
  switch(select){
    case 0:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,10,10+offset,30, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
    
    case 1:
    glcd.drawline(10+offset,15,16+offset,10, BLACK);
    glcd.drawline(16+offset,10,16+offset,30, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    break;
    
    case 2:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,20,10+offset,30, BLACK);
    glcd.drawline(23+offset,10,23+offset,20, BLACK);
    break;
    
    case 3:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
    
    case 4:
    glcd.drawline(23+offset,10,23+offset,20, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,10,10+offset,20, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
    
    case 5:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,10,10+offset,20, BLACK);
    glcd.drawline(23+offset,20,23+offset,30, BLACK);
    break;
    
    case 6:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,10,10+offset,30, BLACK);
    glcd.drawline(23+offset,20,23+offset,30, BLACK);
    break;
    
    case 7:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
    
    case 8:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,10,10+offset,30, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
    
    case 9:
    glcd.drawline(10+offset,10,23+offset,10, BLACK);
    glcd.drawline(10+offset,30,23+offset,30, BLACK);
    glcd.drawline(10+offset,20,23+offset,20, BLACK);
    glcd.drawline(10+offset,10,10+offset,20, BLACK);
    glcd.drawline(23+offset,10,23+offset,30, BLACK);
    break;
  }
}
  
void playMusicAndLight(){
 for(int i=0; i<10000000; i++){
 if(buttonPushCounter==0){
    digitalWrite(ledPin, LOW);
tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,1175,250);

delay(325);

noTone(10);

if(buttonPushCounter==0){

tone(10,0,125);

delay(162);

noTone(10);



tone(10,1047,250);

delay(325);

noTone(10);



tone(10,1047,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,988,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,698,250);

delay(325);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,1175,250);

delay(325);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,1047,250);

delay(325);

noTone(10);



tone(10,1047,125);

delay(162);

noTone(10);



tone(10,988,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);


if(buttonPushCounter==0){
tone(10,0,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,698,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);


if(buttonPushCounter==0){
tone(10,587,125);

delay(162);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,784,125);

delay(162);

noTone(10);



tone(10,880,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,62);

delay(80);

noTone(10);
if(buttonPushCounter==0){


tone(10,587,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);
if(buttonPushCounter==0){


tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);

if(buttonPushCounter==0){

tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,587,250);

delay(325);

noTone(10);



tone(10,494,250);

delay(325);

noTone(10);



tone(10,494,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);
if(buttonPushCounter==0){


tone(10,784,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);

if(buttonPushCounter==0){

tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);


if(buttonPushCounter==0){
tone(10,587,125);

delay(162);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,0,62);

delay(80);

noTone(10);


if(buttonPushCounter==0){
tone(10,587,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,1175,250);

delay(325);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,1047,250);

delay(325);

noTone(10);



tone(10,1047,125);

delay(162);

noTone(10);



tone(10,988,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);

if(buttonPushCounter==0){

tone(10,0,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);


if(buttonPushCounter==0){
tone(10,587,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,1175,250);

delay(325);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,1047,250);

delay(325);

noTone(10);



tone(10,1047,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,988,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);


if(buttonPushCounter==0){
tone(10,523,125);

delay(162);

noTone(10);



tone(10,698,250);

delay(325);

noTone(10);



tone(10,659,250);

delay(325);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,587,250);

delay(325);

noTone(10);



tone(10,523,250);

delay(325);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,587,250);

delay(325);

noTone(10);



tone(10,659,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);
if(buttonPushCounter==0){


tone(10,587,250);

delay(325);

noTone(10);



tone(10,523,250);

delay(325);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,523,125);

delay(162);

noTone(10);



tone(10,784,125);

delay(162);

noTone(10);



tone(10,587,500);

delay(650);

noTone(10);



tone(10,0,125);

delay(162);

noTone(10);

if(buttonPushCounter==0){

tone(10,659,125);

delay(162);

noTone(10);



tone(10,698,125);

delay(162);

noTone(10);



tone(10,659,125);

delay(162);

noTone(10);



tone(10,587,125);

delay(162);

noTone(10);



tone(10,587,250);

delay(325);

noTone(10);



tone(10,523,1000);

delay(1300);

noTone(10);

  }
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  
  
 else {break;}
 }
}
  
