Flashback to the 80’s with this recreation of the popular sound and light electronic Simon says game. With this project which is ideal for kids, you’ll be having hours of fun with just a handful of components and some simple code.
Arduino IDE is what you’ll use to programme your Arduino. You can skip this step if you already have Arduino IDE
const int MAX_LEVEL = 100;
int sequence[MAX_LEVEL];
int sound[MAX_LEVEL];
int gamer_sequence[MAX_LEVEL];
int level = 1;
int note = 0;
int velocity = 1000;
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT); //green led
pinMode(12, OUTPUT); //red led
pinMode(11, OUTPUT); //yellow led
pinMode(10, OUTPUT); //blue led
pinMode(9, INPUT_PULLUP); //button 1 green
pinMode(8, INPUT_PULLUP); //button 2 red
pinMode(7, INPUT_PULLUP); //button 3 yellow
pinMode(6, INPUT_PULLUP); //button 4 blue
pinMode(3, OUTPUT); //buzzer
}
void loop() {
if (level == 1) {
generate_sequence();
for (int i = 13; i >= 10; i--) { //flashing leds sequence
digitalWrite(i, HIGH);
delay(60);
digitalWrite(i, LOW);
}
}
if (digitalRead(9) == LOW || level != 1) { //start button
show_sequence();
get_sequence();
}
}
void generate_sequence() {
randomSeed(millis()); //true random
for (int i = 0; i < MAX_LEVEL; i++) {
sequence[i] = random(10, 14);
switch (sequence[i]) { //convert color to sound
case 10:
note = 349; //Fa
break;
case 11:
note = 329; //Mi
break;
case 12:
note = 293; //Re
break;
case 13:
note = 261; //Do
break;
}
sound[i] = note;
}
}
void show_sequence() {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
for (int i = 0; i < level; i++) {
digitalWrite(sequence[i], HIGH);
tone(3, sound[i]);
delay(velocity);
digitalWrite(sequence[i], LOW);
noTone(3);
delay(200);
}
}
void get_sequence() {
int flag = 0; //flag correct sequence
for (int i = 0; i < level; i++) {
flag = 0;
while (flag == 0) {
if (digitalRead(9) == LOW) {
digitalWrite(13, HIGH);
tone(3, 261); //Do
delay(velocity);
noTone(3);
gamer_sequence[i] = 13;
flag = 1;
delay(200);
if (gamer_sequence[i] != sequence[i]) {
wrong_sequence();
return;
}
digitalWrite(13, LOW);
}
if (digitalRead(8) == LOW) {
digitalWrite(12, HIGH);
tone(3, 293); //Re
delay(velocity);
noTone(3);
gamer_sequence[i] = 12;
flag = 1;
delay(200);
if (gamer_sequence[i] != sequence[i]) {
wrong_sequence();
return;
}
digitalWrite(12, LOW);
}
if (digitalRead(7) == LOW) {
digitalWrite(11, HIGH);
tone(3, 329); //Mi
delay(velocity);
noTone(3);
gamer_sequence[i] = 11;
flag = 1;
delay(200);
if (gamer_sequence[i] != sequence[i]) {
wrong_sequence();
return;
}
digitalWrite(11, LOW);
}
if (digitalRead(6) == LOW) {
digitalWrite(10, HIGH);
tone(3, 349); //Fa
delay(velocity);
noTone(3);
gamer_sequence[i] = 10;
flag = 1;
delay(200);
if (gamer_sequence[i] != sequence[i]) {
wrong_sequence();
return;
}
digitalWrite(10, LOW);
}
}
}
right_sequence();
}
void right_sequence() {
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
delay(250);
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
delay(500);
if (level < MAX_LEVEL) {
level++;
}
velocity -= 50; //increases difficulty
}
void wrong_sequence() {
for (int i = 0; i < 3; i++) {
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
tone(3, 233);
delay(250);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
noTone(3);
delay(250);
}
level = 1;
velocity = 500;
}
That’s it, your Simon says should be ready to go!
Playing the game is simple. After booting the LEDs will flash in sequence.
Enjoy!
From a quick tap to smashing that love button and show how much you enjoyed this project.