Hi,
I have written a sketch for a traffic light pedestrian crossing which is working great. I want to add a feature that when the red man lights up I want to be able to press the button again from there. At the moment you cant press the button again until the traffic light goes to green. I have added a comment into the code where I want the button to become active again. Do I have to use millis or put another if, else statement in?
Please see code below.
//ASSIGNES LEDS TO PIN NUMBERS
#define buttonPin 2
#define greenMan 6
#define redMan 7
#define buzzPin 8
#define waitPin 9
#define redLight 11
#define amberLight 12
#define greenLight 13
//DELAY TIMES
int waitTime = 10000;
int getReadyToStop = 5000;
int roadClearPeriod = 2000;
int beepTime = 300;
int greenManFlash = 500;
int pedestrianClearPeriod = 6000;
int getReadyToGo = 3000;
//BEEPING TONE
int beepTone = 3000;
int beepDuration = 200;
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
bool crossState;
void setup() {
pinMode(redLight, OUTPUT); //RED LED OF THE TRAFFIC LIGHTS
pinMode(amberLight, OUTPUT); //AMBER LED OF THE TRAFFIC LIGHTS
pinMode(greenLight, OUTPUT); //GREEN LED OF THE TRAFFIC LIGHTS
pinMode(buttonPin, INPUT_PULLUP); //PEDESTRIAN CROSS CALL BUTTON
pinMode(greenMan, OUTPUT); //GREEN MAN LED OF THE PEDESTRIAN CROSSING
pinMode(redMan, OUTPUT); //RED MAN LED OF THE PEDESTRIAN CROSSING
pinMode(buzzPin, OUTPUT); //CROSSING AUDIO BEEPING
pinMode(waitPin, OUTPUT); //WAIT LED OF THE PEDESTRIAN CROSSING
digitalWrite(greenLight, HIGH); //TURN ON THE GREEN LED OF THE TRAFFIC LIGHTS
digitalWrite(redMan, HIGH); //TURN ON THE RED MAN LED OF THE PEDESTRIAN CROSSING
buttonState = digitalRead(buttonPin);
lastButtonState = buttonState;
}
void loop() {
// Read the pushbutton input pin:
buttonState = digitalRead(buttonPin);
// Compare the buttonState to its previous state
if (buttonState != lastButtonState) //Changed
{
if (buttonState == LOW) //New press, so change valve flag
{
crossState = !crossState;
}
lastButtonState = buttonState; // Save the current state as the last state, for next time through the loop
}
if (crossState)
{
digitalWrite (waitPin, HIGH); //TURN ON THE WAIT LED OF THE PEDESTRIAN CROSSING
delay(waitTime); //DELAY AFTER PEDESTRIAN CROSS BUTTON PRESSED
digitalWrite(greenLight, LOW); //TURN OFF THE GREEN LED OF THE TRAFFIC LIGHTS
digitalWrite(amberLight, HIGH); //TURN ON AMBER LED OF THE TRAFFIC LIGHTS
delay(getReadyToStop); //DELAY TIME FOR THE AMBER LED
digitalWrite(amberLight, LOW); //TURN OFF AMBER LED OF THE TRAFFIC LIGHTS
digitalWrite(redLight, HIGH); //TURN ON RED LED OF THE TRAFFIC LIGHTS
delay(roadClearPeriod); //WAIT TO TURN ON THE GREEN MAN LED OF THE PEDESTRIAN CROSSING
digitalWrite(redMan, LOW); //TURN OFF THE RED MAN LED OF THE PEDESTRIAN CROSSING
digitalWrite(greenMan, HIGH); //TURN ON THE GREEN MAN LED OF THE PEDESTRIAN CROSSING
digitalWrite(waitPin, LOW);
//AUDIO TONE FOR CROSSING
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
tone(buzzPin, beepTone, beepDuration);
delay(beepTime);
//GREEN MAN FLASHING WARNING
digitalWrite(greenMan, LOW);
delay (greenManFlash);
digitalWrite(greenMan, HIGH);
delay (greenManFlash);
digitalWrite(greenMan, LOW);
delay (greenManFlash);
digitalWrite(greenMan, HIGH);
delay (greenManFlash);
digitalWrite(greenMan, LOW);
delay (greenManFlash);
digitalWrite(greenMan, HIGH);
delay (greenManFlash);
digitalWrite(greenMan, LOW);
delay (greenManFlash);
digitalWrite(redMan, HIGH); //TURN ON THE RED MAN LED OF THE PEDESTRIAN CROSSING
/*!!!!!!!!!!THIS IS THE POINT I WANT THE BUTTON TO BE ACTIVE AGAIN TO BE ABLE RUN ANOTHER BIT OF CODE
IF THE BUTTON IS PRESSED!!!!!!!!!!.*/
delay(pedestrianClearPeriod);
//ALLOW TRAFFIC TO MOVE
digitalWrite(redLight, HIGH); //TURN ON THE RED LED OF TRAFFIC LIGHT
digitalWrite(amberLight, HIGH); //TURN ON THE AMBER LED OF THE TRAFFIC LIGHT
delay(getReadyToGo);
digitalWrite(greenLight, HIGH); //TURN ON THE GREEN LED OF THE TRAFFIC LIGHT
digitalWrite(redLight, LOW); //TURN OFF THE RED LED OF THE TRAFFIC LIGHT
digitalWrite(amberLight, LOW); //TURN OFF THE AMBER LED OF THE TRAFFIC LIGHT
{
while (digitalRead(buttonPin) == HIGH);
}
}
}
Many Thanks,
Mike.