Button part 2

in this post i'll tell exactly what i want to create using arduino.. hope someone can help me with it, cause at the moment i'm totally lost :frowning:

I want to make a traffic light set, which contains 2 sets of light
something like this:

(R) (R)
(Y) (Y)
(G) (G)

where R is red, Y is yellow and G is green..

we got our codes for the standard loop, with delays and digitalWrites..
what we need help with is adding a button that change the code running to another code making both red lights on, while all the others are off..

we've tried this with "if and else" but then our traffic light freezed when ever we pressed our button.

but we want the button to read every single nano second, so that when ever it's pressed, it'll change to our other code...

please help us :slight_smile:

The traffic light freezed... showing which color ?

Btw. How can it freeze, or are there infinite loops ?

yes, i believe we got infinite loops.. but since we're newbies at this we dont really get what you're talking about :wink:

please do write in noob speak

Hi Halibobu

It will help if you could post a little more about what you want your sketch to do.

Perhaps list all the switches and say what affect each switch should have. Don't worry for now about the code, just describe the complete functionality you are looking to have.

We wish to have a traffic light that goes like this

digitalWrite(ledPinredV,HIGH);
  digitalWrite(ledPinredH, HIGH);
  delay(10000);
  digitalWrite(ledPinredH, LOW);
  digitalWrite(ledPinyellowH, HIGH);
  delay(2500);
  digitalWrite(ledPinyellowH, LOW);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, HIGH);
  delay(10000);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, LOW);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPinyellowH, HIGH);
  delay(2500);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPinyellowH, LOW);
  digitalWrite(ledPinredH, HIGH);
  delay(1000);
  digitalWrite(ledPinredV, LOW);
  digitalWrite(ledPinyellowV, HIGH);
  digitalWrite(ledPinredH, HIGH);
  delay(2500);
  digitalWrite(ledPinyellowV, LOW);
  digitalWrite(ledPingreenV, HIGH);
  digitalWrite(ledPinredH, HIGH);
  delay(10000);
  digitalWrite(ledPingreenV, LOW);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPingreenV, HIGH);
  delay(10000);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPingreenV, LOW);
  digitalWriterd(ledPinredH, HIGH);
  digitalWrite(ledPinyellowV, HIGH);
  delay(2500);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPinyellowV, LOW);
  digitalWrite(ledPinredV, HIGH);
  delay(1000);
  digitalWrite(ledPinredH, LOW);
  digitalWrite(ledPinyellowH, HIGH);
  digitalWrite(ledPinredV, HIGH);
  delay(2500);
  digitalWrite(ledPinyellowH, LOW);
  digitalWrite(ledPingreenH, HIGH);
  digitalWrite(ledPinredV, HIGH);
  delay(10000);
  digitalWrite(ledPingreenH, LOW);
  digitalWrite(ledPinredV, HIGH); 
  
  } else {
    
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, HIGH);
  delay(10000);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, LOW);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPinyellowH, HIGH);
  delay(2500);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPinyellowH, LOW);
  digitalWrite(ledPinredH, HIGH);
  delay(1000);
  digitalWrite(ledPinredV, LOW);
  digitalWrite(ledPinyellowV, HIGH);
  digitalWrite(ledPinredH, HIGH);
  delay(2500);
  digitalWrite(ledPinyellowV, LOW);
  digitalWrite(ledPingreenV, HIGH);
  digitalWrite(ledPinredH, HIGH);
 delay(10000);
  digitalWrite(ledPingreenV, L0W);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPingreenV, HIGH);
  delay(10000);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPingreenV, LOW);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPinyellowV, HIGH);
  delay(2500);
  digitalWrite(ledPinredH, HIGH);
  digitalWrite(ledPinyellowV, LOW);
  digitalWrite(ledPinredV, HIGH);
  delay(1000);
  digitalWrite(ledPinredH, LOW);
  digitalWrite(ledPinyellowH, HIGH);
  digitalWrite(ledPinredV, HIGH);
  delay(2500);
  digitalWrite(ledPinyellowH, LOW);
  digitalWrite(ledPingreenH, HIGH);
  digitalWrite(ledPinredV, HIGH);
  delay(10000);
  digitalWrite(ledPingreenH, LOW);
  digitalWrite(ledPinredV, HIGH);

this is what we are looking for, and we want it to go to the "else" if our button gets pressed, at any time in our code...

please help :cry:
we made this code in a Loop...

Here is a fragment illustrating one way to implement your functionality. It needs some work to get going and is untested but I hope give you some ideas to do what you want.

boolean  myDelay(int delayMS ){
// return true if a button is pushed (i.e. pin value goes HIGH)
// otherwise return false after delayMS milliseconds 
  while(delayMS--){
     if(digitalRead(buttonPin))
         return true;
     delay(1);    
  }
  return false;  
}

void loop(){
   if(digitalRead(buttonPin))  
      altLights() 
   else   
      lights();
}

void lights(){
// light the normal light sequence
  digitalWrite(ledPinredH, HIGH);
  if(myDelay(10000))
      return; // abort if button is pushed
  digitalWrite(ledPinredH, LOW);
  digitalWrite(ledPinyellowH, HIGH);
  if(myDelay(2500))
     return;
//  ... the rest of the digitalWrite calls go here ...
}


void altLights(){
// light the alternate light sequence
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, HIGH);
  delay(10000);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPingreenH, LOW);
  digitalWrite(ledPinredV, HIGH);
  digitalWrite(ledPinyellowH, HIGH);
  delay(2500);
//   ... the rest of the digitalWrite calls go here  
}