Problema al intentar decrementar una cantidad que se muestra en lcd

Pero el precio esta demasiado elevado, al menos para nuestro presupuesto, asi que pues como estudiante de electrónica quiero hacer uno para que todos en el gym podamos usarlo, pero estoy atorado en la parte del código que se encarga de realizar el tiempo de descanso y pues no se si alguien podría ayudarme, se los agradeceria de verdad.

si este proyecto llega a concluir les proporcionare todo lo relacionado para que si gustan puedan hacer uno igual o jugar un poco con el código según quieran.

algunos materiales que estoy usando. (aunque en si el problema es el código)

placa arduino uno
4 push button
resistencias de 1 k
display lcd 16x2

Aquí esta el código.

#include <LiquidCrystal.h> //Libreria del display LCD
#define T1000 995   // debería ser 1000 pero dejo 5mseg para considerar todo el loop. Habria que medirlo para poner el valor correcto
LiquidCrystal lcd(12, 11, 8, 7, 4, 2); //Inicializamos la libreria con el numero de los pines a utilizar

int buzzer       = 13;     // Alarma
int msg          = 0;      // Barrera para el mensaje de bienvenida

const byte start = A2;      // Pulsador de arranque
const byte buts  = A3;      // Pulsador de segundos
const byte butm  = A4;      // Pulsador de Minutos

const byte pausaPin = A1;      // Pulsador de pausa

int empieza      = 1024;   // Variable para almacenaje del pulsador de arranque
int pausa        = 0;
int descanso     = 0;      // Variable que controla el tiempo de descanso
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 Round       = 1;      //variable que almacena el numero de rounds que se llevan peleando


int muestradescanso       = 0;      // Variable a mostrar por LCD el tiempo de descanso
int muestraround  =1;      //variable que mostrara los rounds en el lcd. Se pone a uno porque se empieza desde ese round.
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
boolean detener = false;
unsigned long time = 0;

void setup()
{
   lcd.begin(16, 2);         // Configuramos el numero de columnas y filas del LCD. 
   
   pinMode(buzzer, OUTPUT);  // Pin de alarma --> Salida
   
   pinMode(butm, INPUT);     // Pin de pulsador de minutos --> Entrada
   pinMode(buts, INPUT);     // Pin de pulsador de segundos --> Entrada
   pinMode(start, INPUT);    // Pin de pulsador de arranque --> Entrada
   pinMode(6,OUTPUT);         //salida para un optoacoplador, de igua forma el pin 5
   pinMode(5, OUTPUT);
   
   pinMode(pausaPin, INPUT);    // Pin de pulsador de pausa --> Entrada
   
   msg = 0;                  //Barrera del mensaje de bienvenida
   empieza = 1024;           //Barrera de arranque
   
 
   varbutm = 1;              //Barrera de minutos
   varbuts = 1;   //Barrera de segundos
   
   
   
}

void loop()
{
     if(msg==0) {            //Mostramos el mensaje de bienvenida solo una vez
       lcd.setCursor(0,0);
       lcd.print("Cargando");
       delay(1000);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Inicializando");
       delay (1500);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print ("Gimnasio");
       lcd.setCursor(1,1);
       lcd.print(" Siglo xxi ");
       delay (2000);
       lcd.clear();
     
       
              msg = 1;

     }
     
     //-------------------------------------------------------------------------------------------------     
     // LECTURA DE LOS BOTONES Y ELECCIÃ"N DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
     // EL BOTON DE ARRANQUE
     //-------------------------------------------------------------------------------------------------
     
     do  {
       
    
       varbutm = analogRead(butm);   //Leemos boton de minutos
       varbuts = analogRead(buts);   //Leemos boton de segundos
       
     
       
        if(varbutm == 0)            //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
       {
         aminutos = aminutos + 1;
         delay(250);
       } 
       
        if(varbuts == 0)            //Si el boton ha sido pulsado, aumentamos los segundos en 10 unidades
       {
         asegundos = asegundos + 10;
         delay(250);
       } 
             
       lcd.setCursor(0,0);
       lcd.print("Time:");  //Muestra mensaje y las HH:MM:SS que vayamos aumentando Para este sketch serán solo minutos y seg.
       lcd.setCursor(0,1);
       lcd.print ("Descanso");
       lcd.setCursor (13,0);
       lcd.print("R:");
       lcd.setCursor (15,0);
       lcd.print(muestraround);
       
       lcd.setCursor(7,0);     

      

      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);  //Convierte el tiempo elegido en segundos!!
       }
             
     } while(empieza != 0);  // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
       
      //-------------------------------------------------------------------------------------------------
      // 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)
      {
        
        if (segundostotal > 0)
        {
        digitalWrite (6, HIGH);
        }
        
        pausa = digitalRead(pausaPin);
        if (pausa == 0) {
            detener = !detener;
        }
        
        if (!detener) {              // lo que hago solo elimina el descuento de segundos, entonces luce como pausa
           
            if (millis()-time > T1000) {
                segundostotal--;
                time = millis();
            }
        }     
   
      
        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("Time:");        //Mostramos mensaje de tiempo restante
 
        lcd.setCursor(7,0);
   

        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
          {           
        
          digitalWrite (6, LOW);
          digitalWrite (5, HIGH);
           
             
             
          }
          
          if (segundostotal >= 175)
          
          {
            muestradescanso = 60; // ESTA VARIABLE TIENE UN VALOR DE 60 POR SE SUPONE QUE SE ELIJIO UN ROUND DE 3 MINS. POR LO TANTO EL DESCANSO DEBE SER DE UN MINUTO, PERO NO LOGRO HACER QUE ESTO DECREMENTE, AQUI ES DONDE SE UBICA MI PROBLEMA.


            lcd.setCursor(10,1);
            
            if (muestradescanso < 10) lcd.print("0");  // Si los minutos son menor que 10, pone un "0" delante.
            
            lcd.print(muestradescanso);             
            
            
            
          /* lcd.setCursor(10,1);
             lcd.print("01:00");*/
          }
     }
}

incluyo ademas una foto del circuito que hice, hecho en el simulador proteus, por cualquier duda.

imagen

Gracias por su apoyo.

Una disculpa por poner esto aca, sucede que segun el foro mi post habia excedido los 9000 caracteres que permite arduino y por tal motivo recorte este pedazo de texto, que va al inicio.

Hola y antes que nada gracias por dedicar un poco de tiempo en leer este post, pues sin más estoy metido en tremendo lio, ya que estoy intentando hacer un temporizador para gimnasio, este tipo de temporizador se usa para ocasiones en las que hay sparring y se necesita cronometrar el tiempo de pelea asi como el de descanso.

Por lo general los tiempos que se manejan en los sparrings son de 3 rounds de 3 mins con 1 de descanso y en ocasiones 3 rounds de 2:30 con 30 seg de descanso. El motivo por el cual estoy haciendo esto es porque en el gimnasio al que asisto, pues no tiene los suficientes recursos para comprar uno profesional, ya que entre todos queriamos comprar el que se muestra en esta imagen.

Esta no es la manera apropidada de leer un botón.

varbutm = analogRead(butm);   //Leemos boton de minutos
       varbuts = analogRead(buts);   //Leemos boton de segundos

Debe ser asi

       varbutm = digitalRead(butm);   //Leemos boton de minutos
       varbuts = digitalRead(buts);   //Leemos boton de segundos

Lo demás no lo he mirado con detenimiento.

Hola buenas... mira...

if(msg==0) {            //Mostramos el mensaje de bienvenida solo una vez
       lcd.setCursor(0,0);
       lcd.print("Cargando");
       delay(1000);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Inicializando");
       delay (1500);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print ("Gimnasio");
       lcd.setCursor(1,1);
       lcd.print(" Siglo xxi ");
       delay (2000);
       lcd.clear();
     
       
              msg = 1;

Si quieres mostrarlo una sola vez, lo puedes poner en el setup... asi;

lcd.setCursor(0,0);
       lcd.print("Cargando");
       delay(1000);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Inicializando");
       delay (1500);
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print ("Gimnasio");
       lcd.setCursor(1,1);
       lcd.print(" Siglo xxi ");
       delay (2000);
       lcd.clear();

Ahora bien... no especificas que tipo de problemas tienes...

Pero algunas sugerencias que te puedo hacer;

No.1:

No uses delays por que se va a ver muy lento cuando uno pulsa y por algo no lee correctamente el switch... tienes que oprimir dos o tres veces, te recomiendo agregar una libreria; Switch Lib

Lo que hace es que te ahorra el trabajo de leer cada 150 ms el switch y reportar adecuadamente el cambio.

No.2:

No uses ciclos do o while, por que estos van a "bloquear" el codigo, y no vas a poder leer correctamente el switch ni mostrar adecuadamente los resultados.

No.3: Veo que intentaste hacer un timmer con millis(), quizas la idea, esta bien... pero todas tus variables para millis tienen que ser; unsigned long... por requerimiento, no puedes comparar int con UL... o viceversa.

Ahora bien... me imagino que quieres que el programa cambien minutos y segundos, cuando no este "trabajando" ... y una vez que comience a trabajar no se puedan mover los cambios. Ahora bien, dices sparring, pero tienes alguna variable que controle cuanto ciclos o periodos completos van a hacer?

Igual y quedaria bueno que le agregaras un "destello" a la luz que mientras mas rapido vaya sepas que estas por terminar la serie, quizas ayudaria mucho mentalmente, sobre todo cuando ya son las ultimas series y uno se siente morir.

Bueno, te ayudo mas, cuando tengas mas descrito el problema.

-Alex.