Código para juego de leds y botones

Buenos días, quiero hacer un juego donde haya tres leds de tres colores distintos (rojo, amarillo y verde). Los leds deben encenderse cada vez más rapido y de forma aleatoria. Hay dos jugadores y tres botones para cada jugador (uno por cada color). La idea es que cuando el led rojo se encienda, los jugadores deberán pulsar su respetivo botón rojo para sumar puntos. Si pulsan el botón correcto, el led debe apagarse. Si mientras está encendido el led rojo (por ejemplo), el jugador 1 pulsa el boton verde, sus puntuación baja. El tiempo del juego irá indicado en un LCD de 16x2, así como la puntuación de cada jugador. También habrá un botón para pausar y activar el tiempo. Me gustaría, por último, que cuando el tiempo llegue a 00:00, los tres leds se enciendan a la vez.
De momento llevo este programa, pero voy un poco perdido:

#include  <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
int ledrojo=6;
int ledverde=7;
int ledamarillo=8;
int botonrojo1=9;
int botonrojo2=10;
int botonverde1=11;
int botonverde2=12;
int botonamarillo1=13;
int botonamarillo2=14;
int botontiempo=15;
int i=0;
unsigned long treal=0;
unsigned long tactualizado=0;

#include "Countimer_h" // ARDUINO NO LO RECONOCE
Countimer tDown


void setup()
{
 pinMode(ledverde,OUTPUT);
pinMode(ledrojo,OUTPUT);
pinMode(ledamarillo,OUTPUT);
pinMode(botonrojo1,INPUT);
pinMode(botonrojo2,INPUT);
pinMode(botonverde1,INPUT);
pinMode(botonverde2,INPUT);
pinMode(botonamarillo1,INPUT);
pinMode(botonamarillo2,INPUT);
pinMode(botontiempo,INPUT);
lcd.begin(16, 2);
lcd.setCursor(5,0);
 lcd.print("TIEMPO");
 lcd.setCursor ( 6, 1 );
 lcd.print("03:00");
 delay(1000); 
 randomSeed(analogRead(0));
i= random(6,8);  

tDown.setCounter(0,0,20, tDown, refreshClock, onComplete);
tDown.setInterval(refreshClock,1000);
}

void loop()
{
tiempo();
puntos();
}

void tiempo()
{
 if(digitalRead(botontiempo)==LOW);
{tDown.stop();}
if(digitalRead(botontiempo)==HIGH);
{tDown.run();}
}

void refreshClock()
{
 lcd.setCursor(6,1);
 lcd.print(tDown.getCurrentTime());
  }
  
void onComplete(){
  lcd.setCursor(6,1);
  lcd.print("00:00");
  digitalWrite(ledrojo=HIGH);
  digitalWrite(ledverde=HIGH);
  digitalWrite(ledamarillo=HIGH);
  }

void puntos(){
 lcd.setCursor(0,1);
 lcd.print(puntosj1);
   lcd.setCursor(0,0);
   lcd.print("J1");
   lcd.setCursor(14,1);
   lcd.print(puntosj2);
    lcd.setCursor(14,0);
 lcd.print("J2");

 if(digitalWrite(ledrojo)==HIGH)
 {if(digitalRead(botonrojo1)==HIGH;{
 (digitalWrite(ledrojo)==LOW);
 puntosj1++;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonrojo2)==HIGH;{
 (digitalWrite(ledrojo)==LOW);
 puntosj2++;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}


 

  if(digitalWrite(ledverde)==HIGH)
 {if(digitalRead(botonverde1)==HIGH;{
 (digitalWrite(ledverde)==LOW);
 puntosj1++;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonverde2)==HIGH;{
 (digitalWrite(ledverde)==LOW);
 puntosj2++;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}




  if(digitalWrite(ledamarillo)==HIGH)
 {if(digitalRead(botonamarillo1)==HIGH;{
 (digitalWrite(ledamarillo)==LOW);
 puntosj1++;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonamarillo2)==HIGH;{
 (digitalWrite(ledamarillo)==LOW);
 puntosj2++;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}



  if(digitalWrite(ledrojo)or(ledverde==HIGH)
 {if(digitalRead(botonamarillo1)==HIGH;{
 (digitalWrite(ledrojo)or(ledverde)==LOW);
 puntosj1--;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonamarillo2)==HIGH;{
 (digitalWrite(ledrojo)or(ledverde)==LOW);
 puntosj2--;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}



  if(digitalWrite(ledamarillo)or(ledverde==HIGH)
 {if(digitalRead(botonrojo1)==HIGH;{
 (digitalWrite(ledamarillo)or(ledverde)==LOW);
 puntosj1--;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonrojo2)==HIGH;{
 (digitalWrite(ledamarillo)or(ledverde)==LOW);
 puntosj2--;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}
 


  if(digitalWrite(ledamarillo)or(ledrojo==HIGH)
 {if(digitalRead(botonverde1)==HIGH;{
 (digitalWrite(ledamarillo)or(ledrojo)==LOW);
 puntosj1--;
 lcd.setCursor(0,1);
 lcd.print(puntosj1);}
else
{if(digitalRead(botonverde2)==HIGH;{
 (digitalWrite(ledamarillo)or(ledrojo)==LOW);
 puntosj2--;
 lcd.setCursor(14,1);
 lcd.print(puntosj2);}
 
 

 
}


[code]

Pues gracias @ArduMyth y he borrado el segundo hilo porque este es el primero.
Ahora tendra que editar usando la guia que le pasé por privado.

Buenas tardes. Me gustaría hacer un juego para clase (2º Bachillerato) que consista en 3 leds de 3 colores diferentes y dos jugadores con tres botones cada uno (un botón por led). El juego consistiría en que los leds se encendieran de forma aleatoria, (int i=0;), a ser posible cada vez más rápido (para así añadirle dificultad al juego). Cada vez que se encienda un led (pongamos como ejemplo el amarillo), los jugadores deberán presionar el botón amarillo. Si lo presionan, sumarán puntos a su parte del marcador en LCD, además de que el led se apagará. Si pulsan un botón equivocado, su puntuación deberá bajar. El tiempo es una cuenta atrás que se muestra en el LCD, y cuando acabe (llegue a 00:00) me gustaría que se encendieran los tres leds a la vez. He usado las librerías LiquidCrystal (para el LCD) y EEPROM (para la cuenta atrás), sin embargo los puntos (void points) no me los reconoce. ¿Debería incluir más librerías? De momento, este es el código que llevo hecho, pero voy muy perdido y seguramente suspenda. Se lo agradecería mucho si pudieran echarme una mano.
Muchas gracias!!!

PD: la aleatoriedad con la que se encienden los leds no la he incluido aún del todo porque no se como hacerlo.

#include <EEPROM.h>
#include  <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
int ledrojo=6;
int ledverde=7;
int ledamarillo=8;
int botonrojo1=9;
int botonrojo2=10;
int botonverde1=11;
int botonverde2=12;
int botonamarillo1=13;
int botonamarillo2=14;
int botontiempo=15;
int i=0;
int Tiempo = EEPROM.read(3);
int Minutos;
int timerCount;
int puntosj1;
int puntosj2;

 
void setup()
{
  pinMode(ledverde,OUTPUT);
 pinMode(ledrojo,OUTPUT);
 pinMode(ledamarillo,OUTPUT);
 pinMode(botonrojo1,INPUT);
 pinMode(botonrojo2,INPUT);
 pinMode(botonverde1,INPUT);
 pinMode(botonverde2,INPUT);
 pinMode(botonamarillo1,INPUT);
 pinMode(botonamarillo2,INPUT);
 pinMode(botontiempo,INPUT);
 lcd.begin(16, 2);
 lcd.clear();
  randomSeed(analogRead(0));
i= random(6,8);  
 }
 
void loop()
{
 timer();
 points();
 }


void timer(){
    for(int timerCount = 59; timerCount >= 0; --timerCount){
        if(timerCount == 0 && Tiempo > 0){ 
           timerCount = 59;
           Tiempo --;
           EEPROM.write(3,Tiempo);
           MostrarTiempo();
        }else{
      EEPROM.write(3,Tiempo);      
           MostrarTiempo();
       }
      // Mostramos cuenta atras de los segundos
      MostrarTiempo();
      lcd.print(":");
        if (timerCount >10){ /// esto es por estetica para poner formato 01,02,03 etc..
          lcd.print(timerCount);
        }else{
          lcd.print("0");
          lcd.print(timerCount);
        }
      delay(1000);
      }    
}

int MostrarTiempo(){ 
   
   lcd.clear();
   lcd.setCursor(6,0);
   lcd.print("TIEMPO");
   lcd.setCursor(6,1);
     if(Minutos < 10){ // si es menor de 10 agregamos delante un 0 (por estetica)
       lcd.print("0");
       lcd.print(Minutos);
     }else{
       lcd.print(Minutos);
       
int FinalTiempo(){
  if(Tiempo==0 && timerCount==0){
     (ledrojo,HIGH);
   (ledverde,HIGH);
   (ledamarillo,HIGH);
   }
  }
}


void points() {
  lcd.setCursor(0,1);
  lcd.print(puntosj1);
    lcd.setCursor(0,0);
    lcd.print("J1");
    lcd.setCursor(14,1);
    lcd.print(puntosj2);
     lcd.setCursor(14,0);
  lcd.print("J2");

  if(ledrojo==HIGH)
  {if(botonrojo1==HIGH);
  {digitalWrite(ledrojo,LOW);
  puntosj1++;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if(botonrojo2==HIGH);
{digitalWrite(ledrojo,LOW);
  puntosj2++;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}


  if(ledverde==HIGH)
  {if(botonverde1==HIGH);
  {digitalWrite(ledverde,LOW);
  puntosj1++;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if(botonverde2==HIGH);
{digitalWrite(ledverde,LOW);
  puntosj2++;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}


  if(ledamarillo==HIGH)
  {if(botonamarillo1==HIGH);
  {digitalWrite(ledamarillo,LOW);
  puntosj1++;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if(botonamarillo==HIGH);
{digitalWrite(ledamarillo,LOW);
  puntosj2++;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}

   

   if(ledrojo==HIGH)or(ledverde==HIGH)
  {if(botonamarillo1==HIGH);
  {digitalWrite(ledrojo,LOW)and(ledverde,LOW);
  puntosj1--;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if((botonamarillo2==HIGH);{
  digitalWrite(ledrojo,LOW)and(ledverde,LOW);
  puntosj2--;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}


    if(ledamarillo==HIGH)or(ledverde==HIGH)
  {if(botonrojo1==HIGH);
  {digitalWrite(ledamarillo,LOW)and(ledverde,LOW);
  puntosj1--;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if((botonrojo2==HIGH);{
  digitalWrite(ledamarillo,LOW)and(ledverde,LOW);
  puntosj2--;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}

  
    if(ledamarillo==HIGH)or(ledrojo==HIGH)
  {if(botonverde1==HIGH);
  {digitalWrite(ledamarillo,LOW)and(ledrojo,LOW);
  puntosj1--;
  lcd.setCursor(0,1);
  lcd.print(puntosj1);}
else
{if((botonverde2==HIGH);{
  digitalWrite(ledamarillo,LOW)and(ledrojo,LOW);
  puntosj2--;
  lcd.setCursor(14,1);
  lcd.print(puntosj2);}  
}

[code]

Me pareció haber leído ya este mismo pedido...

¿El juego te lo has inventado o hay algún video para verlo en internet?

Había subido ya un hilo con la descripción del juego, pero ahora he modificado alguna cosa del código viendo hilos en foros y videos en youtube pero… no me aclaro. El juego lo hemos inventado unos compañeros y yo, aunque supongo que hay gente que habrá hecho proyectos similares.

Tenía mucha razón @Daniel_Arg con el tema repetido y no es la 2da sino la 3ra vez que lo haces.
A ver si recuerdas que tienes un hilo abierto y dejas de abrir uno cada vez que te interesa una respuesta.

Lee las Normas del foro.

@surbyte si no me contestan lo normal es que lo suba otra vez.
Que tanto les cuestas ser amables?
Por favor voy a suspenderrrrr, ayuda por favor
Soy un ser dejado a la deriva
Espero q un alma caritativa tenga 5 minutos para ayudarme.

Hola pues, no es necesario crear varios post con el mismo tema siendo acerca de lo mismo, lo que sí debes hacer en el mismo ir actualizando el post con lo que vas avanzando y el código que vas arreglando para asi poderte ayudar.
Ahora el código que compartiste tienes un poco de errores con lo cual ni compilara,como esto:

int MostrarTiempo() {

	lcd.clear();
	lcd.setCursor(6, 0);
	lcd.print("TIEMPO");
	lcd.setCursor(6, 1);
	if (Minutos < 10) { // si es menor de 10 agregamos delante un 0 (por estetica)
		lcd.print("0");
		lcd.print(Minutos);
	}
	else {
		lcd.print(Minutos);

		int FinalTiempo() {
			if (Tiempo == 0 && timerCount == 0) {
				(ledrojo, HIGH);
				(ledverde, HIGH);
				(ledamarillo, HIGH);
			}
		}
	}

En el cual declaras una función como int con lo cual te va a devolver un entero cosa que tu nunca sucede, por lo cual si no devuelve ningún valor debería ser void .
Ahora también en esta parte estás haciendo una función dentro de una función int FinalTiempo() cosa que no se puede hacer tendría que estar fuera MostrarTiempo() y ser llamada en esta. Pra aprender más acerca de esto revisa este enlace FUNCIONES Y ENTEROS
También en tu función void points() tienes cosas como estas

if (botonrojo1 == HIGH);
			{digitalWrite(ledrojo, LOW);
			puntosj1++;
			lcd.setCursor(0, 1);
			lcd.print(puntosj1); 
			}

if (botonrojo1 == HIGH); con lo cual el “;” termina la instrucción, por lo cual esta mal, deberia ser if (botonrojo1 == HIGH){ con lo cual me da a entender que no tienes muy claro, te recomiendo que leas esto: INTRODUCCIÓN A LA PROGRAMACIÓN DEL ARDUINO
Ahora si tu juego necesita que no se detenga por lo que esto delay(1000); te va a detener el programa por lo que se recomienda usar millis y te sugiero que leas lo que hay en este post Millis() :Explicacion.
Otra cosa que no entiendo muy claro para qué necesitas la EEPROM en el tiempo? esta es más utilizada cuando se necesita guardar después de reiniciar o desconectar el arduino.

@Swift muchas gracias!! Conforme vaya modificando el código lo voy subiendo (en este mismo hilo jaja). Espero aclararme con esos enlaces… Gracias otra vez de parte mía y de mis compañeros!

@surbyte si no me contestan lo normal es que lo suba otra vez.

Que tanto les cuestas ser amables?

Mi estimado, eso se llama doble posteo y esta penalizado.. no tiene nada que ver con ser amables.
Ademas confundes amabilidad con paciencia y no la nuestra sino la tuya.

Solo para que veas el punto 12 de las normas dice:

**No es apropiado el encontrar alguien que creas podría ayudarte, y tratar de obtener ayuda directa personalizada. Si lo haces te sugiero que estés preparado a pagar por esa ayuda exclusiva. **
Si eres suficientemente perspicaz para obtener la atención de quien te parece ser un experto en tu problema, postea la pregunta en el foro primero (como se describe arriba).
Espera un par de días, podrían estar ocupados, si para entonces nadie ha podido ayudarte, puedes mandar un breve mensaje pidiendo asistencia, se amable y no olvides incluir el enlace del hilo del foro donde has plasmado tu duda y las respuestas que no te han solucionado el problema.
Si no agregas el enlace de tu pregunta en el foro, la persona a la que has pedido ayuda por mensaje privado tendrá que averiguar donde lo has colocado, entonces el esfuerzo y el tiempo invertido podrían desacelerar o incluso, desviar su atención a tu problema.
Nota que generalmente las preguntas posteadas dentro del foro son atendidas dentro de una hora, por alguna persona, pero esto varia dependiendo de la hora del día. Si preguntas directamente a una persona, esta podría tardar al menos 8 horas en responder, puede ocurrir que se ha ido a dormir, está en el trabajo, o terminando lo que sea que esté haciendo.
Si buscas ayuda personalizada para un proyecto y estás dispuesto a pagar un consultor, puedes consultarlo en privado con la persona que has escogido, plantea el problema y cuanto estas dispuesto a pagar para llegar a un acuerdo mutuo. Es importante que ambos tomen en cuenta el factor de la distancia y todo lo que implica.
Para seleccionar a la persona más indicada, ve a la sección de proyectos y busca algún proyecto similar o que puede complementar lo que necesitas, después puedes hacer click en el nombre de cada miembro del foro para ver su perfil, puntos de karma, actividad y post anteriores.

Bien ahora ya tienes ayuda y tu duda comienza a resolverse.
Presta atención a las normas y tenlas presentes.

@Swift respecto a lo que me dijiste de void points (), que si ponía ";" se cerraba la instrucción... ¿Así estaría correcto?

if(ledrojo==HIGH)                     // si led rojo encendido
  {if(botonrojo1==HIGH)           // si boton rojo del jugador 1 está pulsado
  {digitalWrite(ledrojo,LOW)       // apagar led rojo 
  puntosj1++                            // sumar puntos del jugador 1
  lcd.setCursor(0,1)                   // en el lcd (0,1), mostrar los puntos del jugador 1(esto de puntosj1 no sé si esta bien expresado)
  lcd.print(puntosj1)}
else                                          // si no
{if(botonrojo2==HIGH)             // si botón rojo jugador 2 está pulsado
{digitalWrite(ledrojo,LOW)         // lo mismo con el jugador 2
  puntosj2++
  lcd.setCursor(14,1)
  lcd.print(puntosj2)}

Lo mismo que antes pero al restar puntos cuando uno de los dos jugadores se equivoca:

He llegado a la conclusión de que puntosj1 y puntosj2 deben ser variables declaradas al principio como int puntosj1 = 0; y lo mismo con la otra... y más tarde llamadas en la función void points(). ¿Es esto correcto?

if(ledamarillo==HIGH)or(ledrojo==HIGH)                 // si led amarillo o led rojo están encendidos
  {if(botonverde1==HIGH)                                       // si boton verde jugador 1 está pulsado
  {digitalWrite(ledamarillo,LOW)and(ledrojo,LOW)      // apagar ambos leds (he puesto and en vez de or)
  puntosj1--                                                            // restar puntos a jugador 1
  lcd.setCursor(0,1)                                                 // mostrar puntuacion del jugador 1 en el lcd (0,1)
  lcd.print(puntosj1)}
else
{if((botonverde2==HIGH){
  digitalWrite(ledamarillo,LOW)and(ledrojo,LOW)
  puntosj2--
  lcd.setCursor(14,1)
  lcd.print(puntosj2)}

Esto es lo que he avanzado en cuanto a la cuenta atrás que se muestra en el LCD. El objetivo es que se empiece desde 3 minutos, y cuando el tiempo llegue a 0, mostar en el LCD cual de los dos jugadores ha ganado, y encender los tres leds a la vez

int minutos=3;     //empezar en 3 minutos
int cuentaatras = 60;    // la cuenta atrás 60 segundos 
unsigned long tiempo;
unsigned long tguardado;    //todo esto estaria al principio


void cuentaregresiva(){
    tiempo=millis();
    lcd.setCursor(8,1)
    lcd.print(":");   // mostrar el :  , que se quedará ahí siempre
    
  if (tiempo-tguardado>=1000){ //produce un evento cada 1000 milisegundo (1 seg)
      tguardado=tiempo;{
        if(int cuentaatras == 59, cuentaatras >= 0, --cuentaatras){
          if(cuentaatras== 0 && tiempo>0){
            cuentaatras=59;
            tiempo--;
            minutos--;
            lcd.setCursor(7,1)
            lcd.print(minutos)}
          
         //si cuentaatras es mayor que 10, motrarlo en lcd (9,1), pero si cuenta atrás es 
         //menor que 10, mostar 0 en (9,1) y mostar cuentaatras en (10,1) 
         
          if (cuentaatras>10){
            lcd.setCursor(9,1)
            lcd.print(cuentaatras)}
            else{
          if (cuentaatras<10){
            lcd.setCursor(9,1)
            lcd.print("0");
            lcd.setCursor(10,1)
            lcd.print(cuentaatras)}
            }


            // Cuando los minutos lleguen, borrar lo que se muestra en lcd (lcd.clear)
            // y mostrar cual de los dos jugadores ha ganado
          if (minutos==0 && cuentaatras==0){
            lcd.clear();
            lcd.setCursor(4,0)
            lcd.print("HA GANADO");
            lcd.setCursor(4,1)
            lcd.print("JUGADOR");
          if (puntosj1 > puntosj2){
              lcd.setCursor(15,1)
              lcd.print("1")
              digitalWrite(ledrojo,HIGH)
              digitalWrite(ledverde,HIGH)
              digitalWrite(ledamarillo,HIGH)}
           else{
            if (minutos==0 && cuentaatras==0){
            lcd.clear();
            lcd.setCursor(4,0)
            lcd.print("HA GANADO");
            lcd.setCursor(4,1)
            lcd.print("JUGADOR");
          if (puntosj1 > puntosj2){
              lcd.setCursor(15,1)
              lcd.print("2")
              digitalWrite(ledrojo,HIGH)
              digitalWrite(ledverde,HIGH)
              digitalWrite(ledamarillo,HIGH)}
          }
         }
          }

Bueno creo que no me has entendido, revisastes los enlaces que te pase?. Tu último código sigue teniendo errores te los detallo:

lcd.setCursor(8,1)

te faltan el ";" para terminar la instrucción

tguardado=tiempo;{

la llave está demás

if(int cuentaatras == 59, cuentaatras >= 0, --cuentaatras){

la estructura de una condición es:

if ( condicion){
   Accion1;
   Accion2;
}

como también puede poner con los operadores ( || ) que significa "o", como también ( && ) que significa "y"

if (condicion1 || condicion2 && condicion3 ){
   Accion1;
   Accion2;
}

Ahora en el resto del codigo te falta ";" , solo para ponerte un ejemplo:

lcd.setCursor(15,1)
lcd.print("1")
digitalWrite(ledrojo,HIGH)
digitalWrite(ledverde,HIGH)
digitalWrite(ledamarillo,HIGH)

y por último la función void cuentaregresiva() nunca cierras las llaves, pon todo el código no solo partes.
Para la cuenta regresiva has utilizado el código de este hilo Temporizador cuenta atrás display
y lo modificastes según lo que puedo ver pero mal, para que te muestre minutos y segundo, por lo que de esta forma te estaría mostrando 02:03 y sin las condiciones que tu has añadido, ahora te faltaría añadirle que lo muestre en la pantalla en la posición que tu quieras, por lo cual deberías imprimir buffer, como yo no tengo una pantalla lo estoy imprimiendo por puerto serial, te tocara cambiarlo borrarlo y añadir la pantalla.

char buffer[50];
unsigned long tiempoActual;
unsigned long tiempoGuardado;
byte contadorSegundos = 0;
unsigned int contadorMinutos = 3;

void setup() {
 Serial.begin(9600);
}

void loop() {
 tiempoActual = millis();
 cuentaRegresiva();
}

void cuentaRegresiva() {
 if (tiempoActual - tiempoGuardado >= 1000) { // Produce un evento cada 1000 milisegundo que equivale a 1 segundo
 tiempoGuardado = tiempoActual; // Actualiza el tiempo para el siguinte evento
 if (contadorSegundos > 0) { // Condicion que resta los segundos mientras sea mayor a 0 
 contadorSegundos--; // Resta 1 a la variable contadorSegundos
 }
 else { // Si la condicion contadorSegundos > 0 ya no se cumple
 contadorSegundos = 59; // Asigna a contadorSegundos = 59;
 contadorMinutos--; // Resta 1 a la variable contadorMinutos--;
 }
 sprintf(buffer, "%02d" ":%02d", contadorMinutos, contadorSegundos);
 Serial.println(buffer);
 }
}

utiliza la función sprintf, hay mucha informacion de como funciona, porfavor lee lo que te indique.