Reloj Ajedrez

Buenos días compañeros,

Escribo porque he escrito el código para un sistema similar al reloj de una partida de ajedrez, pero no tengo arduino aquí para simularlo, de todas formas creo que me falla en algo. A ver si me podéis echar una mano por favor.

El funcionamiento consiste en que cuando se da al boton de empezar aparecen los dos tiempos y cuando un equipo pulsa su botón su temporizador empieza a descender (ambos empiezan en 1h). Si el otro equipo pulsa su botón se para el tiempo enemigo y empieza a descender el suyo. Si ambos equipos pulsan su botón a la vez, se pausan ambos tiempos. Si alguno de los dos llega a 00:00, suena un pitido mas largo.

Os pongo el código y os adjunto las librerias:

#include <LiquidCrystal.h>
#include <CountUpDownTimer.h> 

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // ( RS, EN, d4, d5, d6, d7)

CountUpDownTimer T1(LOW); // CuentaAtrasACeroTiempo1
CountUpDownTimer T2(LOW); // CuentaAtrasACeroTiempo2

String mensaje1 = "Eq.Verde: ";
String mensaje2 = "Eq.Rojo: ";

void setup()
{
  Serial.begin(115200); 

  pinMode(2, INPUT); // BotonEquipo1
  pinMode(3, INPUT); // BotonEquipo2
  pinMode(4, INPUT); // BotonEmpezar
  pinMode(5,OUTPUT); // Buzzer

  T1.SetTimer(1,0,0); // SetTiempo1HoraTiempo1
  T2.SetTimer(1,0,0); // SetTiempo1HoraTiempo2

  T1.StartTimer(); // EmpezamosTiempo1
  T2.StartTimer(); // EmpezamosTiempo2

  lcd.begin(16, 2); // Fijar el numero de caracteres y de filas

}

void loop() {

  // Si le damos a empezar iniciamos secuencia
  if(digitalRead(4) == HIGH){
    T1.Timer(); // LeDamosTiempo1
    T2.Timer(); // LeDamosTiempo2
    T1.PauseTimer(); // PausamosTiempo1
    T2.PauseTimer(); // PausamosTiempo2
  }

  // Si se pulsa el pulsador del Equipo 1 y el Equipo 2 a la vez pausamos ambos
  if (digitalRead(2) == HIGH && digitalRead(3) == HIGH )
  {
    T1.PauseTimer();
    T2.PauseTimer();
  }
  
  // -------------------------------------------Tiempo1-------------------------------------------
  // Si se pulsa el pulsador del Equipo1, retomamos la cuenta atras
  if(digitalRead(2) == HIGH && digitalRead(3) == LOW ){
    T2.PauseTimer(); // PausamosTiempo2
    T1.ResumeTimer(); // TiempoActual
    tone(5, 2000);
  }

  // -------------------------------------------Tiempo2-------------------------------------------
  // Si se pulsa el pulsador del Equipo2, retomamos la cuenta atras
  if(digitalRead(3) == HIGH && digitalRead(2) == LOW && !T2.TimeHasChanged() ){
    T1.PauseTimer(); // PausamosTiempo1
    T2.ResumeTimer(); // TiempoActual
    tone(5, 1000);
  }

  // -------------------------------------------Final-------------------------------------------
  // Si alguno llega a 00:00 suena la sirena
  if(T1.TimeCheck(0,0,0) || T2.TimeCheck(0,0,0)){
    tone(5, 5000, 10000);
  }

  //Actualizamos los mensajes
  mensaje1 = "Eq.Verde: " + T1.ShowMinutes() + ":" + T1.ShowSeconds() ;
  mensaje2 = "Eq.Rojo: " + T2.ShowMinutes() + ":" + T2.ShowSeconds() ;

  // Imprimimos mensajes
  lcd.setCursor(0,0);
  lcd.print(mensaje1); // Enviar el mensaje
  lcd.setCursor(0,1);
  lcd.print(mensaje2); // Enviar el mensaje

}

Muchas gracias y un saludo.

CountUpDownTimer.h (5.53 KB)

LiquidCrystal.h (3.4 KB)

Esto es lo mejor que he logrado. Basicamente tu programa estaba bien salvo por que T1.timer() y T2.timer() deben estar siempre en el loop

#include "Wire.h"        // necesario para mi librería LiquidCrystal 
#include <LiquidCrystal.h>
#include "CountUpDownTimer.h"

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // ( RS, EN, d4, d5, d6, d7)

CountUpDownTimer T1(DOWN); // CuentaAtrasACeroTiempo1
CountUpDownTimer T2(DOWN); // CuentaAtrasACeroTiempo2
const byte pinEq1       = 2; 
const byte pinEq2       = 3;
const byte pinEmpezamos = 4;
const byte pinBuzzer    = 5;
bool inicioLCD = false;

void setup() {
  Serial.begin(115200); 

  pinMode(pinEq1      , INPUT); // BotonEquipo1
  pinMode(pinEq2      , INPUT); // BotonEquipo2
  pinMode(pinEmpezamos, INPUT); // BotonEmpezar
  pinMode(pinBuzzer   , OUTPUT); // Buzzer

  T1.SetTimer(1,0,0); // SetTiempo1HoraTiempo1
  T2.SetTimer(1,0,0); // SetTiempo1HoraTiempo2

  T1.StartTimer(); // EmpezamosTiempo1
  T2.StartTimer(); // EmpezamosTiempo2

  lcd.begin(16, 2); // Fijar el numero de caracteres y de filas
  Serial.begin(9600);
}

void loop() {

  bool eq1, eq2, empezar;
  bool eq1Ant = false, eq2Ant = false, empezarAnt = false;

  T1.Timer();       // LeDamosTiempo1
  T2.Timer();       // LeDamosTiempo2
  eq1     = digitalRead(pinEq1);
  eq2     = digitalRead(pinEq2);
  empezar = digitalRead(pinEmpezamos);

  // Si le damos a empezar iniciamos secuencia
  if (empezar && !empezarAnt){
      T1.PauseTimer();  // PausamosTiempo1
      T2.PauseTimer();  // PausamosTiempo2
      Serial.println("Empezamos!");
      inicioLCD = true;
  }
  empezarAnt = empezar;

// Si se pulsa el pulsador del Equipo 1 y el Equipo 2 a la vez pausamos ambos
  if (eq1 && eq2)   {
      T1.PauseTimer();  
      T2.PauseTimer();
      Serial.println("Eq.1 y 2 pausados");
  }
  
  // -------------------------------------------Tiempo1-------------------------------------------
  // Si se pulsa el pulsador del Equipo1, retomamos la cuenta atras
  if (eq1 && !eq1Ant){ // && !eq2){
      T2.PauseTimer(); // PausamosTiempo2
      T1.ResumeTimer(); // TiempoActual
      //tone(5, 2000);
      Serial.println("Eq.1 timer");
  }
  eq1Ant = eq1;

  // -------------------------------------------Tiempo2-------------------------------------------
  // Si se pulsa el pulsador del Equipo2, retomamos la cuenta atras
  if (eq2 && !eq2Ant){ // && !eq1) { // && !T2.TimeHasChanged() ){
      T1.PauseTimer(); // PausamosTiempo1
      T2.ResumeTimer(); // TiempoActual
      //tone(5, 1000);
      Serial.println("Eq.2 timer");
  }
  eq2Ant = eq2;

  
  // -------------------------------------------Final-------------------------------------------
  // Si alguno llega a 00:00 suena la sirena
  if (T1.TimeCheck(0,0,0) || T2.TimeCheck(0,0,0)) {
      //tone(5, 5000, 10000);
      Serial.println("Partida terminada por tiempo");
  }

  //Actualizamos los mensajes
  // Imprimimos mensajes
  char mensaje[20];
  if (T1.TimeHasChanged() || inicioLCD) { // this prevents the time from being constantly shown.
      
      lcd.setCursor(0,0);
      sprintf(mensaje, "Eq.Verde: %02d:%02d", (int) T1.ShowMinutes(), (int) T1.ShowSeconds()) ;
      Serial.println(mensaje);
      lcd.print(mensaje); // Enviar el mensaje
  }

  if (T2.TimeHasChanged() || inicioLCD) {// this prevents the time from being constantly shown.
      lcd.setCursor(0,1);
      sprintf(mensaje, "Eq. Rojo: %02d:%02d", (int) T2.ShowMinutes(), (int) T2.ShowSeconds()) ;
      lcd.print(mensaje); // Enviar el mensaje
      Serial.println(mensaje);
      inicioLCD = false; // solo 1 vez
  }
}

Muchas gracias Surbyte!! No sabía donde poner T1.timer() y T2.timer(). Mañana ya tengo el arduino, podré probarlo :smiley: