I'm trying to make this simple game similar to a Simon game but different. The code feels like it's close but I'm getting a wrong answer time every time I try to play it.
I want the Arduino to light up 4 or 5 leds and the player pushes buttons that correspond to those leds in the same order to advance to the next level. As they get them correct a neopixel illuminates another pixel. It's just a simple kids game but I don't get to dabble with the IDE much so I'm always struggling a bit.
This code starts when the start button is pushed, runs through the leds then when I hit a button it always says error even though it's not.
I've ran some different code on the setup and it all works from a hardware side. Anyone see anything super obvious wrong in this code? THANKS!
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
const int NEOPIXEL_PIN = 19;
const int NEOPIXEL_COUNT = 24;
Adafruit_NeoPixel neopixels = Adafruit_NeoPixel(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);
const int buttonStart = 2;
const int button1 = 3;
const int button2 = 4;
const int button3 = 5;
const int button4 = 6;
const int button5 = 7;
const int button6 = 8;
const int button7 = 9;
const int led1 = 10;
const int led2 = 11;
const int led3 = 12;
const int led4 = 13;
const int led5 = 14;
const int led6 = 15;
const int led7 = 16;
const int ledError = 18;
int sequence[20];
int level = 1;
int currentStep = 0;
bool gameStarted = false;
void setup() {
pinMode(buttonStart, INPUT_PULLUP);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
pinMode(button5, INPUT_PULLUP);
pinMode(button6, INPUT_PULLUP);
pinMode(button7, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(ledError, OUTPUT);
randomSeed(analogRead(0));
neopixels.begin();
}
void loop() {
if (!gameStarted) {
// Wait for game to start
if (digitalRead(buttonStart) == LOW) {
delay(1000); //was 5000
newGame();
}
return;
}
if (level > 20) {
// Game won!
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
level = 1;
currentStep = 0;
gameStarted = false;
return;
}
if (currentStep == level) {
// Next level
level++;
currentStep = 0;
showSequence();
return;
}
if (digitalRead(button1) == LOW) {
checkStep(led1);
}
if (digitalRead(button2) == LOW) {
checkStep(led2);
}
if (digitalRead(button3) == LOW) {
checkStep(led3);
}
if (digitalRead(button4) == LOW) {
checkStep(led4);
}
if (digitalRead(button5) == LOW) {
checkStep(led5);
}
if (digitalRead(button6) == LOW) {
checkStep(led6);
}
if (digitalRead(button7) == LOW) {
checkStep(led7);
}
}
void newGame() {
gameStarted = true;
for (int i = 0; i < 20; i++) {
sequence[i] = random(7) + 1;
}
level = 1;
currentStep = 0;
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
showSequence();
}
void showSequence() {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
int ledsToShow[4];
for (int i = 0; i < 4; i++) {
int ledIndex = random(7) + 1;
while (ledIndex == ledsToShow[0] || ledIndex == ledsToShow[1] || ledIndex == ledsToShow[2] || ledIndex == ledsToShow[3]) {
ledIndex = random(7) + 1;
}
ledsToShow[i] = ledIndex;
}
for (int i = 0; i < 4; i++) {
delay(800); //WAS 700
if (ledsToShow[i] == 1) {
digitalWrite(led1, HIGH);
} else if (ledsToShow[i] == 2) {
digitalWrite(led2, HIGH);
} else if (ledsToShow[i] == 3) {
digitalWrite(led3, HIGH);
} else if (ledsToShow[i] == 4) {
digitalWrite(led4, HIGH);
} else if (ledsToShow[i] == 5) {
digitalWrite(led5, HIGH);
} else if (ledsToShow[i] == 6) {
digitalWrite(led6, HIGH);
} else {
digitalWrite(led7, HIGH);
}
delay(400); // WAS 300
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
}
}
void checkStep(int ledPin) {
if (sequence[currentStep] == (ledPin - 9)) {
// Correct step...
digitalWrite(ledPin, HIGH);
delay(500); //WAS 300
digitalWrite(ledPin, LOW);
neopixels.setPixelColor(currentStep + 15, 0, 255, 0); // set the current pixel to green with an offset of 15
neopixels.show(); // show the updated pixels
currentStep++;
if (currentStep == level) {
delay(1000);
}
} else {
// Wrong step...
for (int i = 0; i < NEOPIXEL_COUNT; i++) {
neopixels.setPixelColor(i, neopixels.Color(200, 50, 20));
}
neopixels.show();
digitalWrite(ledError, HIGH); // Turn on error LED
delay(2000); // Wait for 1 second
neopixels.fill(0, 0, 0); // Turn off neopixels
neopixels.show();
digitalWrite(ledError, LOW); // Turn off error LED
//level = 1;
// currentStep = 0;
gameStarted = false;
}
}