const int RED_CAR_LED = 13;
const int ORANGE_CAR_LED = 12;
const int GREEN_CAR_LED = 11;
const int RED_PEDESTRIAN_LED = 7;
const int GREEN_PEDESTRIAN_LED = 6;
const int BUTTON = 2;
const int INTERRUPT = digitalPinToInterrupt(BUTTON);
bool firstTimeButtonPress = true;
volatile bool buttonPressed = false;
volatile bool canReadButton = true;
const int DEBOUNCE_uS = 5000;
const unsigned long MINIMUM_GO_TIME_mS = 60000;
unsigned long timeSinceTrafficCanGomS = 0;
void setup() {
Serial.begin(115200);
pinMode(RED_CAR_LED, OUTPUT);
pinMode(ORANGE_CAR_LED, OUTPUT);
pinMode(GREEN_CAR_LED, OUTPUT);
pinMode(RED_PEDESTRIAN_LED, OUTPUT);
pinMode(GREEN_PEDESTRIAN_LED, OUTPUT);
pinMode(BUTTON, INPUT);
attachInterrupt(INTERRUPT, buttonPressedISR, CHANGE);
digitalWrite(GREEN_CAR_LED, HIGH);
digitalWrite(RED_PEDESTRIAN_LED, HIGH);
}
void buttonPressedISR() {
if (canReadButton) {
delayMicroseconds(DEBOUNCE_uS);
if (digitalRead(BUTTON) == HIGH) {
canReadButton = false;
buttonPressed = true;
}
}
}
void loop() {
if (buttonPressed == true && (((millis() - timeSinceTrafficCanGomS) > MINIMUM_GO_TIME_mS) || firstTimeButtonPress)) {
firstTimeButtonPress = false;
buttonPressed = false;
carsShownOrangeLight();
carsStopPedestriansCross();
orangeFlashingForCarsPedestriansWarned();
carsGoPedestriansWait();
}
}
void carsShownOrangeLight() {
digitalWrite(GREEN_CAR_LED, LOW);
digitalWrite(ORANGE_CAR_LED, HIGH);
const int TIME_ORANGE_LIGHT_SHOWS_mS = 3000;
delay(TIME_ORANGE_LIGHT_SHOWS_mS);
}
void carsStopPedestriansCross() {
digitalWrite(ORANGE_CAR_LED, LOW);
digitalWrite(RED_CAR_LED, HIGH);
digitalWrite(RED_PEDESTRIAN_LED, LOW);
digitalWrite(GREEN_PEDESTRIAN_LED, HIGH);
const int TIME_PEDESTRIANS_CROSS_mS = 10000;
delay(TIME_PEDESTRIANS_CROSS_mS);
canReadButton = true;
}
void orangeFlashingForCarsPedestriansWarned() {
digitalWrite(RED_CAR_LED, LOW);
const int TIME_LIGHT_ON_PER_FLASH_mS = 500;
const int TIME_LIGHT_OFF_PER_FLASH_mS = 500;
const int TOTAL_TIME_FLASHING_mS = 5000;
int numberOfFlashes = TOTAL_TIME_FLASHING_mS/(TIME_LIGHT_ON_PER_FLASH_mS + TIME_LIGHT_OFF_PER_FLASH_mS);
for (int i=0; i<numberOfFlashes; i++) {
digitalWrite(ORANGE_CAR_LED, HIGH);
digitalWrite(GREEN_PEDESTRIAN_LED, HIGH);
delay(TIME_LIGHT_ON_PER_FLASH_mS);
digitalWrite(ORANGE_CAR_LED, LOW);
digitalWrite(GREEN_PEDESTRIAN_LED, LOW);
delay(TIME_LIGHT_OFF_PER_FLASH_mS);
}
}
void carsGoPedestriansWait() {
digitalWrite(GREEN_CAR_LED, HIGH);
digitalWrite(RED_PEDESTRIAN_LED, HIGH);
timeSinceTrafficCanGomS = millis();
}