#include <LiquidCrystal.h>
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;
const int rs = 27, en = 26, d4 = 25, d5 = 24, d6 = 23, d7 = 22;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
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
lcd.begin(16, 2);
// Print a message to the LCD.
}
void loop() {
if (level == 1) {
generate_sequence();
lcd.print(" Druk op GROEN ");
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() {
lcd.clear();
lcd.write("Round: ");
lcd.print(level,1);
delay(1200);
lcd.clear();
lcd.print("GET READY");
delay(900);
lcd.clear();
for (int z = 3; z >= 1; z--) {
lcd.print(z,1);
delay(600);
lcd.clear();
};
lcd.print("GO");
delay(600);
lcd.clear();
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() {
while ( digitalRead(9) == HIGH &&
digitalRead(8) == HIGH &&
digitalRead(7) == HIGH &&
digitalRead(6) == HIGH )
{
for (int a = 30; a >= 1; a--) {
lcd.print(a,1);
if ( a > 25 ) lcd.print(" Je hebt 30sec");
lcd.setCursor(0,1);
if ( a > 25 ) lcd.print("guess the colors");
if ( a < 25 && a > 20 ) lcd.print("Push the buttons");
byte col = 0;
if ( a < 10 ) lcd.print(" HURRY UP");
delay(600);
lcd.clear();
if (digitalRead(9) == LOW ||
digitalRead(8) == LOW ||
digitalRead(7) == LOW ||
digitalRead(6) == LOW )
break;
if ( a == 1 ) { return;
} } }
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]) {
lcd.clear();
lcd.print("NEEEE -GAME OVER");
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]) {
lcd.clear();
lcd.print("NEEEE -GAME OVER");
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]) {
lcd.clear();
lcd.print("NEEEE-GAME OVER");
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]) {
lcd.clear();
lcd.print("NEEEE-GAME OVER");
wrong_sequence();
return;
}
digitalWrite(10, LOW);
}
}
}
right_sequence();
}
void right_sequence() {
lcd.clear();
lcd.print(" AWESOME");
lcd.setCursor(0,1);
lcd.print(" YOU ROCK");
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;
}