Introduction: Arduino Chess Clock

There are various rates of play in use. The following indicates the different options available:

Blitz has typical time limits of 5 minutes for each player for all of the moves.
Rapidplay is played with typical time limits of 30 minutes for each player for all the moves.
Local league chess has typical time controls of 75 minutes.
International chess has a standard time control of 40 moves in 2 hours and then an extra hour to reach move 60. After this, if the game is still in progress a quickplay finish decides the game.

Step 1: Parts List

  • 2 momentary push buttons
  • 14 220ohm resistors
  • Potentiometer
  • One red led, one blue led
  • 10-Leds ledsbar (Bargraph)
  • Piezo buzzer
  • Copper Tape
  • Wires
  • Arduino Pro Mini

Step 2: Connections

Buttons :
Each button is connected to 5v at one joint and to a pulldown resistor wich connected to ground.
Also the red button is connected to the arduino digital pin 2 and the black button is connected to arduino digital pin 3.

Leds :
The red led is connected to at the anode to a limiting resistor (220 ohm) and then to arduino digital pin 4, the black (blue) led is connected the dame but to arduino digital pin 5.
both are connected to ground at the cathod.

Buzzer :
Anode is connected to arduino digital pin 9, wich is also capable of PWM.
Cathod is connected to ground.

Potentiometer :
Joint 1 is connected to 5v.
Joint 2 is connected to arduino analog pin 3 (A3)
and the 3rd joint is connected to ground

Leds Bar :
The leds bar is actually 10 leds, so each on is connected at the cathod to a limiting resistor and then to ground.
The anodes are connected to pins 6 to 8, 10 to 13 accordingly and then to pins 14 to 16 wich are actually A0, A1, A2 (since you can also use them as digital pins).

Toggle Switch :
Is connected to battery at one joint and to arduino RAW

Battery :
Anode is connected to Toggle Switch, Cathod is connected to arduino GND

Step 3: CODE

#define buzz 9
#define redB 2
#define blackB 3
#define redLed 4
#define blackLed 5
#define selectorP A3
int leveler[10] = {6, 7, 8, 10, 11, 12, 13, A0, A1, A2};
long gameType[6] = {300000, 1800000, 4500000, 7200000, 60000, 120000};
int gameTypeSelector; 
long redStart = 0, blackStart = 0;
long startTime;
boolean redTurn = true;
void setup() {
  pinMode (buzz, OUTPUT);
  pinMode (redB, INPUT);
  pinMode (blackB, INPUT);
  pinMode (redLed, OUTPUT);
  pinMode (blackLed, OUTPUT);
  
  for (int i = 0; i <= 9; i++) {
    pinMode (leveler[i], OUTPUT);
  }
  Serial.begin (9600);
}
void fillLevel (int level) {
  digitalWrite (leveler[0], LOW);
  digitalWrite (leveler[1], LOW);
  digitalWrite (leveler[2], LOW);
  digitalWrite (leveler[3], LOW);
  digitalWrite (leveler[4], LOW);
  digitalWrite (leveler[5], LOW);
  digitalWrite (leveler[6], LOW);
  digitalWrite (leveler[7], LOW);
  digitalWrite (leveler[8], LOW);
  digitalWrite (leveler[9], LOW);
  
  for (int i = 0; i <= level - 1; i++) {
   digitalWrite (leveler[i], HIGH);
  }
}
void justLevel (int level) {
  digitalWrite (leveler[0], LOW);
  digitalWrite (leveler[1], LOW);
  digitalWrite (leveler[2], LOW);
  digitalWrite (leveler[3], LOW);
  digitalWrite (leveler[4], LOW);
  digitalWrite (leveler[5], LOW);
  digitalWrite (leveler[6], LOW);
  digitalWrite (leveler[7], LOW);
  digitalWrite (leveler[8], LOW);
  digitalWrite (leveler[9], LOW);
  
  digitalWrite (leveler[level], HIGH);  
}
int timeBar(boolean timeBaseGame) {
  int TB;
  if (!timeBaseGame) {  // if not a time based game
    gameTypeSelector = map (analogRead (selectorP), 0, 1023, 0, 5);
    long endTime = gameType[gameTypeSelector] + startTime;
    Serial.println (gameType [gameTypeSelector]);
    /*Serial.print ("Start Time : ");
    Serial.print (startTime);
    Serial.print (" End Time : ");
    Serial.print (endTime);
    Serial.print (" Now time : ");
    Serial.println (millis());*/
    TB = map (millis (), startTime, endTime, 0, 10);
    if (TB >=10) {
      startTime = millis ();
      buzzer ();
      redTurn = !redTurn;
      return 10;
    } else {
      return TB;
    }
  } else {  // if time based game 
    if (redTurn) {
      TB = map (redStart + (millis() - startTime), 0, gameType[gameTypeSelector], 0, 10);
    } else {
      TB = map (blackStart + (millis() - startTime), 0, gameType[gameTypeSelector], 0, 10);
    }
    if (TB >=10) {
      while (redStart >= 0 && blackStart >=0) {  //Lost by clock action
          if (millis () % 500 == 0) {
            buzzer ();
          }
            return 10;
      }
        if (digitalRead (blackB)) {  //Game RESET
          if (digitalRead (redB)) {
            redTurn = true;
            redStart = 0;
            blackStart = 0;
            startTime = millis ();
          }
        }  // End of Game RESET  
    } else {
      return TB;
    }
  }
}
void buzzer () {
  tone (buzz, 400);
  delay (300);
  noTone (buzz);
}
void loop() {                                  //*****************************************************************************************************
  gameTypeSelector = map (analogRead (selectorP), 0, 1023, 0, 5);
  if (gameType[gameTypeSelector] <= 120000) {  //The 1 minuts and 2 minuts regular move time counter
    if (redTurn) { 
      digitalWrite (redLed, HIGH);
      digitalWrite (blackLed, LOW);
    
      if (digitalRead (redB)) {
        startTime = millis ();
        redTurn = false;
        buzzer (); 
      }
    } else {
      digitalWrite (redLed, LOW);
      digitalWrite (blackLed, HIGH);
      if (digitalRead (blackB)) {
        startTime = millis ();
        redTurn = true;
        buzzer ();
      }
    }
  fillLevel (timeBar(false));
  } // end of regular move time counter
  else {
    if (redTurn) {
      digitalWrite (redLed, HIGH);
      digitalWrite (blackLed, LOW);
      
      fillLevel (timeBar(true));
      if (digitalRead (redB)) {
        redStart = redStart + (millis () - startTime);
        Serial.print ("Red Time stands : ");
        Serial.print (redStart);
        Serial.print (" out of : ");
        Serial.println (gameType[gameTypeSelector]);
        startTime = millis ();
        redTurn = false;
      }
     } else {
       digitalWrite (redLed, LOW);
       digitalWrite (blackLed, HIGH);
      
      fillLevel (timeBar(true));
      if (digitalRead (blackB)) {
        
        if (digitalRead (redB)) {    // Game RESET
          digitalWrite (redLed, HIGH);
          digitalWrite (blackLed, HIGH);
          redTurn = true;
          redStart = 0;
          blackStart = 0;
          startTime = millis ();
        } // end of Game RESET
        
        blackStart = blackStart + (millis () - startTime);
        Serial.print ("Black Time stands : ");
        Serial.print (blackStart);
        Serial.print (" out of : ");
        Serial.println (gameType[gameTypeSelector]);
        startTime = millis ();
        redTurn = true;
      }
    }
  }
} // end void loop ************************************************************************************************************************************