Problema con reloj RTC y menu lcd para temporizador

Hola,soy novato en programacio y estoy haciendo un reloj con el modulo DS3231, el cual me funciona bien, entonces quiero colocar 2 temporizadores lo hice de la siguiente manera cree un registro y guardo la hora para compararla con el reloj a traves de unos pulsadores; modo1, modo2, horas y minutos. Cuando pulso modo1 deveria desplegar la pantalla para colocar la hora de encendido1 o alarma on1 al soltar y presionar nuevamente deveria desplegar la opcion de programar la hora de encendido2 o alarma on2, cuando presiono el pulsador de modo2 deveria desplegar la pantalla para programar la hora de apagado1 o alarma off1 y al oprimir el pulsador nuevamente deberia desplegar la pantalla para programar la hora de apagado2 o alarma off2, los pulsadores hora y minutos son para incrementar las horas y los minutos dentro de cada registro a comparar. Para determinar si prender o apagar una salida en el arduino, pero en el momento de programar la hora del temporizador no puedo hacer que el lcd muestre la pantalla para programar la hora de la alarma de prendido o apagado ya que dura un pequeño instante y luego retorna al reloj.

¿como puedo hacer que al pulsar modo1 el lcd pase a la pantalla para programar la hora respectiva de encendido o apagado y permanesca en ese menu hasta que el pulsador sea pulsado nuevamente pase a la siguiente alarma y por ultimo retorne y muestre la hora del reloj?

¿podria implementarlo mejor?

#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DS3231.h>

//Librería GitHub - jarzebski/Arduino-DS3231: DS3231 Real-Time-Clock

void printDetail(uint8_t type, int value);

//LCD**
LiquidCrystal_I2C lcd(0x27,16,2);
DS3231 clock;
RTCDateTime dt;

//############### BOTONERA ###############

int btnModoA = 1;
int btnModoB = 2;
int btnHoras = 3;
int btnMinutos = 4;

int HorasOn1;
int HorasOff1;
int MinutosOn1;
int MinutosOff1;

int HorasOn2;
int HorasOff2;
int MinutosOn2;
int MinutosOff2;

int HorasOn3;
int HorasOff3;
int MinutosOn3;
int MinutosOff3;

int HorasOn4;
int HorasOff4;
int MinutosOn4;
int MinutosOff4;

int btnModoA1;
int btnModoB1;
int ModoA;
int ModoB;

//#################### SALIDAS ################
int Led_1 = 9;
int Led_2 = 10;
int Led_3 = 11;
int Led_4 = 12;

//**************************************************************************

void setup()
{
Wire.begin();
clock.begin();
lcd.begin(16,2);
lcd.backlight();
clock.setDateTime(DATE, TIME); // aqui se programa la hora y fecha que tiene el pc

pinMode(btnModoA,INPUT_PULLUP);
pinMode(btnModoB,INPUT_PULLUP);
pinMode(btnHoras,INPUT_PULLUP);
pinMode(btnMinutos,INPUT_PULLUP);

pinMode(Led_1, OUTPUT);
pinMode(Led_2, OUTPUT);
pinMode(Led_3, OUTPUT);
pinMode(Led_4, OUTPUT);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void loop()
{
dt = clock.getDateTime();

// *****************Imprimir en el LCD ********************
lcd.clear();
lcd.setCursor(0,0);
switch(dt.dayOfWeek)
{
case 1: lcd.print(" Lunes"); break;
case 2: lcd.print(" Martes"); break;
case 3: lcd.print(" Miercoles"); break;
case 4: lcd.print(" Jueves"); break;
case 5: lcd.print(" Viernes"); break;
case 6: lcd.print(" Sabado"); break;
case 7: lcd.print(" Domingo");
}

//************************ LCD PRINT *************************+
lcd.print("/");
lcd.print(dt.day);
lcd.print("/ ");
int temperatura = clock.readTemperature();
lcd.print(temperatura);
lcd.print((char)223);
lcd.print("C");

//***************************************************

lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(dt.hour);
lcd.print(":");
if(dt.minute < 10) lcd.print("0");
lcd.print(dt.minute);
lcd.print(":");
if(dt.second < 10) lcd.print("0");
lcd.print(dt.second);
lcd.print("/");
lcd.print(dt.month);
lcd.print("/");
lcd.print(dt.year);
delay(500);
//******************* leer boton A ****************
//**************************************************
if(digitalRead(btnModoA) == HIGH)
{
ModoA = digitalRead(btnModoA);
ModoA = ModoA + 1;

switch(ModoA)
{
case 1:AlarmaOn_1();
break;
case 2:AlarmaOn_2();
break;
case 3:AlarmaOn_3();
break;
case 4:AlarmaOn_4();
break;
}
}
while(digitalRead(btnModoB)== HIGH)
{
ModoB = digitalRead(btnModoB);
ModoB = ModoB +1;
if(ModoB == 1)
{
AlarmaOff_1();
}
if(ModoB == 2)
{
AlarmaOff_2();
}
if(ModoB == 3)
{
AlarmaOff_3();
}
if(ModoB == 4)
{
AlarmaOff_4();
ModoB = 0;
}
}
}

//************************************************************
//****************************** PRENDER *********************

//############################### ALARMA_1 ##########################
void AlarmaOn_1()
{

lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 1 ON SET ");
lcd.setCursor(4,1);
lcd.print(HorasOn1);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOn1);
delay(500);
//**************************** horas set*************************

if (digitalRead(btnHoras))
{
HorasOn1 = HorasOn1 + 1;
}
if(HorasOn1 == 24)
{
HorasOn1 = 00;
delay(100);
}
//******************************* minuto set *************************
if (digitalRead(btnMinutos))
{
MinutosOn1 = MinutosOn1 + 1;
}
if(MinutosOn1 == 60)
{
MinutosOn1 = 00;
delay(100);
}

//**************************************************************
if ((dt.hour == HorasOn1) && (dt.minute == MinutosOn1))
{
digitalWrite(Led_1,HIGH);
}
}

//************************ APAGAR ******************

void AlarmaOff_1()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 1 OFF SET ");
lcd.setCursor(4,1);
lcd.print(HorasOff1);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOff1);
delay(500);

//*************************** horas off set ******************
if (digitalRead(btnHoras))
{
HorasOff1 = HorasOff1 + 1;
}
if(HorasOff1 == 24)
{
HorasOff1 = 00;
delay(100);
}

//******************************* minutos off set *************************

if (digitalRead(btnMinutos))
{
MinutosOff1 = MinutosOff1 + 1;
}
if(MinutosOff1 == 60)
{
MinutosOff1 = 00;
delay(100);
}
if ((dt.hour == HorasOff1) && (dt.minute == MinutosOff1))
{
digitalWrite(Led_1,LOW);
}
}

//#################################### ALARMA_2 #########################

void AlarmaOn_2()
{

lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 2 ON SET ");
lcd.setCursor(4,1);
lcd.print(HorasOn2);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOn2);
delay(500);
//**************************** horas set*************************

if (digitalRead(btnHoras))
{
HorasOn2 = HorasOn2 + 1;
}
if(HorasOn2 == 24)
{
HorasOn2 = 00;
delay(100);
}
//******************************* minuto set *************************
if (digitalRead(btnMinutos))
{
MinutosOn2 = MinutosOn2 + 1;
}
if(MinutosOn2 == 60)
{
MinutosOn2 = 00;
delay(100);
}

//**************************************************************
if ((dt.hour == HorasOn2) && (dt.minute == MinutosOn2))
{
digitalWrite(Led_2,HIGH);
}
}

//************************ APAGAR ******************

void AlarmaOff_2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 2 OFF SET ");
lcd.setCursor(4,1);
lcd.print(HorasOff2);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOff2);
delay(500);

//*************************** horas off set ******************
if (digitalRead(btnHoras))
{
HorasOff2 = HorasOff2 + 1;
}
if(HorasOff2 == 24)
{
HorasOff2 = 00;
delay(100);
}

//******************************* minutos off set *************************

if (digitalRead(btnMinutos))
{
MinutosOff2 = MinutosOff2 + 1;
}
if(MinutosOff2 == 60)
{
MinutosOff2 = 00;
delay(100);
}
if ((dt.hour == HorasOff2) && (dt.minute == MinutosOff2))
{
digitalWrite(Led_2,LOW);
}
}

//################################## ALARMA_3 ###############################################
void AlarmaOn_3()
{

lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 3 ON SET ");
lcd.setCursor(4,1);
lcd.print(HorasOn3);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOn3);
delay(500);
//**************************** horas set*************************

if (digitalRead(btnHoras))
{
HorasOn3 = HorasOn3 + 1;
}
if(HorasOn3 == 24)
{
HorasOn3 = 00;
delay(100);
}
//******************************* minuto set *************************
if (digitalRead(btnMinutos))
{
MinutosOn3 = MinutosOn3 + 1;
}
if(MinutosOn3 == 60)
{
MinutosOn3 = 00;
delay(100);
}

//**************************************************************
if ((dt.hour == HorasOn3) && (dt.minute == MinutosOn3))
{
digitalWrite(Led_3,HIGH);
}
}

//************************ APAGAR ******************

void AlarmaOff_3()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 3 OFF SET ");
lcd.setCursor(4,1);
lcd.print(HorasOff3);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOff3);
delay(500);

//*************************** horas off set ******************
if (digitalRead(btnHoras))
{
HorasOff3 = HorasOff3 + 1;
}
if(HorasOff3 == 24)
{
HorasOff3 = 00;
delay(100);
}

//******************************* minutos off set *************************

if (digitalRead(btnMinutos))
{
MinutosOff3 = MinutosOff3 + 1;
}
if(MinutosOff3 == 60)
{
MinutosOff3 = 00;
delay(100);
}
if ((dt.hour == HorasOff3) && (dt.minute == MinutosOff3))
{
digitalWrite(Led_3,LOW);
}
}

//################################## ALARMA_4 ###################
void AlarmaOn_4()
{

lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 4 ON SET ");
lcd.setCursor(4,1);
lcd.print(HorasOn4);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOn4);
delay(500);
//**************************** horas set*************************

if (digitalRead(btnHoras))
{
HorasOn4 = HorasOn4 + 1;
}
if(HorasOn4 == 24)
{
HorasOn4 = 00;
delay(100);
}
//******************************* minuto set *************************
if (digitalRead(btnMinutos))
{
MinutosOn4 = MinutosOn4 + 1;
}
if(MinutosOn4 == 60)
{
MinutosOn4 = 00;
delay(100);
}

//**************************************************************
if ((dt.hour == HorasOn4) && (dt.minute == MinutosOn4))
{
digitalWrite(Led_4,HIGH);
}
}

//************************ APAGAR ******************

void AlarmaOff_4()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ALARMA 4 OFF SET ");
lcd.setCursor(4,1);
lcd.print(HorasOff4);
lcd.setCursor(6,1);
lcd.print(" : ");
lcd.setCursor(9,1);
lcd.print(MinutosOff4);
delay(500);

//*************************** horas off set ******************
if (digitalRead(btnHoras))
{
HorasOff4 = HorasOff4 + 1;
}
if(HorasOff4 == 24)
{
HorasOff4 = 00;
delay(100);
}

//******************************* minutos off set *************************

if (digitalRead(btnMinutos))
{
MinutosOff4 = MinutosOff4 + 1;
}
if(MinutosOff4 == 60)
{
MinutosOff4 = 00;
delay(100);
}
if ((dt.hour == HorasOff4) && (dt.minute == MinutosOff4))
{
digitalWrite(Led_4,LOW);
}
}

Hola. Antes que nada, por favor, edita tu post y pon el código de acuerdo a las Normas del foro, punto 7. Aprovecha y usa la opción Autoformato del menú Herramientas de la IDE de Arduino antes de copiar el código así se facilita la lectura del mismo. Ambas cosas son para tu propio beneficio.

En una primera vista al código encontramos

if(digitalRead(btnModoA) == HIGH)
{
  ModoA = digitalRead(btnModoA);
  ModoA = ModoA + 1;

  switch(ModoA)
  {
  // lo que sigue...
  

Lo primero es que, a menos que esté pulsado el botón A, siempre va a leer HIGH porque está habilitada la resistencia pull-up del pin (por lo que el botón debe cerrar a masa (GND)).
Entonces, las probabilidades de que en cuestión de microsegundos puedas pulsar el botón son casi nulas, o sea que

ModoA = digitalRead(btnModoA);

va a devolver HIGH en el 99.999999999% de las lecturas.
Por otro lado, HIGH equivale a 1 y LOW a 0, entonces ModoA puede contener 2 valores, 0 ó 1.
Luego lo incrementas, entonces ModoA puede contener 1 (si milagrosamente se detectó la pulsación) y 2 si no se pulsó.
En definitiva solo puede ejecutar los case 1 y 2 del switch, el resto (para 3 y 4) no los ejecutará nunca.

Luego haces

while(digitalRead(btnModoB)== HIGH)
{
  ModoB = digitalRead(btnModoB);
  ModoB = ModoB +1;
  if(ModoB == 1)
  {
// lo que sigue....

O sea que si no pulsas el botón B, queda encerrado en el lazo while() y no puede salir de ahí.
Aquí, ModoB otra vez solo puede obtener los valores 0 y 1, que luego incrementas por lo que solo se va a ejecutar el if() para 1 o para 2, el resto no se ejecutan nunca.

Y por cierto, ¿por qué abandonaste el uso de switch por los if()?

Ya tienes cosas para ir viendo.

Saludos

PD: No olvides editar correctamente tu post.

mucha gracias, voy a realizar las respectivas correcciones para continuar con mi aprendizaje y ver como se porta mi proyecto

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.