Reloj de Ajedrez con Arduino

En un tutorial anterior vimos como utilizar la pantalla LCD 16×2 de manera fácil y sencilla. Ahora vamos a encarar un interesante proyecto que es la del reloj para ajedrez.

La idea básicamente es utilizar el LCD para mostrar el tiempo transcurrido de cada uno de los jugadores y con 2 pulsadores hacer que los tiempos de cada uno de estos se activen.

Entonces…lo primero que va a hacer nuestro sistema es iniciar en cero ambos contadores y cuando el blanco pulse  su botón, iniciar la cuenta del negro. Después, cuando el negro pulse su botón, pausar su cuenta y continuar con la cuenta del blanco…y así se ira repitiendo este mismo ciclo.

Una de las mayores dificultades a sortear es que no perdamos agilidad de lectura del pulsador. Ya que es critico que cuando el jugador pulse su botón, cambie al contador del otro. Por ello, fraccionamos el delay de 1000 o 1 segundo en 3 partes y entre cada una de ellas leemos los pulsadores en una función.

Bueno…comencemos entonces.

Que necesitamos para hacerlo?

1-Software Necesario

 

El ide (entorno de programacion) del Arduino descargado e Instalado

Chequear siempre antes de cargar cualquier código de arduino a la placa, que este bien seleccionado la Placa que estemos utilizando y el Puerto al cual esta conectada la misma.

 

2-Componentes Electrónicos

 

 

 

1 – Arduino Uno o cualquier otro tipo de Arduino que disponga de los pines hembra soldados.

 

 

 

1 -Cable USB para conectar el Arduino a la PC

 

 

 

 

1-Protoboard ya sea de 400 puntos o de 830 puntos

 

 

 

 

2-Pulsador o tambien conocido como touch switch. Suelen venir de 4 o 2 patas.

 

 

10- Cables macho macho para la conexión de los elementos de la protoboard con el arduino.

 

 

 

 

2-Resistencia de 10k para el pull-up del pulsador

 

1-Potenciometro para ajustar el contraste del LCD

 

1-Pantalla Lcd 16×2

 

 

 Esquema de conexión eléctrica

Les dejo también el esquema y la diferencia entre el pull-down y el  pull-up que estamos usando en este esquemático.

El primero también se conoce como lógica positiva, ya que cada vez que pulso al pulsador equivale a un HIGH o “1” y si lo suelto es un cero.

En cambio el pull-up es exactamente lo contrario.

Código de Programación

/*
El objetivo es hacer un reloj simple
y que con un pulsador el reloj funcione
y con el otro lo pauso
*/

//lo primero es incluir la libreria del LCD
#include <LiquidCrystal.h>

//Indicamos cuales seran los pines del LCD a utilizar
//LiquidCrystal lcd(RS,E,D4,D5,D6,D7);
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

const int pulsador_jugador1=6;
const int pulsador_jugador2=5;

int segundo1=0;   //variable del segundo jugador 1
int minuto1=0;   //variable del minuto jugador 1
int hora1=0;   //variable de la hora jugador 1

int segundo2=0;   //variable del segundo jugador 2
int minuto2=0;   //variable del minuto jugador 2
int hora2=0;   //variable de la hora jugador 2

int quien_juega=0; //variable con el que defino quien esta jugando

void setup() 
{
  lcd.begin(16, 2);  //inicializamos LCD como una de 16x2
  pinMode(pulsador_jugador1,INPUT);
  pinMode(pulsador_jugador2,INPUT);
}

void loop() 
{
   detecto_pulsador();
   
    lcd.setCursor(0,0);    //imprimo tiempo del jugador 1 arriba   
    lcd.print("Jugad1: ");   
    lcd.print(hora1);   
    lcd.print(":");   
    lcd.print(minuto1);   
    lcd.print(":");  
    lcd.print(segundo1);   

    lcd.setCursor(0,1);    //imprimo tiempo del jugador 2 abajo
    lcd.print("Jugad2: ");   
    lcd.print(hora2);  
    lcd.print(":");   
    lcd.print(minuto2);   
    lcd.print(":");   
    lcd.print(segundo2);  
  
  if(quien_juega==1)   //cuenta reloj jugador 1
  { 
    segundo1++;
     detecto_pulsador();
    delay(333);
     detecto_pulsador();
    delay(333);
     detecto_pulsador();
    delay(333);
    
    if(segundo1>59)
    {
      segundo1=0;
      minuto1++;
      if(minuto1>59)
      {
        minuto1=0;
        hora1++;
        if(hora1>23)
          hora1=0;
      }
    }
  }

  if(quien_juega==2)  //cuenta reloj jugador 2
  { 
    segundo2++;
     detecto_pulsador();
    delay(333);
     detecto_pulsador();
    delay(333); 
    detecto_pulsador();
    delay(333);
    
    if(segundo2>59)
    {
      segundo2=0;
      minuto2++;
      if(minuto2>59)
      {
        minuto2=0;
        hora2++;
        if(hora2>23)
          hora2=0;
      }
    }
  }

}

void detecto_pulsador(void )
{
  if(digitalRead(pulsador_jugador1)==HIGH)  //detecto si pulso jugador1
  {
    quien_juega=2;
  }
  
  if(digitalRead(pulsador_jugador2)==HIGH)  //detecto si pulso jugador2
  {
    quien_juega=1;
  }
}

Desafíos adicionales

 

1) Hacer un menú de inicio cuando arranque el sistema, diciendo pro ejemplo “Bienvenido” “Chess System” y que lo muestre por 5 segundos. Luego de dicho menú seguimos con el programa de arriba con los tiempos.

2) Implementar un sistema de alarma o señalizacion cuando alguno de los jugadores llega a 1 hora y que pause las cuentas, así podemos saber que jugador llego a su tiempo limite de 1 hora.