ALARMA CON RTC

HOLA
He estado haciendo un reloj automatizado para la escuela de mi mamá. con varias horas para que suene el timbre
Ya he conectado el Rele, El lcd 16*2, el I2c y el RTC. los botones
pero al momento de compilar no puedo cambiar la hora de las alarmas
y cuando pongo que me muestre los diferentes horarios al final se queda en blanco y no regresa a la hora normal.

Psdt: Soy nuevo en esto.

reloj2.ino (43.8 KB)

hice este reloj alarma con opción para colocar varias alarmas
me aparece la hora. pero al momento de ingresar al menú y querer cambiar las horas de las alarmas con los botones no se puede. me podrían ayudar.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"


LiquidCrystal_I2C lcd(0X3F,16,2); // inicializa la interfaz I2C del LCD 16x2
RTC_DS1307 RTC;                       // inicializa el modulo RTC

int r_diaSemana;                     // almacena el resultado del dia de la semana calculado
const int timbre = 7;             // Pin 7 encargado de activar el timbre, se conecta al Rele
const int Pulsador_modo=2;
const int Pulsador_up=3;
const int Pulsador_down=4;
const int Pulsador_edit=5;

int horas;
int minutos;
int segundos;
volatile boolean actualizar=true;
int tiempo_timbre=7000; // Tiempo continuo que dura el timbre sonando, en milisegundos 7000 = 7 segundos

boolean alarmaOn=false;

int horas_alarma=0;
int minutos_alarma=0;
int horas_alarma2=0;
int minutos_alarma2=0;

char texto[10];
int modo=0;
int seleccion=0;


int estado;
int modo_alarma=0;
const int Y=16; 


const int A=4;
const int B=4;

////////////////////////////////// Void Setup() ///////////
void setup() {
  // put your setup code here, to run once:
pinMode(timbre, OUTPUT);                    // Configura como salida el pin 7
Wire.begin(); 
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Lee la fecha y hora del PC (Solo en la primera carga)

Serial.begin(9600);                 // Establece la velocidad de datos del puerto serie a 9600
lcd.init();
lcd.backlight();                    // Coloca luz de fondo al LCD
lcd.clear();                        // Borra el  LCD

pinMode(Pulsador_modo, INPUT); 
pinMode(Pulsador_up, INPUT); 
pinMode(Pulsador_down, INPUT);
pinMode(Pulsador_edit, INPUT);
}

/////////////////////////////// CAMBIAR HORA //////////////////////////////////

// alarma1
void incrementarHorasAlarma(){
  horas_alarma++;
  horas_alarma= horas%24;
  actualizar=true;
  
}
void decrementarHorasAlarma(){
  horas_alarma--;
  if(horas_alarma<0){
    horas_alarma=23;
  }
  actualizar=true;
}
void incrementarMinutosAlarma(){
  minutos_alarma++;
  minutos_alarma= minutos%60;
  actualizar=true;
}
void decrementarMinutosAlarma(){
  minutos_alarma--;
  if(minutos_alarma<0){
    minutos_alarma=59;
  }
  actualizar=true;
}

// alarma 2
void incrementarHorasAlarma2(){
  horas_alarma2++;
  horas_alarma2= horas%24;
  actualizar=true;
}
void decrementarHorasAlarma2(){
  horas_alarma2--;
  if(horas_alarma2<0){
    horas_alarma2=23;
  }
  actualizar=true;
}
void incrementarMinutosAlarma2(){
  minutos_alarma2++;
  minutos_alarma2= minutos%60;
  actualizar=true;
}
void decrementarMinutosAlarma2(){
  minutos_alarma2--;
  if(minutos_alarma2<0){
    minutos_alarma2=59;
  }
  actualizar=true;
}


void fijarCursorModo(){
  switch(seleccion){
    case 0:
    lcd.noBlink();
    break;
    case 1:
     lcd.setCursor(0,1);
    lcd.blink();
    break;
    case 2:
    lcd.setCursor(3,1);
    lcd.blink();
    break;
    case 3:
    lcd.setCursor(6,1);
    lcd.blink();
    break;

  }
}
/////////////////////////////// menu//////////////////////////////////
void menuPrincipal()
{

do{
 // Código de las acciones del menú Dos.
 if(digitalRead(Pulsador_modo)==HIGH){
  modo_alarma++;
  modo_alarma = modo_alarma % Y;
  fijarCursorModo();
  while(digitalRead(Pulsador_modo)==HIGH);
}
switch(modo_alarma)
{
  case 1: lcd.clear(); 
  alarma1(); // alarma 1
  lcd.clear();
  break;
  case 2: lcd.clear(); 
  alarma2(); // alarma 2
  lcd.clear();
  break;

}
}while(digitalRead(Pulsador_edit) != HIGH);
}

void alarma1()
{
if(digitalRead(Pulsador_edit)==HIGH){
  seleccion++;
  seleccion = seleccion % A;
  fijarCursorModo();
  while(digitalRead(Pulsador_edit)==HIGH);
}
lcd.setCursor(0, 0); lcd.print("Alarma 1"); //Mostramos el menu en el LCD.
lcd.setCursor(0,1); 
sprintf(texto, "%02d:%02d", horas_alarma, minutos_alarma); //las horas tendran 2 digitos 
lcd.print(texto);

switch (seleccion){
   case 1: 
  if(digitalRead(Pulsador_up)==HIGH){
    incrementarHorasAlarma();
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
  decrementarHorasAlarma();
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
   case 2: 
  if(digitalRead(Pulsador_up)==HIGH){
    incrementarMinutosAlarma();
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
   decrementarMinutosAlarma();
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
  case 3:
  if(digitalRead(Pulsador_up)==HIGH){
    alarmaOn=true;
    actualizar=true;
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
   alarmaOn=false;
   actualizar=true;
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
  
}

if(alarmaOn == true){
  lcd.print(" ON"); 
}else{
  lcd.print(" OFF");
}
}


void alarma2()
{
  lcd.setCursor(0, 0); lcd.print("Alarma 2"); //Mostramos el menu en el LCD.
lcd.setCursor(0,1); 
 sprintf(texto, "%02d:%02d", horas_alarma2, minutos_alarma2); //las horas tendran 2 digitos 
lcd.print(texto);
  if(digitalRead(Pulsador_edit)==HIGH){
  seleccion++;
  seleccion = seleccion % B;
  fijarCursorModo();
  while(digitalRead(Pulsador_edit)==HIGH);
}
switch (seleccion){
   case 1: 
  if(digitalRead(Pulsador_up)==HIGH){
    incrementarHorasAlarma2();
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
    decrementarHorasAlarma2();
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
   case 2: 
  if(digitalRead(Pulsador_up)==HIGH){
    incrementarMinutosAlarma2();
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
   decrementarMinutosAlarma2();
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
  case 3:
  if(digitalRead(Pulsador_up)==HIGH){
    alarmaOn=true;
    actualizar=true;
    while(digitalRead(Pulsador_up)==HIGH);
  }
  if(digitalRead(Pulsador_down)==HIGH){
   alarmaOn=false;
   actualizar=true;
    while(digitalRead(Pulsador_down)==HIGH);
  }
  break;
}

if(alarmaOn == true){
  lcd.print(" ON"); 
}else{
  lcd.print(" OFF");
}
}


////////////////////////////////// Void loop() ///////////
void loop (){
 DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
  
 Serial.print(now.year(), DEC);  // A¤o
 Serial.print('/');
 Serial.print(now.month(), DEC); // Mes
 Serial.print('/');
 Serial.print(now.day(), DEC);   // Dia
 Serial.print(' ');
 Serial.print(now.hour(), DEC);  // Horas
 Serial.print(':');
 Serial.print(now.minute(), DEC); // Minutos
 Serial.print(':');
 Serial.print(now.second(), DEC); // Segundos
 Serial.println();
 
 lcd.setCursor(0,0);
 lcd.print("D:");
 lcd.print(now.year(), DEC);
 lcd.print("/");
 lcd.print(now.month(), DEC);
 lcd.print("/");
 lcd.print(now.day(), DEC);
 lcd.print(" ");
 lcd.setCursor(0,1);
 lcd.print("T: ");
 lcd.print(now.hour(), DEC);
 lcd.print(":");
 lcd.print(now.minute(), DEC);
 lcd.print(":");
 lcd.print(now.second(), DEC);
  delay(1000);
 lcd.setCursor(0,0);
 lcd.print("              ");
 lcd.setCursor(0,1);
 lcd.print("              ");

 if(digitalRead(Pulsador_modo)==HIGH){
  menuPrincipal();
 }


int r_diaSemana=dia_de_semana(); 
if ((r_diaSemana == 6 || r_diaSemana == 0)){  // si es fin de semana no hace nada
alarmaOn=false;
digitalWrite(timbre, LOW); 
 }

 if (now.hour()==horas_alarma  && now.minute() ==minutos_alarma && now.second()==0 && alarmaOn==true)
 {
 lcd.clear();
 lcd.setCursor(2,0);
 lcd.print("Encendido");
 activar_timbre();
 }

}

/////////////////////////////// Funcion que activa el Timbre //////////////////////////////////
void activar_timbre(){
    digitalWrite(timbre, HIGH); 
    lcd.setCursor(0,0);
    Serial.println("Timbre Activo");
    delay(tiempo_timbre); 
}