The circuit: * LCD RS pin to A0 * LCD Enable pin A1 * LCD D4 pin to A2 * LCD D5 pin to A3 * LCD D6 pin to A4 * LCD D7 pin to A5 * LCD R/W pin to ground * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3)
*/
// include the library code: #include <LiquidCrystal.h> #include <Tone.h>
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); // ( RS, E, D4, D5, D6, D7)
Tone speakerpin; int starttune[] = { NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4}; int duration2[] = { 100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500}; int note[] = { NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5}; int duration[] = { 100, 100, 100, 300, 100, 300}; int button[] = {2, 3, 4, 5}; //The four button input pins int ledpin[] = {8, 9, 10, 11}; // LED pins int turn = 0; // turn counter int buttonstate = 0; // button state checker int randomArray[100]; //Intentionally long to store up to 100 inputs int inputArray[100]; int highscore = 0; int MyScore; void setup() { lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 1); lcd.print("Your Score: 0"); lcd.setCursor(0, 0); lcd.print("High Score: 0"); Serial.begin(9600); speakerpin.begin(12); // speaker is on pin 12 for(int x=0; x<4; x++) // LED pins are outputs { pinMode(ledpin[x], OUTPUT); } for(int x=0; x<4; x++) { pinMode(button[x], INPUT); // button pins are inputs digitalWrite(button[x], HIGH); // enable internal pullup; buttons start in high position; logic reversed } randomSeed(analogRead(A7)); //Added to generate "more randomness" with the randomArray for the output function for (int thisNote = 0; thisNote < 13; thisNote ++) { // play the next note: speakerpin.play(starttune[thisNote]); // hold the note: if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6) { digitalWrite(ledpin[0], HIGH); } if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11) { digitalWrite(ledpin[1], HIGH); } if (thisNote==8 || thisNote==12) { digitalWrite(ledpin[2], HIGH); } if (thisNote==10) { digitalWrite(ledpin[3], HIGH); } delay(duration2[thisNote]); // stop for the next note: speakerpin.stop(); digitalWrite(ledpin[0], LOW); digitalWrite(ledpin[1], LOW); digitalWrite(ledpin[2], LOW); digitalWrite(ledpin[3], LOW); delay(25); } delay(1000); } void loop() { for (int y=0; y<=99; y++) { digitalWrite(ledpin[0], LOW); digitalWrite(ledpin[1], LOW); digitalWrite(ledpin[2], LOW); digitalWrite(ledpin[3], LOW);
for (int y=turn; y <= turn; y++) { //Limited by the turn variable Serial.println(""); //Some serial output to follow along Serial.print("Turn"); lcd.clear();
randomArray[y] = random(1, 5); //Assigning a random number (1-4) for (int x=0; x <= turn; x++) { Serial.print(randomArray[x]); for(int y=0; y<4; y++) { if (randomArray[x] == 1 && ledpin[y] == 8) { //if statements to display the stored values in the array digitalWrite(ledpin[y], HIGH); speakerpin.play(NOTE_G3, 100); delay(400); digitalWrite(ledpin[y], LOW); delay(100); } if (randomArray[x] == 2 && ledpin[y] == 9) { digitalWrite(ledpin[y], HIGH); speakerpin.play(NOTE_A3, 100); delay(400); digitalWrite(ledpin[y], LOW); delay(100); } if (randomArray[x] == 3 && ledpin[y] == 10) { digitalWrite(ledpin[y], HIGH); speakerpin.play(NOTE_B3, 100); delay(400); digitalWrite(ledpin[y], LOW); delay(100); } if (randomArray[x] == 4 && ledpin[y] == 11) { digitalWrite(ledpin[y], HIGH); speakerpin.play(NOTE_C4, 100); delay(400); digitalWrite(ledpin[y], LOW); delay(100); } } } } input(); } } void input() { //Function for allowing user input and checking input against the generated array for (int x=0; x <= turn;) { //Statement controlled by turn count for(int y=0; y<4; y++) { buttonstate = digitalRead(button[y]); if (buttonstate == 0 && button[y] == 2) { //Checking for button push digitalWrite(ledpin[0], HIGH); speakerpin.play(NOTE_G3, 100); delay(200); digitalWrite(ledpin[0], LOW); inputArray[x] = 1; delay(250); Serial.print(" "); Serial.print(1); if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against fail(); //the value in the same spot on the generated array } //The fail function is called if it does not match
x++; } if (buttonstate == 0 && button[y] == 3) { digitalWrite(ledpin[1], HIGH); speakerpin.play(NOTE_A3, 100); delay(200); digitalWrite(ledpin[1], LOW); inputArray[x] = 2; delay(250); Serial.print(" "); Serial.print(2); if (inputArray[x] != randomArray[x]) { fail(); } x++; } if (buttonstate == 0 && button[y] == 4) { digitalWrite(ledpin[2], HIGH); speakerpin.play(NOTE_B3, 100); delay(200); digitalWrite(ledpin[2], LOW); inputArray[x] = 3; delay(250); Serial.print(" "); Serial.print(3); if (inputArray[x] != randomArray[x]) { fail(); } x++; } if (buttonstate == 0 && button[y] == 5) { digitalWrite(ledpin[3], HIGH); speakerpin.play(NOTE_C4, 100); delay(200); digitalWrite(ledpin[3], LOW); inputArray[x] = 4; delay(250); Serial.print(" "); Serial.print(4); if (inputArray[x] != randomArray[x]) { fail(); } x++; } } } delay(500); turn++; //Increments the turn count, also the last action before starting the output function over again } void fail() { //Function used if the player fails to match the sequence for (int y=0; y<=2; y++) { //Flashes lights for failure
for (i = 0; i < 3; i++) { // loop through each pin... digitalWrite(ledpin[i], HIGH); // turning it on, delay(100); // pausing, digitalWrite(ledpin[i], LOW); // and turning it off. } for (i = 3; i >= 0; i--) { digitalWrite(ledpin[i], HIGH); delay(100); digitalWrite(ledpin[i], LOW); } }
delay(1000);
turn = -1; //Resets turn value so the game starts over without need for a reset button } }