Skip to main content
2 of 5
Improved formatting
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!

/*********************************************************************/

#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