Stuck on loop problem.

Hey guys I was working on this little project for my EE class. I cant seem to stop it from looping through all my "if" statements. I only want it to go through the statement when a specific button is pressed. What am I doing wrong?
here is my code:

int ledL1 = 10;
int ledL2 = 11;
int ledL3 = 12;
int ledR1 = 5;
int ledR2 = 6;
int ledR3 = 7;

int butBrake = 2;
int butflasher = 10;
int butLSignal = 11;
int butRSignal = 12;

int buttonStateB=0;
int buttonStateF=0;
int buttonStateL=0;
int buttonStateR=0;

void setup() {

  pinMode(ledL1, OUTPUT);
  pinMode(ledL2, OUTPUT);
  pinMode(ledL3, OUTPUT);
  pinMode(ledR1, OUTPUT);
  pinMode(ledR2, OUTPUT);
  pinMode(ledR3, OUTPUT);

  pinMode(butBrake, INPUT);
  pinMode(butflasher, INPUT);
  pinMode(butLSignal, INPUT);
  pinMode(butRSignal, INPUT);

}

void loop() {
  buttonStateB = digitalRead(butBrake);
  buttonStateF = digitalRead(butflasher);
  buttonStateL = digitalRead(butLSignal);
  buttonStateR = digitalRead(butRSignal);

  if(buttonStateB == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  }

  if(buttonStateL == HIGH){
    digitalWrite(ledL1, HIGH);
    delay(500);
    digitalWrite(ledL1, LOW);
    delay(500);
    digitalWrite(ledL2, HIGH);
    delay(500);
    digitalWrite(ledL2, LOW);
    delay(500);
    digitalWrite(ledL3, HIGH);
    delay(500);
    digitalWrite(ledL3, LOW);
}
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  } 

  if(buttonStateR == HIGH){
    digitalWrite(ledR1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  }

  if(buttonStateF == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    delay(500);
     
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  }

  if(buttonStateB == HIGH && buttonStateL == HIGH || buttonStateR == HIGH)
  {
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  }

  if(buttonStateB == HIGH && buttonStateR == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
  }
  
  if(buttonStateR == HIGH && buttonStateL == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledL1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledL1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledL2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledL2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    digitalWrite(ledL3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
    digitalWrite(ledL3, LOW);
  }
 
}

Hello

int ledL1 = 10;
int ledL2 = 11;
int ledL3 = 12;
 ...
int butflasher = 10;
int butLSignal = 11;
int butRSignal = 12;

Did you mean to have some of your buttons and LEDs assigned to the same pins?

I cant seem to stop it from looping through all my "if" statements. I only want it to go through the statement when a specific button is pressed.

Please clarify. Do you mean all the if statements execute even though no buttons are pressed? Or you only want to display the sequence of LEDs once when you press a button, but it keeps happening for as long as you have the button pressed?

All the best

Ray

You're handling your buttons wrong. You are simply looking for the state you want then acting. What you want to do is watch for state changes then act on that state.

Keep a variable with the old reading. Compare with a current reading. If they are not equal then you have detected a state change. This is where you might start debouncing (I call this a pending state change) if it passes debouncing you can now use the state to do what you want. For example turn on a led if LOW or do nothing if HIGH.

Check out some of the button examples, especially state change detection and debouncing. Read every post written by Paul S.

Hackscribble:
Hello

int ledL1 = 10;

int ledL2 = 11;
int ledL3 = 12;
...
int butflasher = 10;
int butLSignal = 11;
int butRSignal = 12;




Did you mean to have some of your buttons and LEDs assigned to the same pins?



> I cant seem to stop it from looping through all my "if" statements. I only want it to go through the statement when a specific button is pressed.



Please clarify. Do you mean all the if statements execute even though no buttons are pressed? Or you only want to display the sequence of LEDs once when you press a button, but it keeps happening for as long as you have the button pressed?

All the best

Ray

Hey sorry for the late reply but yes all the if statements execute even though no buttons are pressed. sorry I forgot to modify the pins in my code:
int ledL1 = 3;
int ledL2 = 4;
int ledL3 = 5;;
int ledR1 = 6;
int ledR2 = 7;
int ledR3 = 8;

int butBrake = 9;
int butflasher = 10;
int butLSignal = 11;
int butRSignal = 12;

I only want it to turn on the leds when the specific button is pressed like if butBrake is pressed it should do the brake sequence.

You are not using the internal pullup resistors, so you need to be using external ones. Are you? How ARE your switches wired?

  if(buttonStateB == HIGH && buttonStateL == HIGH || buttonStateR == HIGH)

The compiler assumes you know the precedence order of all the operators involved. Do you? Or, are you making assumptions that might not agree with the compiler? Add parentheses to force the compiler to parse this statement the way you assume it will be parsed.

I am using external resistors with my push buttons. I just tried adding the buttonstate line to all my else statements and the looping kind of did stop.
I should put prantheses around this? buttonStateL == HIGH || buttonStateR == HIGH)

PaulS:
You are not using the internal pullup resistors, so you need to be using external ones. Are you? How ARE your switches wired?

  if(buttonStateB == HIGH && buttonStateL == HIGH || buttonStateR == HIGH)

The compiler assumes you know the precedence order of all the operators involved. Do you? Or, are you making assumptions that might not agree with the compiler? Add parentheses to force the compiler to parse this statement the way you assume it will be parsed.

I think your right about the order. these are the if statements that are causing the problems:

  if(buttonStateB == HIGH && (buttonStateL == HIGH || buttonStateR == HIGH))
  {
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateB = digitalRead(butBrake);
    buttonStateR = digitalRead(butRSignal);
    buttonStateL = digitalRead(butLSignal);
    buttonStateF = digitalRead(butflasher);
  }

  if(buttonStateB == HIGH && buttonStateR == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateB = digitalRead(butBrake);
    buttonStateR = digitalRead(butRSignal);
  }
  
  if(buttonStateR == HIGH && buttonStateL == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledL1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledL1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledL2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledL2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    digitalWrite(ledL3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
    digitalWrite(ledL3, LOW);
    buttonStateR = digitalRead(butRSignal);
    buttonStateL = digitalRead(butLSignal);
  }

I think your right about the order. these are the if statements that are causing the problems:

Well, I think you have far too much code for not even knowing if the switches are being read correctly. Dump everything after the code where you read the switches. Print out the values read from then. Only when you KNOW that the switches are being read correctly should you be adding code to use the state read from the switch.

"Yes, I have external resistors" does NOT describe how the switches are wired, nor prove that they are wired correctly.

PaulS:

I think your right about the order. these are the if statements that are causing the problems:

Well, I think you have far too much code for not even knowing if the switches are being read correctly. Dump everything after the code where you read the switches. Print out the values read from then. Only when you KNOW that the switches are being read correctly should you be adding code to use the state read from the switch.

"Yes, I have external resistors" does NOT describe how the switches are wired, nor prove that they are wired correctly.

My buttons are being read correctly because my code works from this part:

void loop() {
  
  buttonStateB = digitalRead(butBrake);
  buttonStateR = digitalRead(butRSignal);
  buttonStateL = digitalRead(butLSignal);
  buttonStateF = digitalRead(butflasher);
  
  if(buttonStateB == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateB = digitalRead(butBrake);
  }


  if(buttonStateL == HIGH){
    digitalWrite(ledL1, HIGH);
    delay(500);
    digitalWrite(ledL1, LOW);
    delay(500);
    digitalWrite(ledL2, HIGH);
    delay(500);
    digitalWrite(ledL2, LOW);
    delay(500);
    digitalWrite(ledL3, HIGH);
    delay(500);
    digitalWrite(ledL3, LOW);
}
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateL = digitalRead(butLSignal);
  } 
  
  
  if(buttonStateR == HIGH){
    digitalWrite(ledR1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateR = digitalRead(butRSignal);
  }
  
  
  if(buttonStateF == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    delay(500);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateF = digitalRead(butflasher);
  }

the commented out part is what is causing the problem:

/*

  if(buttonStateB == HIGH && (buttonStateL == HIGH || buttonStateR == HIGH))
  {
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateB = digitalRead(butBrake);
    buttonStateR = digitalRead(butRSignal);
    buttonStateL = digitalRead(butLSignal);
    buttonStateF = digitalRead(butflasher);
  }

  if(buttonStateB == HIGH && buttonStateR == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
  }
  else{
    digitalWrite(ledL1, LOW);
    digitalWrite(ledL2, LOW);
    digitalWrite(ledL3, LOW);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledR3, LOW);
    buttonStateB = digitalRead(butBrake);
    buttonStateR = digitalRead(butRSignal);
  }
  
  if(buttonStateR == HIGH && buttonStateL == HIGH){
    digitalWrite(ledL1, HIGH);
    digitalWrite(ledL2, HIGH);
    digitalWrite(ledL3, HIGH);
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledR3, HIGH);
  }
  else{
    digitalWrite(ledR1, HIGH);
    digitalWrite(ledL1, HIGH);
    delay(500);
    digitalWrite(ledR1, LOW);
    digitalWrite(ledL1, LOW);
    delay(500);
    digitalWrite(ledR2, HIGH);
    digitalWrite(ledL2, HIGH);
    delay(500);
    digitalWrite(ledR2, LOW);
    digitalWrite(ledL2, LOW);
    delay(500);
    digitalWrite(ledR3, HIGH);
    digitalWrite(ledL3, HIGH);
    delay(500);
    digitalWrite(ledR3, LOW);
    digitalWrite(ledL3, LOW);
    buttonStateR = digitalRead(butRSignal);
    buttonStateL = digitalRead(butLSignal);
  }
  */

My buttons are being read correctly

If you don't want to answer simple questions, fine. Good luck.

PaulS:

My buttons are being read correctly

If you don't want to answer simple questions, fine. Good luck.

I am sorry if i sound annoyed been working on this since yesterday.... my switches are wired correctly because everything is working according to my code. I dont think its a wiring problem, it more of a programming problem.

I am no pro at coding so I am not sure how I would print out the values from the push buttons.

void loop();
if(Serial.available() > 0){
Serial.println(butBrake);
}

I am no pro at coding

Or answering questions. The Arduino has internal pullup resistors. Connect one leg of the switch to ground. Connect the other leg to a digital pin. Turn the internal pullup resistor on (by using INPUT_PULLUP in the pin mode statement, or by using digitalWrite() to assign HIGH to the INPUT pin). The switches are then GUARANTEED to be wired (and read) correctly. The only caveat is that LOW means pressed, then. But, generally that matches the switch so it's easy to remember.

If you are going to print the state of the switch, there is no reason to determine how much serial data is waiting to be read before printing, and there is no reason to not print unless there is data to be read.