const int BUTTON_PIN =2;
const int RED_LIGHT_PIN =11;
const int YELLOW_LIGHT_PIN =10;
const int GREEN_LIGHT_PIN =9;
const int GREEN_PED_LIGHT_PIN =8;
const int RED_PED_LIGHT_PIN =7;
int TIME_FLASHING=0;
const int CAR_SLOW_DOWN_DELAY=3000;
const int PED_CROSSING_DELAY=10000;
const int FLASHING_LIGHT_DELAY=500;
const unsigned long NEXT_BUTTON_PRESS_DELAY=(60000);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(RED_LIGHT_PIN, OUTPUT);
pinMode(YELLOW_LIGHT_PIN, OUTPUT);
pinMode(GREEN_LIGHT_PIN, OUTPUT);
pinMode(GREEN_PED_LIGHT_PIN, OUTPUT);
pinMode(RED_PED_LIGHT_PIN, OUTPUT);
}
int lastState = HIGH;
void loop() {
// put your main code here, to run repeatedly:
int value = digitalRead((BUTTON_PIN));
if (lastState != value) {
lastState = value;
if (value == LOW) {
SLOWDOWN_LIGHT_STATE();
PED_CROSSING_STATE();
while (TIME_FLASHING<5) {
FLASHING_LIGHTS_HURRY_STAGE();
}
if (TIME_FLASHING>4){
DELAY_60_SECONDS();
}
}
}
else {
DEFAULT_LIGHT_STATE();
}
}
void DEFAULT_LIGHT_STATE() {
digitalWrite(GREEN_LIGHT_PIN, HIGH);
digitalWrite(RED_PED_LIGHT_PIN, HIGH);
}
void SLOWDOWN_LIGHT_STATE(){
digitalWrite(GREEN_LIGHT_PIN, LOW);
digitalWrite(YELLOW_LIGHT_PIN, HIGH);
delay(CAR_SLOW_DOWN_DELAY);
}
void PED_CROSSING_STATE(){
digitalWrite(YELLOW_LIGHT_PIN, LOW);
digitalWrite(RED_LIGHT_PIN, HIGH);
digitalWrite(GREEN_PED_LIGHT_PIN, HIGH);
digitalWrite(RED_PED_LIGHT_PIN, LOW);
delay(PED_CROSSING_DELAY);
digitalWrite(RED_LIGHT_PIN, LOW);
digitalWrite(GREEN_PED_LIGHT_PIN, LOW);
}
void FLASHING_LIGHTS_HURRY_STAGE(){
digitalWrite(YELLOW_LIGHT_PIN, LOW);
digitalWrite(GREEN_PED_LIGHT_PIN, LOW);
delay(FLASHING_LIGHT_DELAY);
digitalWrite(YELLOW_LIGHT_PIN, HIGH);
digitalWrite(GREEN_PED_LIGHT_PIN, HIGH);
delay(FLASHING_LIGHT_DELAY);
digitalWrite(YELLOW_LIGHT_PIN, LOW);
digitalWrite(GREEN_PED_LIGHT_PIN, LOW);
TIME_FLASHING= TIME_FLASHING+1;
}
void DELAY_60_SECONDS(){
TIME_FLASHING=0;
digitalWrite(GREEN_LIGHT_PIN, HIGH);
digitalWrite(RED_PED_LIGHT_PIN, HIGH);
delay(NEXT_BUTTON_PRESS_DELAY);
}