Prueba a ver si asi funciona
#include <LiquidCrystal.h> //Libreria del display LCD
#define T1000 995
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Inicializamos la libreria con el numero de los pines a utilizar
int buzzer = 13; //Alarma
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int msg = 0; //Barrera para el mensaje de bienvenida
int start = A2; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque
int pausaPin = A1; // Pulsador de pausa
int buth = A5; //Pulsador de Horas
int butm = A4; //Pulsador de Minutos
int buts = A3; //Pulsador de segundos
int pausa = 0; //variable para pausar
int varbuth = 0; //Variable para almacenar el valor del pulsador de horas
int varbutm = 0; //Variable para almacenar el valor del pulsador de minutos
int varbuts = 0; //Variable para almacenar el valor del pulsador de segundos
int restart = 1;
boolean detener = false;
unsigned long time = 0;
void bienvenida() {
lcd.setCursor(1, 0);
lcd.print("B&H Corporation");
lcd.setCursor(4, 1);
lcd.print("Autoclave");
delay(3000);
msg = 1;
lcd.clear();
restart = 0;
}
void setup()
{
lcd.begin(16, 2); // Configuramos el numero de columnas y filas del LCD.
pinMode(buzzer, OUTPUT); //Pin de alarma --> Salida
pinMode(buth, INPUT_PULLUP); //Pin de pulsador de horas --> Entrada
pinMode(butm, INPUT_PULLUP); //Pin de pulsador de minutos --> Entrada
pinMode(buts, INPUT_PULLUP); //Pin de pulsador de segundos --> Entrada
pinMode(start, INPUT_PULLUP); //Pin de pulsador de arranque --> Entrada
pinMode(pausaPin, INPUT_PULLUP); // Pin de pulsador de pausa --> Entrada
msg = 0; //Barrera del mensaje de bienvenida
empieza = 1024; //Barrera de arranque
varbuth = 1; //Barrera de horas
varbutm = 1; //Barrera de minutos
varbuts = 1; //Barrera de segundos
bienvenida();
}
void loop()
{
menu();
cuentaRegresiva();
}
void menu() {
//-------------------------------------------------------------------------------------------------
// LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
// EL BOTON DE ARRANQUE
//-------------------------------------------------------------------------------------------------
do {
varbuth = digitalRead(buth); //Leemos boton de horas
varbutm = digitalRead(butm); //Leemos boton de minutos
varbuts = digitalRead(buts); //Leemos boton de segundos
if (varbuth == 0) { //Si el boton ha sido pulsado, aumentamos las horas en una unidad
ahoras++;
delay(250);
}
if (varbutm == 0) { //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
aminutos++;
delay(250);
}
if (varbuts == 0) { //Si el boton ha sido pulsado, aumentamos los segundos en una unidad
asegundos++;
delay(250);
}
lcd.setCursor(0, 0);
lcd.print("Elige el tiempo"); //Muestra mensaje y las HH:MM:SS que vayamos aumentando
lcd.setCursor(4, 1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
empieza = digitalRead(start); //Lee el boton de arranque
if (empieza == 0) { //Si el boton de arranque, fue pulsado...
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
}
} while (empieza == 0 ); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
}
void cuentaRegresiva() {
//-------------------------------------------------------------------------------------------------
// UNA VEZ PULSADO EL BOTON DE ARRANQUE Y ACUMULADO EL TIEMPO, ENTRA EN EL SIGUIENTE WHILE
// Y NO FINALIZA HASTA TERMINAR LA CUENTA.
//-------------------------------------------------------------------------------------------------
while (segundostotal > 0) {
pausa = digitalRead(pausaPin);
if (pausa == 0) {
detener = !detener;
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
if (!detener) { // lo que hago solo elimina el descuento de segundos, entonces luce como pausa
//delay (1000); //Descontamos en periodos de 1 segundo
if (millis() - time > T1000) {
segundostotal--;
time = millis();
}
}
ahoras = ((segundostotal / 60) / 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos
lcd.setCursor(0, 0);
lcd.print("Tiempo restante"); //Mostramos mensaje de tiempo restante
lcd.setCursor(4, 1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
if (segundostotal == 0) { //Si finaliza el tiempo
while (1) { //Bucle infinito mostrando mensaje y haciendo parpadear un led
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("Tiempo");
lcd.setCursor(3, 1);
lcd.print("Finalizado");
for (int i = 0; i < 5; i++) {
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
lcd.clear();
break;
}
}
}
}