#define NumberOfLeds 3 int sensorValue; int button1Pin= 10; int button2Pin = 11; int button3Pin = 12; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int led1Pin = 5; int led2Pin = 6; int led3Pin = 7; int buzzerPin = 13; int count; /* the score */ int timeOut; /* time out ms */ unsigned long setTime; int ledOn; enum state_t { INIT, START, CHECKTIME, SHOWSCORE, END}; enum button_t { NOTHING, TIMEOUT, BUTTONPRESSED}; unsigned long time; unsigned long time1; state_t state; button_t buttonResult; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT); pinMode(button3Pin, INPUT); pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(buzzerPin, OUTPUT); state = INIT; buttonResult = NOTHING; } void loop() { // put your main code here, to run repeatedly: sensorValue = analogRead(A0); buttonState1 = digitalRead(button1Pin); buttonState2 = digitalRead(button2Pin); buttonState3 = digitalRead(button3Pin); switch (state) { case INIT: { count = 0; timeOut = 1000; if ( AnyButtonPressed()) /* start game if any button pressed */ { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); state = START; delay(1000); } } break; case START: { do /* wait for button release */ { } while (AnyButtonPressed()); ledOn = random(0,NumberOfLeds); /* switch on a led */ SetLed(ledOn); setTime = millis(); /* sample current time */ Serial.print("Switch on LED : "); Serial.println (ledOn); state = CHECKTIME; } break; case CHECKTIME: /* in this state we wait for the correct button to be pressed or the timeout has passed */ { buttonResult = CheckButton( ledOn, timeOut); if (buttonResult == TIMEOUT) /* game over */ { state = END; Serial.println("CheckTime timeout "); } if (buttonResult == BUTTONPRESSED) /* continue with new led/button */ { SetAllLeds(LOW); Serial.println("CheckTime pressed ok "); count++; state = START; timeOut -= 10; /* decrement timeout with 10 ms for the next level */ digitalWrite(buzzerPin, HIGH); delay(500); digitalWrite(buzzerPin, LOW); } } break; case END: { SetAllLeds(HIGH); // Serial.print("Game over! Score : "); // Serial.println (count); if ( AnyButtonPressed() ) { state = SHOWSCORE; } } break; case SHOWSCORE: { ShowScore(); } break; default: { Serial.print("Unkown State: "); Serial.println (state); } break; } } /* set only one led */ void SetLed (int led) { switch (led) { case 0: { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); } break; case 1: { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, HIGH); digitalWrite(led3Pin, LOW); } break; case 2: { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, HIGH); } break; default: Serial.print("Led out of range to switch on: "); Serial.println( led); break; } } /* checks if the right button is pressed and if time out has occued since setting the led */ button_t CheckButton( int led, int timeOut) { bool buttonPressed = false; unsigned long time; button_t result = NOTHING; time = millis(); if (time - setTime > timeOut) { result = TIMEOUT; } else { switch (led) { case 0: { if (buttonState1 == HIGH) { buttonPressed = true; } } break; case 1: { if (buttonState2 == HIGH) { buttonPressed = true; } } break; case 2: { if (buttonState3 == HIGH) { buttonPressed = true; } } break; default: { Serial.print("Led out of range to switch on: "); Serial.println( led); } break; } if (buttonPressed) { result = BUTTONPRESSED; } } return result; } bool AnyButtonPressed(void) { bool result; buttonState1 = digitalRead(button1Pin); buttonState2 = digitalRead(button2Pin); buttonState3 = digitalRead(button3Pin); if ( buttonState1 || buttonState2 || buttonState3) { result = true; } else { result = false; } return result; } void SetAllLeds( int val) { digitalWrite(led1Pin, val); digitalWrite(led2Pin, val); digitalWrite(led3Pin, val); } void ShowScore(void) { int x; SetAllLeds(LOW); delay(1000); for (x=0;x