enum EtatFeu {
VERT1,
ORANGE1,
VERT2,
ORANGE2
};
volatile EtatFeu etatActuel = VERT1;
volatile unsigned long tempsChangement = 0;
void setFeuRoute(int vertPin, int orangePin, int rougePin, bool vert, bool orange, bool rouge) {
digitalWrite(vertPin, vert ? HIGH : LOW);
digitalWrite(orangePin, orange ? HIGH : LOW);
digitalWrite(rougePin, rouge ? HIGH : LOW);
}
bool timerInterruptFlag = false;
unsigned long lastInterruptTime = 0;
void timerInterruptHandler() {
if (millis() - lastInterruptTime >= 100) {
timerInterruptFlag = true;
lastInterruptTime = millis();
}
}
void setup() {
pinMode(PA5, OUTPUT);
pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
pinMode(PA8, OUTPUT);
pinMode(PA15, OUTPUT);
pinMode(PA12, OUTPUT);
Serial.begin(115200);
Serial.println("Simulation de Feux Rouges");
etatActuel = VERT1;
tempsChangement = millis();
setFeuRoute(PA5, PA6, PA7, true, false, false);
setFeuRoute(PA8, PA15, PA12, false, false, true);
Serial.println("Route 1: VERT | Route 2: ROUGE");
}
void loop() {
timerInterruptHandler();
if (timerInterruptFlag) {
timerInterruptFlag = false;
long tempsEcoule = millis() - tempsChangement;
switch (etatActuel) {
case VERT1:
if (tempsEcoule >= 5000) {
etatActuel = ORANGE1;
tempsChangement = millis();
setFeuRoute(PA5, PA6, PA7, false, true, false);
setFeuRoute(PA8, PA15, PA12, false, false, true);
Serial.println("Route 1: ORANGE | Route 2: ROUGE");
}
break;
case ORANGE1:
if (tempsEcoule >= 2000) {
etatActuel = VERT2;
tempsChangement = millis();
setFeuRoute(PA5, PA6, PA7, false, false, true);
setFeuRoute(PA8, PA15, PA12, true, false, false);
Serial.println("Route 1: ROUGE | Route 2: VERT");
}
break;
case VERT2:
if (tempsEcoule >= 5000) {
etatActuel = ORANGE2;
tempsChangement = millis();
setFeuRoute(PA5, PA6, PA7, false, false, true);
setFeuRoute(PA8, PA15, PA12, false, true, false);
Serial.println("Route 1: ROUGE | Route 2: ORANGE");
}
break;
case ORANGE2:
if (tempsEcoule >= 2000) {
etatActuel = VERT1;
tempsChangement = millis();
setFeuRoute(PA5, PA6, PA7, true, false, false);
setFeuRoute(PA8, PA15, PA12, false, false, true);
Serial.println("Route 1: VERT | Route 2: ROUGE");
}
break;
}
}
}