// ------------------------
// Feux voitures
// ------------------------
const int pin_rouge = 12;
const int pin_orange = 8;
const int pin_vert = 9;
// ------------------------
// Feux piétons
// ------------------------
const int pietonRouge = 10;
const int pietonVert = 13;
// ------------------------
// Capteur
// ------------------------
const int capteur = 2;
// Variables pour gérer la phase piéton
volatile bool phasePietonActive = false;
unsigned long tempsDebutPieton = 0;
const unsigned long dureePieton = 5000; // 5 secondes pour les piétons
bool retourCycleNormal = false;
// Fonction Interrupt
void detectPedestrian() {
if (!phasePietonActive) {
phasePietonActive = true;
tempsDebutPieton = millis();
// Passage au rouge pour les voitures
digitalWrite(pin_vert, LOW);
digitalWrite(pin_orange, LOW);
digitalWrite(pin_rouge, HIGH);
// Vert pour les piétons
digitalWrite(pietonRouge, LOW);
digitalWrite(pietonVert, HIGH);
}
}
void setup() {
pinMode(pin_rouge, OUTPUT);
pinMode(pin_orange, OUTPUT);
pinMode(pin_vert, OUTPUT);
pinMode(pietonRouge, OUTPUT);
pinMode(pietonVert, OUTPUT);
pinMode(capteur, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(capteur), detectPedestrian, FALLING);
// État initial
digitalWrite(pietonRouge, HIGH);
digitalWrite(pietonVert, LOW);
}
void loop() {
// Vérifier si on est en phase piéton
if (phasePietonActive) {
// Attendre que la durée piéton soit écoulée
if (millis() - tempsDebutPieton >= dureePieton) {
// Fin de la phase piéton
phasePietonActive = false;
// Remettre les piétons au rouge
digitalWrite(pietonRouge, HIGH);
digitalWrite(pietonVert, LOW);
// Phase orange de transition (comme dans le cycle normal)
digitalWrite(pin_rouge, LOW);
digitalWrite(pin_orange, HIGH);
digitalWrite(pin_vert, LOW);
delay(2000); // Orange pendant 2 secondes
// Passer au vert pour les voitures
digitalWrite(pin_rouge, LOW);
digitalWrite(pin_orange, LOW);
digitalWrite(pin_vert, HIGH);
// Attendre que le cycle vert se termine normalement
delay(7000); // 7 secondes de vert
// Retour au début du cycle (rouge)
// Le loop va continuer normalement
}
return; // Sortir du loop pendant la phase piéton
}
// ------------------------
// Cycle normal - Voitures ROUGE
// ------------------------
digitalWrite(pin_rouge, HIGH);
digitalWrite(pin_orange, LOW);
digitalWrite(pin_vert, LOW);
digitalWrite(pietonRouge, LOW);
digitalWrite(pietonVert, HIGH);
delay(7000);
// ------------------------
// Cycle normal - Voitures ORANGE
// ------------------------
digitalWrite(pin_rouge, LOW);
digitalWrite(pin_orange, HIGH);
digitalWrite(pin_vert, LOW);
digitalWrite(pietonRouge, HIGH);
digitalWrite(pietonVert, LOW);
delay(5000);
// ------------------------
// Cycle normal - Voitures VERT
// ------------------------
digitalWrite(pin_rouge, LOW);
digitalWrite(pin_orange, LOW);
digitalWrite(pin_vert, HIGH);
digitalWrite(pietonRouge, HIGH);
digitalWrite(pietonVert, LOW);
// Attendre le bouton ou le temps max (7 secondes)
for (int i = 0; i < 70; i++) {
if (digitalRead(capteur) == LOW) {
// Si le bouton est pressé, déclencher la phase piéton
if (!phasePietonActive) {
phasePietonActive = true;
tempsDebutPieton = millis();
digitalWrite(pin_vert, LOW);
digitalWrite(pin_orange, LOW);
digitalWrite(pin_rouge, HIGH);
digitalWrite(pietonRouge, LOW);
digitalWrite(pietonVert, HIGH);
}
break;
}
delay(100);
}
}