/* Claude EMERY - 14/06/2026 - Feu Tricolore + Passage pieton - SANS UTILISATION DE DELAY() */
const int ledRougeVoiture = 2;
const int ledOrangeVoiture = 3;
const int ledVerteVoiture = 4;
const int ledRougePieton = 5;
const int ledVertePieton = 6;
const int boutonPieton = 7;
// Durées en millisecondes // 5000
const unsigned long TEMPS_VERT = 1000;
const unsigned long TEMPS_ORANGE = 500;
const unsigned long TEMPS_ROUGE =1000;
const unsigned long TEMPS_PIETON = 50000;
/* Explication "enum" sur https://www.locoduino.org/spip.php?article102
EXEMPLE : Enum
Associe des noms à une valeur mémorisée dans une variable. enum est un nom réservé suivi entre
accolade d’une suite de symboles qui se voient attribuer les valeurs 0, 1, 2.. qui sont rangées dans la
variable dont le type est unique, donc pas spécifié.
Ceci est donc une aide à la documentation.
enum notes { DO, RE, MI } ;
Le compilateur mémorise que notes a 3 valeurs (0,1,2) et s'il voit dans le programme le nom MI, il
établit la correspondance avec la valeur 2 et le nom notes */
/* Definition de la liste EtatFeu avec 3 valeurs: VOITURE_VERT=0, VOITURE_ORANGE=1, VOITURE_ROUGE=2 */
enum EtatFeu { VOITURE_VERT, VOITURE_ORANGE, VOITURE_ROUGE };
/* Definition de la variable etat qui ne peut prendre que les valeurs definies dans enum
Type : EtatFeu, Nom : etat, Valeur de départ : VOITURE_VERT */
EtatFeu etat = VOITURE_VERT;
unsigned long tempsDepart = 0; // Variables millis
bool demandePieton = false; // Demande piéton
void setup() {
Serial.begin(9600);
pinMode(ledRougeVoiture, OUTPUT);
pinMode(ledOrangeVoiture, OUTPUT);
pinMode(ledVerteVoiture, OUTPUT);
pinMode(ledRougePieton, OUTPUT);
pinMode(ledVertePieton, OUTPUT);
pinMode(boutonPieton, INPUT_PULLUP);
tempsDepart = millis();
afficherEtat();
}
void loop() {
unsigned long maintenant = millis();
if (digitalRead(boutonPieton) == LOW) { // Lecture bouton
demandePieton = true;
}
switch(etat) {
case VOITURE_VERT: //0
if (maintenant - tempsDepart >= TEMPS_VERT) {
etat = VOITURE_ORANGE;
tempsDepart = maintenant;
afficherEtat();
}
break; //Permet de sortir de la fonction case
case VOITURE_ORANGE: //1
if (maintenant - tempsDepart >= TEMPS_ORANGE) {
if (demandePieton) {
etat = VOITURE_ROUGE;
demandePieton = false;
}
else {
etat = VOITURE_ROUGE;
}
tempsDepart = maintenant;
afficherEtat();
}
break;
case VOITURE_ROUGE: //2
if (maintenant - tempsDepart >= TEMPS_ROUGE) {
etat = VOITURE_VERT;
tempsDepart = maintenant;
afficherEtat();
}
break;
}
// Gestion passage piéton pendant rouge voiture
if (etat == VOITURE_ROUGE) {
if (maintenant - tempsDepart < TEMPS_PIETON) {
digitalWrite(ledRougePieton, 0);
digitalWrite(ledVertePieton, 1);
}
else {
digitalWrite(ledRougePieton, 1);
digitalWrite(ledVertePieton, 0);
}
}
}
// Fonction affichage feux
void afficherEtat() {
switch(etat) {
case VOITURE_VERT: //0
digitalWrite(ledRougeVoiture, 0);
digitalWrite(ledOrangeVoiture, 0);
digitalWrite(ledVerteVoiture, 1);
digitalWrite(ledRougePieton, 1);
digitalWrite(ledVertePieton, 0);
break;
case VOITURE_ORANGE: //1
digitalWrite(ledRougeVoiture, 0);
digitalWrite(ledOrangeVoiture, 1);
digitalWrite(ledVerteVoiture, 0);
digitalWrite(ledRougePieton, 1);
digitalWrite(ledVertePieton, 0);
break;
case VOITURE_ROUGE: //2
digitalWrite(ledRougeVoiture, 1);
digitalWrite(ledOrangeVoiture, 0);
digitalWrite(ledVerteVoiture, 0);
break;
}
}