Catch It - Steve Dickie
Description:
This is a simple game, there are five lights. When you hold the button each light will light in sequence. Your task is to let go when the green light is on. After catching the green light the sequence gets faster and you try to catch it again. If you miss five times it starts over.
Program Description
First we read the button, if it is being held then we run through the sequence of LEDs. This runs basically like a "for" loop, but will check to see if we're still holding the button at each step.
void loop()
{
val = digitalRead(inputPin); // read the pushbutton state
if (val == HIGH) // Button is being held
{
if (ledPin > 8){ // Iniates/continues loop to run through LEDs
ledPin = ledPin -1;
pinMode(ledPin, OUTPUT); // sets the digital pin as output
digitalWrite(ledPin, HIGH); // sets the LED-ledPin on
delay(wait); // waits for time based upon______
digitalWrite(ledPin, LOW); // sets the LED-ledPin off
}
else {
ledPin=14; // restarts the loop
}
}
If the button is released and val==LOW we then check to see if the right LED is lit. If the green LED is lit (pin 11). Then we freeze it for one second, reset ledPin to 14, which will start the loop over again. It will also decrease the "wait" time making the sequence run faster. If you release at the wrong time the "wrong" counter will increase and ledPin will be set to 14. While ledPin==14 the loop will basically wait for you to push and hold the button again. That's what "else if (ledPin<14)" is for. You can only be wrong if you release the button after the LED sequence has started.
else { // button released
if (ledPin == 11) // Is the green light lit?
{ // If green on leave on for one second
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
ledPin = 14; // reset loop
wait = wait*.9; // decrease wait to make game tougher
Serial.println(wait); // send wait time to computer
}
else if (ledPin<14) { // if wrong
wrong=wrong+1; // increase wrong counter
Serial.println(wrong);
ledPin=14; // reset loop
If you're wrong 5 times you loose. All the LEDs will light up for two seconds and then go out and all the variables will be reset to initial conditions.
if (wrong==5){ // Check to see if it's game over
// Begin end game, which will light all LEDs
// for 2 seconds and then reset the game
for (int ledPin = 13; ledPin >= 8; ledPin = ledPin-1)
{ // Turn on all LEDs
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
}
delay(2000); // Wait 2 seconds
for (int ledPin = 13; ledPin >= 8; ledPin = ledPin-1)
{ // Turn off all LEDs
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
wrong=0; // Reset the game to inital conditions
ledPin=14;
wait=100;
}
Complete Program
/*
*This is a game. To play you push and hlod the button.
*Try to let go of the button when the green pin is lit.
*After catching the green light the sequence gets faster.
*Fail to catch the green light 5 times and you loose.
*The game will reset.
*
*To set up the circuit:
*Button on Pin 2, LEDs on pins 8-13. One green led in pin 11.
*/
int inputPin = 2; // declares the pushbutton pin
int ledPin = 14; // declares ledPin
int val = 0; // val stores the pushbutton state
int wait = 100; // sets the initial speed of the game
int wrong = 0; // iniates the miss counter
void setup ()
{
pinMode(inputPin, INPUT); // set the pushbutton as an input
Serial.begin(9600); // prepare the board for seial communication for debuging purposes
}
void loop()
{
val = digitalRead(inputPin); // read the pushbutton state
if (val == HIGH) // Button is being held
{
if (ledPin > 8){ // Iniates/continues loop to run through LEDs
ledPin = ledPin -1;
pinMode(ledPin, OUTPUT); // sets the digital pin as output
digitalWrite(ledPin, HIGH); // sets the LED-ledPin on
delay(wait); // waits for time based upon______
digitalWrite(ledPin, LOW); // sets the LED-ledPin off
}
else {
ledPin=14; // restarts the loop
}
}
else { // button released
if (ledPin == 11) // Is the green light lit?
{ // If green on leave on for one second
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
ledPin = 14; // reset loop
wait = wait*.9; // decrease wait to make game tougher
Serial.println(wait); // send wait time to computer
}
else if (ledPin<14) { // if wrong
wrong=wrong+1; // increase wrong counter
Serial.println(wrong);
ledPin=14; // reset loop
if (wrong==5){ // Check to see if it's game over
// Begin end game, which will light all LEDs
// for 2 seconds and then reset the game
for (int ledPin = 13; ledPin >= 8; ledPin = ledPin-1)
{ // Turn on all LEDs
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
}
delay(2000); // Wait 2 seconds
for (int ledPin = 13; ledPin >= 8; ledPin = ledPin-1)
{ // Turn off all LEDs
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
wrong=0; // Reset the game to inital conditions
ledPin=14;
wait=100;
}
}
}
}