Skip to main content
1 of 5
Katie
  • 43
  • 1
  • 7

Comparing button presses to correct sequence

I am creating a memory game with the Arduino. It has four buttons, each for a different colored led. The leds will blink in a random sequence and either fail or add another light in the next sequence if the user presses the correct buttons. I have also attached an lcd screen to late implement a score tally.

Right now, the welcome lights display and the sound is working fine, but when the sequence starts, it will act as though I am pressing a button and proceed through the fail light method. I think the last method is causing this issue where I am comparing the button pressed to the sequence.

I would appreciate any help!

/*********************************NOTES**********************************************/
#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978
/*********************************************************************/

#include <LiquidCrystal.h>
/*(RS, E, D4, D5, D6, D7)*/
LiquidCrystal lcd(1,2,19,18,17,16); 

// Give name to all LEDs from pin 10 to 13
int led0 = 6;
int led1 = 7;
int led2 = 8;
int led3 = 9;


//Give name to all buttons from pin 0 to 3
int button0 = 10;
int button1 = 11;
int button2 = 12;
int button3 = 13;

//Give name to the speaker (pin 8)
int speaker = 5;


// the setup routine runs once when you press reset:

void setup() {   
  Serial.begin(9600);             
  analogWrite(0,80); //Setting contrast
  lcd.begin(16,2); //Dimensions of LCD screen
  lcd.print("Welcome!");

  // initialize the digital pin as an output.

  pinMode(led0, OUTPUT);   
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);  
  pinMode(led3, OUTPUT); 

  //initialize buttons as input.

  pinMode(button0, INPUT_PULLUP);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);

}//End setup



// the loop routine runs over and over again forever:

void loop() {
  
  WelcomeLight();
  int SIZE = 25;
  int sequence[SIZE];

  while(1){
    //First we make the random sequence (values from 0 to 3)

    randomSeed(analogRead(A0));    

    for(int j=0; j < SIZE; j++){

      sequence[j] = random(0, 4);
    }


    //Now, the game starts
    int led = 0;
    int seq = 0;
    int reading = 1;

    while (seq == 0){
      showsequence(sequence, reading);
      seq = readsequence(sequence, reading, led);
      if (seq == 0) //well done
      {
        reading ++;

      }

    }//End while

  }//End while

}//End loop



//Plays before game

void WelcomeLight(){
 
  int i = 0;
  for (i=0; i <4; i++){

    tone(speaker, NOTE_A3);
    digitalWrite(led0, HIGH);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);

    delay(200);             

    tone(speaker, NOTE_B3);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);

    delay(200);

    tone(speaker, NOTE_C3);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);

    delay(200);    

    tone(speaker, NOTE_D3);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);

    delay(200);

  }//End for loop

  for (i=0; i <3; i++){

    tone(speaker, NOTE_F3);

    digitalWrite(led0, HIGH);  
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);

    delay(100);

    noTone(speaker);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);

    delay(100);

    noTone(speaker);

  }//End for

  delay(200);

}//End welcome lights



//When the player loses

void FailLight(){

    tone(speaker, NOTE_G3);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);

    delay(200);    

    tone(speaker, NOTE_F3);

    
    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);

    delay(200);    

    tone(speaker, NOTE_E3);

    digitalWrite(led0, LOW);  
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);

    delay(200);    

    tone(speaker, NOTE_D3);

    digitalWrite(led0, HIGH);  
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    
    delay(200);

  for (int i=0; i <3; i++){

    tone(speaker, NOTE_A2);

    digitalWrite(led0, HIGH);  
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);

    delay(100);

    noTone(speaker);

   
    digitalWrite(led0, LOW);  
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);


    delay(100);

  }//End for

  delay(200);

}//End fail method




//Returns the state of the button

int ReadButton(){

  button0 = digitalRead(10);
  Serial.print("button0: ");
  Serial.println(button0);
  
  button1 = digitalRead(11);
  Serial.print("button1: ");
  Serial.println(button1);
  
  button2 = digitalRead(12);
  Serial.print("button2: ");
  Serial.println(button2);
  
  button3 = digitalRead(13);
  Serial.print("button3: ");
  Serial.println(button3);

  if(button0 == LOW){

    digitalWrite(led0, HIGH);
    tone(speaker, NOTE_E4);

    delay(200);

    noTone(speaker); 
    digitalWrite(led0, LOW);

    return 0;

  }//End if


  if(button1 == LOW){

    digitalWrite(led1, HIGH);
    tone(speaker, NOTE_A4);

    delay(200);

    noTone(speaker); 
    digitalWrite(led1, LOW);

    return 1;

  }//End if


  if(button2 == LOW){

    digitalWrite(led2, HIGH);
    tone(speaker, NOTE_D4);

    delay(200);

    noTone(speaker); 
    digitalWrite(led2, LOW);

    return 2;

  }//End if


  if(button3 == LOW){

    digitalWrite(led3, HIGH );
    tone(speaker, NOTE_G4);

    delay(200);

    noTone(speaker); 
    digitalWrite(led3, LOW);

    return 3;

  }//End if

  else{

    return -1;
  }

}//End read button method


//Method that shows the current sequence (until 'count') with lights and sounds

void showsequence (int array[],int counts){

  int i = 0;

  while(i < counts){

    int led = array[i];
    int delayvalue = 500 - (3 * counts);
    
    switch (led){

    case 0:
      digitalWrite(led0, HIGH); 
      tone(speaker, NOTE_E4);
      delay(delayvalue);
      noTone(speaker); 
      digitalWrite(led0, LOW); 
      delay(delayvalue/2);
      i++;
      break;

    case 1:
      digitalWrite(led1, HIGH); 
      tone(speaker, NOTE_A4);
      delay(delayvalue);
      noTone(speaker); 
      digitalWrite(led1, LOW); 
      delay(delayvalue/2);
      i++;
      break;

    case 2:
      digitalWrite(led2, HIGH); 
      tone(speaker, NOTE_D4);
      delay(delayvalue);
      noTone(speaker); 
      digitalWrite(led2, LOW); 
      delay(delayvalue/2);
      i++;
      break;

    case 3:
      digitalWrite(led3, HIGH); 
      tone(speaker, NOTE_G4);
      delay(delayvalue);
      noTone(speaker); 
      digitalWrite(led3, LOW); 
      delay(delayvalue/2);
      i++;
      break;

    }//End of switch case

  }//End while

}//End show sequence





//Compares sequence with buttons pushed

int readsequence(int seq[], int current, int led){

  int i = 0;

  while(i < current){

  int button = ReadButton();
  Serial.print("button = ");
  Serial.println(button);
  Serial.print("seq = ");
  Serial.println(seq[i]);
  
    if(button != seq[i] && button != -1) //(game ends)
    {
    
      FailLight();
      return -1;

    }//End if

    if(button == seq[i])  // (game continues)
    {

      i++;
    }//End if


  }//End while

  delay(250);

  return 0;

}//End read sequence
Katie
  • 43
  • 1
  • 7