I'm trying to build a little Simon Says game, where the arduino will flash an increasingly long sequence of colours at you, and you have to repeat the colour sequence back.
So I have it generating and extending the sequence properly, and the LED flashes to display the current sequence correctly, but when you are repeating the code back (using a set of three push-buttons, it will somehow just randomly register that you pressed a different button than you did. It seems to be like a 70/30 shot as to whether it will detect the correct button.
I've rewired it over and over, and can't see any issue.
Is there perhaps a problem in my section of code where I'm waiting for a button press in the loop function?
int redOut = 18;
int greenOut = 19;
int blueOut = 20;
int redPress = 21;
int greenPress = 22;
int bluePress = 23;
int buzzerOut = 13;
int lastPress = NULL;
int sequence[30];
//int currentSequenceMax;
int currentSequenceLocation;
int currentNumberOfColours;
void addToSequence()
{
sequence[currentNumberOfColours] = random(redOut,blueOut +1);
currentNumberOfColours++;
currentSequenceLocation = 0; //We've just added a colour, so start from the beginning
}
void displaySequence()
{
for(int x = 0; x <= currentNumberOfColours; x++)
{
if(sequence[x] != 0)
{
digitalWrite(sequence[x], HIGH);
delay(500);
digitalWrite(sequence[x], LOW);
delay(500);
}
else
{
break;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(redPress, INPUT);
pinMode(greenPress, INPUT);
pinMode(bluePress, INPUT);
currentNumberOfColours = 0;
currentSequenceLocation = 0;
for(int x = 0; x < 30; x++)
{
sequence[x] = 0;
}
digitalWrite(redOut, HIGH);
digitalWrite(greenOut, HIGH);
digitalWrite(blueOut, HIGH);
delay(200);
digitalWrite(redOut, LOW);
digitalWrite(greenOut, LOW);
digitalWrite(blueOut, LOW);
delay(200);
digitalWrite(redOut, HIGH);
digitalWrite(greenOut, HIGH);
digitalWrite(blueOut, HIGH);
delay(200);
digitalWrite(redOut, LOW);
digitalWrite(greenOut, LOW);
digitalWrite(blueOut, LOW);
addToSequence();
delay(1000);
//createTestSequence();
displaySequence();
}
void loop() {
// put your main code here, to run repeatedly:
//lastPress = 0;
int req = sequence[currentSequenceLocation];
//wait for the player to press something
while(digitalRead(redPress) == HIGH || digitalRead(greenPress) == HIGH || digitalRead(bluePress) == HIGH)
{
}
while (digitalRead(redPress) == LOW && digitalRead(greenPress) == LOW && digitalRead(bluePress) == LOW) {
if (digitalRead(redPress) == HIGH) {
Serial.println("RED PRESSED");
lastPress = redOut;
digitalWrite(redPress, LOW);
//digitalWrite(redOut, LOW);
break;
}
else if (digitalRead(bluePress) == HIGH) {
Serial.println("BLUE PRESSED");
lastPress = blueOut;
digitalWrite(bluePress, LOW);
//digitalWrite(redOut, LOW);
break;
}
else if (digitalRead(greenPress) == HIGH) {
Serial.println("GREEN PRESSED");
lastPress = greenOut;
digitalWrite(greenPress, LOW);
//digitalWrite(redOut, LOW);
break;
}
}
/*if(lastPress == 23)
{
lastPress = 20;
}
else if(lastPress == 22)
{
lastPress = 19;
}
else if(lastPress == 21)
{
lastPress = 18;
}*/
if(lastPress == req)
{
Serial.println(lastPress);
Serial.println(req);
digitalWrite(greenOut, HIGH);
delay(500);
digitalWrite(greenOut, LOW);
currentSequenceLocation++;
}
else
{
Serial.println(lastPress);
Serial.println(req);
digitalWrite(redOut, HIGH);
delay(500);
digitalWrite(redOut, LOW);
setup();
}
if(currentSequenceLocation == currentNumberOfColours)
{
addToSequence();
delay(1000);
displaySequence();
}
//digitalWrite(redOut, HIGH);
}
What you're looking at in my very limited circuit diagram skills is this:



