Arduino Starter Series - The Binary Dice Game
This is a project from my Arduino starter series.
In this project I'm going to make a binary dice using some LEDs and switches on a breadboard connected to an Arduino Uno. This project is ideal for beginners who have grasped the basics of Arduino programming and prototyping but wish to learn something a little more advanced. Enjoy!
Project Requirements
- Arduino Uno/Duemilanove/Diecimila
- USB cable to program Arduino
- Breadboard
- Three LEDS (Any colours will do)
- Three 220 Ohm Resistors
- Two 1k Resistors
- Two Pushbuttons
- Wires to power the components on the breadboard
The Breadboard Setup
Arduino Sketch
As usual, I've commented the code as mush as possible to explain every line.
#include <Bounce2.h> // Useful library to help with pushbutton debouncing
// Pin setup
// LED pins
int LED0 = 13;
int LED1 = 12;
int LED2 = 11;
// Misc Pins
int RANDOMBUTTON = 7; // Pin that controls the pushbutton for randomisation
int STARTBUTTON = 6; // Pin that controls the pushbutton to start the game
int BAUDRATE = 9600; // Set the BAUD for serial communication
int DELAY = 20; // Millisecond delay for debounce on buttons
// Store the random value for the game generated when pushing the random button
int randomNum = 0;
// Bounce buttons using the Bounce2 library to simplify bounce concerns
// Read more about Bounce2 here:
// https://github.com/thomasfredericks/Bounce2/wiki
Bounce startButton;
Bounce randomButton;
void setup() {
// Setting output mode for LED pins
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
// Setting input mode for pushbutton pins
pinMode(STARTBUTTON, INPUT);
pinMode(RANDOMBUTTON, INPUT);
// Setup for the start button, attaching it to the pushbutton pin and setting the button debounce delay
startButton.attach(STARTBUTTON);
startButton.interval(DELAY);
// Setup for the random button, attaching it to the pushbutton pin and setting the button debounce delay
randomButton.attach(RANDOMBUTTON);
randomButton.interval(DELAY);
// Generating a random seed so the randomisation is always unique at each boot
randomSeed(analogRead(14));
// Serial monitor is required to display the random number and result of the game
Serial.begin(BAUDRATE);
}
// Loop function checks both buttons for interactivity
void loop() {
loop_randomButton();
loop_startButton();
}
// Random button functionality
void loop_randomButton() {
if (randomButton.update()) {
// If the button is pressed, output the result to the LEDs and to the Serial monitor
if (randomButton.read() == HIGH) {
randomNum = random(1, 7); // Generate a random number
led_display(randomNum); // Run the led display function to display the random number in binary on the LEDs
// Display the guess in the Serial monitor
Serial.print("Random Guess: ");
Serial.println(randomNum);
}
}
}
// Start button functionality
void loop_startButton() {
if (startButton.update()) {
// If the button is pressed, generate a random number and display the result on the LEDS and the Serial monitor
// Also check if the result is the same as the random result and run the player win function to indicate that the player has won
if (startButton.read() == HIGH) {
int result = random(1, 7); // Generate a random number between 1 and 7 (Notice that the binary operations in led_display only go up to 7
led_display(result); // Run the output function to display the result in binary on the LEDs
// Display the result in the Serial monitor
Serial.print("Result: ");
Serial.println(result);
// Check the result against the random value
if (randomNum > 0) {
if (result == randomNum) { // If the result and random match then the player wins
Serial.println("Player win!"); // Display win status in the Serial Monitor
playerWins(); // Flash the LEDS using the player win function
} else { // If the the random number and result don't match then the player loses
Serial.println("Player loses!");
}
}
delay(2000); // Delay by 2 seconds to prevent
randomNum = 0; // Reset randomNum to 0, this ensures that a player can only attempt to match the randomNum once
}
}
}
// Display the resulting valued in binary on the LEDS
// More information on Bitwise AND operations are available here:
// http://playground.arduino.cc/Code/BitMath#bitwise_and
// Converting the result into binary. The & checks the result determining if the binary version is 1 or 0 which sets the LED status accordingly
// Notice the changes to the B001, B010, B100
// The binary values used are:
// B001 = 1; B010 = 2; B011 = 3; B100 = 4; B101 = 5; B110 = 6; B111 = 7;
// Now you can see that the binary dice goes up to 7 values, you can add more LEDs and increase the random value range to make a more complex dice
void led_display(const long result) {
digitalWrite(LED0, result & B001);
digitalWrite(LED1, result & B010);
digitalWrite(LED2, result & B100);
}
// This function just flashes the lights indicating that the player has won
void playerWins() {
// Run this function 5 times
for (unsigned int i = 0; i < 5; i++) {
led_display(7); // Sets all LEDs on using the output_result function which is B111 meaning that all LEDs are enabled
delay(100);
led_display(0); // Turns all the LEDs off
delay(100);
}
}
Project available on Github at Arduino Binary Dice