const int RED_TRAFFIC_LIGHT_PIN = 13;
const int AMBER_TRAFFIC_LIGHT_PIN = 12;
const int GREEN_TRAFFIC_LIGHT_PIN = 11;
const int RED_PEDESTRIAN_LIGHT_PIN = 10;
const int GREEN_PEDESTRIAN_LIGHT_PIN = 9;
const int PEDESTRIAN_BUTTON_PIN = 2;
const int MULTIPLE_BUTTON_PRESS_DELAY_mS = 15;
const int DELAY_BEFORE_TRAFFIC_CAN_BE_STOPPED_AGAIN_mS = 60000;
const int DELAY_FOR_TRAFFIC_TO_STOP_mS = 3000;
const int DELAY_FOR_PEDESTRIANS_TO_CROSS_mS = 10000;
const int DELAY_FOR_PEDESTRIANS_TO_COMPLETE_CROSSING_mS = 5000;
const int SWITCH_PIN = 2;
const int SW_INT = digitalPinToInterrupt(SWITCH_PIN);
const unsigned long DEBOUNCE_uS = 5000;
volatile bool queueGreenPedestrian = true;
volatile bool lightsFlashing = true;
volatile bool switchState = false;
void setup() {
pinMode(RED_TRAFFIC_LIGHT_PIN,OUTPUT);
pinMode(AMBER_TRAFFIC_LIGHT_PIN,OUTPUT);
pinMode(GREEN_TRAFFIC_LIGHT_PIN,OUTPUT);
pinMode(RED_PEDESTRIAN_LIGHT_PIN,OUTPUT);
pinMode(GREEN_PEDESTRIAN_LIGHT_PIN,OUTPUT);
pinMode(PEDESTRIAN_BUTTON_PIN, INPUT);
digitalWrite(GREEN_TRAFFIC_LIGHT_PIN, HIGH);
digitalWrite(RED_PEDESTRIAN_LIGHT_PIN, HIGH);
attachInterrupt(SW_INT , switch_ISR, CHANGE);
}
void loop() {
if(digitalRead(PEDESTRIAN_BUTTON_PIN) == HIGH) {
delay(15);
if(digitalRead(PEDESTRIAN_BUTTON_PIN) == HIGH) {
if (queueGreenPedestrian == true) {
changeLights();
DelayForPedestriansToCross();
for (int i=0; i<5; i++) BlinkingLights();
LightsCycleBackToGreen ();
delay(60000);
}
}
}
}
void changeLights() {
digitalWrite(GREEN_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, HIGH);
delay(3000);
}
void DelayForPedestriansToCross() {
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(RED_TRAFFIC_LIGHT_PIN, HIGH);
digitalWrite(RED_PEDESTRIAN_LIGHT_PIN, LOW);
digitalWrite(GREEN_PEDESTRIAN_LIGHT_PIN, HIGH);
delay(10000);
}
void BlinkingLights () {
digitalWrite(RED_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, HIGH);
digitalWrite(GREEN_PEDESTRIAN_LIGHT_PIN, HIGH);
delay(500);
digitalWrite(RED_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(GREEN_PEDESTRIAN_LIGHT_PIN, LOW);
delay(500);
digitalWrite(RED_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, HIGH);
digitalWrite(GREEN_PEDESTRIAN_LIGHT_PIN, HIGH);
}
void LightsCycleBackToGreen () {
digitalWrite(AMBER_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(RED_TRAFFIC_LIGHT_PIN, LOW);
digitalWrite(GREEN_TRAFFIC_LIGHT_PIN, HIGH);
digitalWrite(RED_PEDESTRIAN_LIGHT_PIN, HIGH);
digitalWrite(GREEN_PEDESTRIAN_LIGHT_PIN, LOW);
}
void switch_ISR() {
delayMicroseconds(DEBOUNCE_uS);
if (digitalRead(SWITCH_PIN) == LOW) {
switchState = true;
}
if (queueGreenPedestrian) {
delayMicroseconds(DEBOUNCE_uS);
if (!digitalRead(SWITCH_PIN)) switchState = true;
}
}