int red1 = 2;
int yellow1 = 3;
int green1 = 4;
int red2 = 5;
int yellow2 = 6;
int green2 = 7;
int red3 = 8;
int yellow3 = 9;
int green3 = 10;
int red4 = 11;
int yellow4 = 12;
int green4 = 13;
int emergencySwitch1Pin = 18; // INT0
int emergencySwitch2Pin = 19; // INT1
int emergencySwitch3Pin = 20; // INT5
int emergencySwitch4Pin = 21; // INT4
volatile bool emergencyFlag = false;
volatile int emergencyDirection = 0;
void setup() {
for (int i = 2; i <= 13; i++) {
pinMode(i, OUTPUT);
}
pinMode(emergencySwitch1Pin, INPUT);
pinMode(emergencySwitch2Pin, INPUT);
pinMode(emergencySwitch3Pin, INPUT);
pinMode(emergencySwitch4Pin, INPUT);
attachInterrupt(digitalPinToInterrupt(emergencySwitch1Pin), emergencyISR1, FALLING);
attachInterrupt(digitalPinToInterrupt(emergencySwitch2Pin), emergencyISR2, FALLING);
attachInterrupt(digitalPinToInterrupt(emergencySwitch3Pin), emergencyISR3, FALLING);
attachInterrupt(digitalPinToInterrupt(emergencySwitch4Pin), emergencyISR4, FALLING);
}
void loop() {
if (emergencyFlag) {
handleEmergency(emergencyDirection);
emergencyFlag = false;
} else {
normalOperation();
}
}
void emergencyISR1() {
emergencyFlag = true;
emergencyDirection = 1;
}
void emergencyISR2() {
emergencyFlag = true;
emergencyDirection = 2;
}
void emergencyISR3() {
emergencyFlag = true;
emergencyDirection = 3;
}
void emergencyISR4() {
emergencyFlag = true;
emergencyDirection = 4;
}
void handleEmergency(int direction) {
allLightsOff();
switch (direction) {
case 1:
digitalWrite(green1, HIGH);
digitalWrite(red2, HIGH);
digitalWrite(red3, HIGH);
digitalWrite(red4, HIGH);
break;
case 2:
digitalWrite(green2, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red3, HIGH);
digitalWrite(red4, HIGH);
break;
case 3:
digitalWrite(green3, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red2, HIGH);
digitalWrite(red4, HIGH);
break;
case 4:
digitalWrite(green4, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red2, HIGH);
digitalWrite(red3, HIGH);
break;
}
}
void normalOperation() {
direction(red1, yellow1, green1, red2, yellow2, green2, red3, yellow3, green3, red4, yellow4, green4);
direction(red2, yellow2, green2, red1, yellow1, green1, red3, yellow3, green3, red4, yellow4, green4);
direction(red3, yellow3, green3, red1, yellow1, green1, red2, yellow2, green2, red4, yellow4, green4);
direction(red4, yellow4, green4, red1, yellow1, green1, red2, yellow2, green2, red3, yellow3, green3);
}
void allLightsOff() {
for (int i = 2; i <= 13; i++) {
digitalWrite(i, LOW);
}
}
void direction(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l) {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(h, LOW);
digitalWrite(i, LOW);
digitalWrite(j, HIGH);
digitalWrite(k, LOW);
digitalWrite(l, LOW);
delay(5000);
digitalWrite(c, LOW);
digitalWrite(b, HIGH);
delay(3000);
}