Proyecto de contador para esterilizador incompleto

Estoy programando un contador con LCD y Arduino NANO, estoy teniendo muchos problemas con los condicionales.

Basicamente las funciones que tiene son seleccionar tiempo con 2 botones, boton de inicio, boton de reset, boton de inicio infinito (hasta que pulsemos reset) A todo esto le quiero agregar una pausa que se determina por un sensor de puerta, cuando esta esté abierta el contador se debe pausar.

No logro hacer que funcione la pausa, ya que no puedo romper el bucle del while. Ni tampoco hacer que funcione el boton de inicio infinito. Si alguien le puede dar un vistazo al codigo para darme una mano se lo agradeceria!

#include <LiquidCrystal.h> 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); 

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 pausa = A3;             //Sensor NC
int relay = 10;             //Relay esterilizador
int start = A2;            //Pulsador de arranque
int empieza = 1024;        //Variable para almacenaje del pulsador de arranque

int buth = A5;             //Pulsador de 30 minutos
int butm = A4;             //Pulsador de 15 minutos
int butr = A6;             //Pulsador de reset
int buti = A7;             //Pulsador de comienzo infinito

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 varbuti = 0; 
int varbutr = 0;
int varpausa = 0;

void setup() 
{
   lcd.begin(16, 2);         
   
   pinMode(relay, OUTPUT);   //Pin de relay --> Salida
   pinMode(buth, INPUT);     //Pin de pulsador de horas --> Entrada
   pinMode(butm, INPUT);     //Pin de pulsador de minutos --> Entrada
   pinMode(buti, INPUT);     //Pin de pulsador de arranque inf --> Entrada
   pinMode(start, INPUT);    //Pin de pulsador de arranque --> Entrada
   pinMode(butr, INPUT);
   pinMode(pausa, INPUT);
   
   msg = 0;                  //Barrera del mensaje de bienvenida
   empieza = 1024;           //Barrera de arranque
   
   varbuth = 1;              //Barrera de horas
   varbutm = 1;              //Barrera de minutos
   varbuti = 1;
   varbutr = 1;
   varpausa = 1;
}

void loop() 
{
     if(msg==0)             
     {
       lcd.setCursor(0,0);
       lcd.print("Temporizador con");
       lcd.setCursor(1,1);
       lcd.print("Arduino + LCD");
       delay(2500); 
       msg = 1;
       lcd.clear();
     }
          if (varbuti == 0)
         {
                  lcd.clear();
                  lcd.setCursor(3,0);
                  lcd.print("ENCENDIDO");
                  lcd.setCursor(2,1);
                  lcd.print("FUNCIONANDO");
               
                 digitalWrite(relay, LOW);
                 delay(1);
         }
     
     do                   
     {
       
       varbuth = analogRead(buth);   //Lee boton de horas
       varbutm = analogRead(butm);   //Lee boton de minutos
       varbuti = analogRead(buti);
       varbutr = analogRead(butr);
       
       if(varbuth == 0)              
       {
        aminutos = aminutos + 30 ;
        delay(250);
       }  
       
        if(varbutm == 0)            
       {
         aminutos = aminutos + 15;
         delay(250);
       }  
       
        
       lcd.setCursor(0,0);
       lcd.print("Elige el tiempo");  
       
       lcd.setCursor(4,1);     

      if (ahoras < 10) lcd.print("0");    
       lcd.print(ahoras);                 
       lcd.print(":");

      if (aminutos < 10) lcd.print("0");  
       lcd.print(aminutos);               

       lcd.print(":");
      if (asegundos < 10) lcd.print("0"); 
       lcd.print(asegundos);              
       
       empieza = analogRead(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
       }

  
     if (varbutr == 0);
             {
              digitalWrite(relay, HIGH);
              delay(1);
              msg = 0;
                    }
         
     } while(empieza != 0);  // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.

 
      while (segundostotal > 0) 
      {
          digitalWrite(relay, LOW);
        
        delay (1000);          //periodos de 1 segundo
        segundostotal--;    
   
        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");     
        lcd.print(ahoras);                   
        lcd.print(":");

        if (aminutos < 10) lcd.print("0");   
        lcd.print(aminutos);                 

        lcd.print(":");
        if (asegundos < 10) lcd.print("0");  
        lcd.print(asegundos);                
      
        if (varbutr == 0);
             {
              digitalWrite(relay, HIGH);
              delay(1);
              msg = 0;
                    }
          if (segundostotal == 0)            //Si finaliza el tiempo
          msg = 1;
          {           
             while(msg == 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");
               
                 digitalWrite(relay, HIGH);
                 delay(5000);
                 
             if (butr == 0);
             {
              msg = 0;
             }
             }      
          }
     
      }
     

}

Bienvenido qFr3z y por qué una consulta como ésta la posteas en la sección Proyectos? Es una consulta de Software.
Tu hilo será movido a dicha Sección.

Qué esperas que hagan secciones como éstas

if (varbutr == 0);
{
  digitalWrite(relay, HIGH);
   delay(1);
   msg = 0;
}

si le colocas un ; al final de un if ese se ejecuta pero no encierra lo que esta entre llaves.
Es diferente a esto

if (varbutr == 0)
{
   digitalWrite(relay, HIGH);
   delay(1);
   msg = 0;
}

donde si cuando varbutr sea igual a 0 hará lo que este dentro de las llaves.
En la anterior, siempre se hará lo que esta entre las llaves.

Y como éste veo varios errores similares.

Antes que nada gracias por tomarte el tiempo de mirar el codigo y disculpa por el error de sección. Es cierto eso, no me habia dado cuenta del ";" al final del if. En teoria es un reset, al pulsar el boton apaga el relay y convierte msg a 0, lo que nos lleva al menu de inicio donde pide ingresar el tiempo. Dicho menu esta en un do - while. Hay alguna forma de romper ese while con mas de una condicion? Cosa que dependiendo que boton se pulse haga una u otra cosa, pero de todas formas se salga del bucle

Gracias ArduMyth, me comprometí a presentar este codigo funcionando en 2 dias, asi que agradezco tu atención.

Estuve leyendo un poco en el foro y cambie sin problemas de delay a millis el contador, ahora me resta lo más tedioso que sería sacar los bucles.

En cuanto a la cascada de int luego revisaré, estoy seguro que hay formas más practicas. Estoy programando segun lo que recuerdo haber visto en la universidad hace casi 3 años ya. No recuerdo que me hayan enseñado a usar flags, ahora voy a darme una vuelta por el foro y cualquier duda que tengo la posteo a ver si me pueden ayudar

Esto

 empieza = analogRead(start);   //Lee el boton de arranque

esta mal. Porque defines pines como entradas digitales y luego lees valores analógicos.

entonces al leer el valor de start usando analogRead() tendras un valor entre 0 y 1023
de modo que esto

     if (empieza == 0)  {

Casi nunca se cumplirá.
en lugar de analogRead() usa digitalRead() y entonces si funcionará.

Pero otro tema es quedefines a empieza como entero cuando lo que necesitas es un simple bool

bool empieza;

Y asi todas las variables que acumulen que estado tiene el pulsador que basicamente sera HIGH/LOW o True/False.

Estas secuencias de instrucciones

f (ahoras < 10) lcd.print("0");    
      lcd.print(ahoras);                 
      lcd.print(":");

      if (aminutos < 10) lcd.print("0");  
      lcd.print(aminutos);               

      lcd.print(":");
      if (asegundos < 10) lcd.print("0"); 
      lcd.print(asegundos);

pueden reemplazarse por estas

    char buffer[30]:
    sprintf(buffer,"%02d:%02d:%02d", ahoras, aminutos, asegundos);
    lcd.print(buffer);

repite esto pero buffer podrias ponerlo como global y reutilizarlo cada vez que tengas que hacer algo similar.