Arduino Forum

Using Arduino => Project Guidance => Topic started by: Lilrex on Mar 25, 2019, 03:12 am

Title: Simon Says project
Post by: Lilrex on Mar 25, 2019, 03:12 am
Hello All,

I am new to this forum, I am in a robotics class where we are learning to use microcontrollers. For my main project I have chosen to make my own Simon says door lock game.


I am having an issue right now where my userIn() function is NOT awaiting the user input and is rather just ignoring the if parameters and turning off and on the lights.

Can anyone assist me in shedding some light on where I am going wrong??



Code: [Select]


const int BLUE  = 3; //blue goes to pin 3
const int RED = 4; // red goes to pin 4
const int GREEN  = 5; // green goes to pin 5
const int YELLOW = 6; // yellow goes to pin 6

int time = 1000; //this sets the delay to 1 sec, used as variable incase global scope maniuplation is needed.

int blueButton = 22; // button corresponding to the blue input button on pin 7
int redButton = 24; // button for red light input on pin 8
int greenButton = 26; // button for green button input on pin 9
int yellowButton = 28; // yellow input button on pin 10

int BB = 0;
int RB = 0;
int GB = 0;
int YB = 0;

/* Since we are using an Arduino MEGA 2560 board there is about 3x the number of avaible features compared to the standard board. 9 and 10 on arduino regular are for the servo motor
this might still be the case on the MEGA. If so the button for either green or yuellow will be moved to a new digital pin.*/
int user[4]= {}; //  user array input
int seq[4]= {}; // generated array
int rng = 0; //random number genreator holding variable
int test = 0; // used to track the size of the array math and make sure size is correct



boolean valid = false; // this is used at the end when comparing the user inpiut array to the generated one and complete the end of the game
boolean flag = false; // used to pause Loop();

int buttonState = 1; // 1 is unoccupied 0 is used in RandomSeed so didnt want potential conflict

//(sizeof(seq) / sizeof(seq[4])) storeage


void setup() {

Serial.begin(9600);

  /* Set all the LEDs as output devices */
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(YELLOW, OUTPUT);

/* Set the digital buttons as input devices */
pinMode(blueButton , INPUT_PULLUP);
pinMode(redButton , INPUT_PULLUP);
pinMode(greenButton , INPUT_PULLUP);
pinMode(yellowButton , INPUT_PULLUP);

BB = digitalRead(blueButton);
RB = digitalRead(redButton);
GB = digitalRead(greenButton);
YB = digitalRead(yellowButton);

randomSeed(analogRead(0)); // this randomizes everytime the program is ran

delay(2000);
/* This block below tests all the LEDs on start up to make sure the wiring is correct. It holds the on position for 1 sec */
digitalWrite(BLUE, HIGH);
delay(time);
digitalWrite(BLUE, LOW);
Serial.println("BLUE is working");

digitalWrite(RED, HIGH);
delay(time);
digitalWrite(RED, LOW);
Serial.println("RED is working");



digitalWrite(GREEN, HIGH);
delay(time);
digitalWrite(GREEN, LOW);
Serial.println("GREEN is working");

digitalWrite(YELLOW, HIGH);
delay(time);
digitalWrite(YELLOW, LOW);
Serial.println("YELLOW is working");


delay(2000); // wait 2 seconds before going into the loop to make sure light are in the correct order.

}


/* ----------------------------------------  */
/* ----------------------------------------  */
/* ----------------------------------------  */



void loop()
{

rngLv1();

while(flag == false)
{


 
}


} // end of Loop()


/* ----------------------------------------  */
/* ----------------------------------------  */
/* ----------------------------------------  */



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

     rng = random(0,4);
     seq[i] = rng;
  }

checkSize(seq);
 
} //end of rng function


void checkSize(int seq[])
{

for(int i = 0; i < 4; i++)
{
Serial.println(seq[i]);
}
  playColors(seq);
} // end of checkSize



/* ----------------------------------------  */
/* ----------------------------------------  */
/* ----------------------------------------  */


void playColors(int seq[])
{
 
   for( int x = 0; x < 4; x++)
  {
    if(seq[x] == 0)
    {
      BlueLight();
     
    }

    else if(seq[x] == 1)
    {
      RedLight();
     
    }

    else if(seq[x] == 2)
    {
      GreenLight();
     
    }

     else if(seq[x] == 3)
    {
      YellowLight();
     
    }

    else{
      Serial.println("Something is busted, FeelsBadMan");
    }
  }

  userIn();
}



/* ----------------------------------------  */
/* ----------------------------------------  */
/* ----------------------------------------  */


void userIn() // this area is broken
{
  for (int i = 0;  i < 4;)

  while(buttonState !=4)
  {
  {
    if(BB == LOW)
    {
      digitalWrite(BLUE,  HIGH);
      Serial.println("Blue pressed");
      user[i] = 0;
     
      Serial.println("Blue pressed 2");
      delay(time);
     
      Serial.println("Blue pressed 3");
      digitalWrite(BLUE, LOW);
      delay(time);
       Serial.println("Blue pressed 4");
    }
    i++;

        if(RB == LOW)
    {
      digitalWrite(RED,  HIGH);
      Serial.println("RED pressed");
      user[i] = 1;
     
      Serial.println("RED pressed 2");
      delay(time);
     
      Serial.println("RED pressed 3");
      digitalWrite(RED, LOW);
      delay(time);
       Serial.println("RED pressed 4");
    }

    i++;
   
  }
buttonState++;
  }
} // end of user input function


/* ----------------------------------------  */
/* ----------------------------------------  */
/* ----------------------------------------  */



boolean compareUser(int seq[] , int user[])
{
  int i = 0;
for (int y = 0;  y < 4; y++)
{
  if(seq[y] == user[y])
  {
    Serial.println("Match good job");

    i++;
       
  }

if( i == 4 || i == 3)
{
  valid = true;
}

  if(seq[y] != user[y])
  {
    fail();
    valid = false; 
 }
}

}; // end of comparing function



/* ----------------------------------------  */

/* ----------------------------------------  */

/* ----------------------------------------  */


void fail()
{
  Serial.println("Sequence is not matching, better luck next time");
}


/* ----------------------------------------  */

/* ----------------------------------------  */

/* ----------------------------------------  */



void BlueLight()
{
 
  digitalWrite(BLUE, HIGH);
  delay(time);
  digitalWrite(BLUE, LOW);
  delay(time);
};

void RedLight()
{
  digitalWrite(RED, HIGH);
  delay(time);
  digitalWrite(RED, LOW);
  delay(time);
}

void GreenLight()
{
  digitalWrite(GREEN, HIGH);
  delay(time);
  digitalWrite(GREEN, LOW);
  delay(time);
}

void YellowLight()
{
  digitalWrite(YELLOW, HIGH);
  delay(time);
  digitalWrite(YELLOW, LOW);
  delay(time);
 
}

Title: Re: Simon Says project
Post by: wolframore on Mar 25, 2019, 02:54 pm
Is this a mistake?  It is outside of your function and seems like it's floating out there...

Code: [Select]
boolean compareUser(int seq[] , int user[])
{
  int i = 0;
for (int y = 0;  y < 4; y++)
{
  if(seq[y] == user[y])
  {
    Serial.println("Match good job");

    i++;
       
  }

if( i == 4 || i == 3)
{
  valid = true;
}

  if(seq[y] != user[y])
  {
    fail();
    valid = false; 
 }
}

}; // end of comparing function
Title: Re: Simon Says project
Post by: Lilrex on Mar 25, 2019, 03:16 pm
no its not a mistake. If it proves to be a problem I will fix that after.
Title: Re: Simon Says project
Post by: wolframore on Mar 25, 2019, 03:50 pm
Just take it out for now and see if your sketch continues... it doesn't look right to me... it clearly says end of function before this.
Title: Re: Simon Says project
Post by: Lilrex on Mar 25, 2019, 04:24 pm
the problem is not the comparing function, the problem is the UserIn() function. compare does not even get used yet.
Title: Re: Simon Says project
Post by: wolframore on Mar 25, 2019, 04:38 pm
what does the serial output give you?
Title: Re: Simon Says project
Post by: Lilrex on Mar 25, 2019, 04:40 pm
The serial outputs all the serial print lines for all the if statements. It is just ignoring the if condition and processing the data within. The lights turn off and on, and the number is added to the array. but at no point did i ever press a button.
Title: Re: Simon Says project
Post by: wolframore on Mar 25, 2019, 04:42 pm
would you mind posting it?  I know you know what you're seeing and talking about but I haven't a clue....  Can you post a schematics ... I'm interested in how the buttons are wired.
Title: Re: Simon Says project
Post by: Lilrex on Mar 25, 2019, 05:08 pm
I am at work atm, but as soon as i get home i can.
Title: Re: Simon Says project
Post by: Lilrex on Mar 26, 2019, 01:26 am
ok I downloaded Fritzing, this is my very first time ever using it, so please forgive me if its potato look. But all the wiring connections are how i have it set up.


Title: Re: Simon Says project
Post by: Lilrex on Mar 26, 2019, 02:32 am
Here is the serial output
Title: Re: Simon Says project
Post by: cattledog on Mar 26, 2019, 03:29 am
Quote
I am having an issue right now where my userIn() function is NOT awaiting the user input and is rather just ignoring the if parameters and turning off and on the lights.

Can anyone assist me in shedding some light on where I am going wrong??
Can you confirm the button wiring and the state of these variables
Code: [Select]
BB = digitalRead(blueButton);
  RB = digitalRead(redButton);
  GB = digitalRead(greenButton);
  YB = digitalRead(yellowButton);


With INPUT_PULLUP, the buttons should not be reading LOW. When I run your code with no buttons but INPUT_PULLUP on the pins I don't enter the conditional statements and my output is limited.

Quote
BLUE is working
RED is working
GREEN is working
YELLOW is working
2
0
3
2
Title: Re: Simon Says project
Post by: Lilrex on Mar 26, 2019, 03:34 am
Can you confirm the button wiring and the state of these variables
Code: [Select]
BB = digitalRead(blueButton);
  RB = digitalRead(redButton);
  GB = digitalRead(greenButton);
  YB = digitalRead(yellowButton);


With INPUT_PULLUP, the buttons should not be reading LOW. When I run your code with no buttons but INPUT_PULLUP on the pins I don't enter the conditional statements and my output is limited.

The buttons are wired correctly, they are wired the same as i have showed in the Fritz diagram.

and i am unsure what you mean by

Quote
"With INPUT_PULLUP, the buttons should not be reading LOW.
I am sorry, i am very very new to microcontrollers I swear i am not trying to sound ignorant.
Title: Re: Simon Says project
Post by: cattledog on Mar 26, 2019, 03:40 am
(http://forum.arduino.cc/index.php?action=dlattach;topic=605744.0;attach=301035)

Wire diagonally across the buttons, or rotate the buttons 90 degrees. Those 4 leg buttons have two legs which are connected and two legs which are switched. I believe you have picked up the connected legs,and your buttons read LOW when not pressed.
Title: Re: Simon Says project
Post by: Lilrex on Mar 26, 2019, 03:42 am
omg, i didnt know that.


Ty. let me try that
Title: Re: Simon Says project
Post by: Lilrex on Mar 26, 2019, 03:57 am
ok so my buttons are working... for some reason the leds are staying on and turning off when i press the button down but either way it is working.


but when i call the userIn() function the code just ignores my checks and turns on the lights, prints the serial line and then progresses down. 

Code: [Select]
   for (int i = 0;  i < 4;)

  while(buttonState !=4)
  {
  {
    if(buttonState != 4 && BB == LOW)



I am trying to "pause" the program and await the users button selection, and then add those button selections to an array so i can compare them afterwards.

I know arduino cannot be paused thats why it is in " "  but i need something similar.
Title: Re: Simon Says project
Post by: cattledog on Mar 26, 2019, 05:09 am
Quote
but when i call the userIn() function the code just ignores my checks and turns on the lights, prints the serial line and then progresses down. 
When you enter the function, add serial print outs of the variables used in the conditional tests.

Code: [Select]
if(buttonState != 4 && BB == LOW)

What is the value of BB? If the switch is wired correctly, and the input pin is set to INPUT_PULLUP mode, the value of BB can not be low if it is not pressed.

I think you have some extra brackets in userIn(), but I don't think that is what is causing your issue.

Quote
ok so my buttons are working... for some reason the leds are staying on and turning off when i press the button down but either way it is working.
Why are the led's wired so that one leg is common with a button pin leg? I would suggest moving the leds to a different place on the breadboard where they are independent of the buttons..
Title: Re: Simon Says project
Post by: wolframore on Mar 26, 2019, 09:16 pm
So much easier when we can see the wiring... he's right you need the get the LED's away from the same row as the buttons.