// SEGMENTS 7-Seg
#define segmentA 25
#define segmentB 26
#define segmentC 27
#define segmentD 14
#define segmentE 12
#define segmentF 33
#define segmentG 22
// FEUX voitures
#define GREEN2 32
#define ORANGE1 17
#define RED3 18
#define GREEN4 23
#define ORANGE6 21
#define RED5 19
// FEUX piétons
#define RED8 16
#define GREEN7 4 // ⬅️ GPIO changé ici (anciennement 3)
const int segments[] = {segmentA, segmentB, segmentC, segmentD, segmentE, segmentF, segmentG};
const bool chiffres[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
unsigned long dernierChangement = 0;
unsigned long dernierCompteur = 0;
int etat = 0;
int secondesRestantes = 0;
bool compteurActif = false;
void setup() {
// Initialisation des feux
pinMode(RED3, OUTPUT); pinMode(GREEN2, OUTPUT); pinMode(ORANGE1, OUTPUT);
pinMode(RED5, OUTPUT); pinMode(GREEN4, OUTPUT); pinMode(ORANGE6, OUTPUT);
pinMode(RED8, OUTPUT); pinMode(GREEN7, OUTPUT);
// Segments 7-segments
for (int i = 0; i < 7; i++) pinMode(segments[i], OUTPUT);
}
void loop() {
unsigned long now = millis();
// Gestion du compteur : actif si RED8 est LOW (piétons passent)
if (digitalRead(RED8) == LOW) {
if (!compteurActif) {
secondesRestantes = 10;
dernierCompteur = now;
compteurActif = true;
}
if (now - dernierCompteur >= 1000 && secondesRestantes >= 0) {
dernierCompteur = now;
afficherChiffre(secondesRestantes % 10);
secondesRestantes--;
}
} else {
compteurActif = false;
eteindreAfficheur();
}
// Cycle de feux
switch (etat) {
case 0: // PIÉTONS passent
digitalWrite(RED3, HIGH);
digitalWrite(GREEN4, HIGH);
digitalWrite(RED8, LOW);
digitalWrite(GREEN7, HIGH); // ✅ allumée ici
digitalWrite(GREEN2, LOW);
digitalWrite(RED5, LOW);
digitalWrite(ORANGE1, LOW);
digitalWrite(ORANGE6, LOW);
if (now - dernierChangement >= 10000) {
etat = 1;
dernierChangement = now;
}
break;
case 1: // ORANGE (transition)
digitalWrite(GREEN7, LOW); // 🔴 éteinte ici
digitalWrite(RED8, HIGH);
digitalWrite(ORANGE1, HIGH);
digitalWrite(ORANGE6, HIGH);
digitalWrite(GREEN4, LOW);
if (now - dernierChangement >= 3000) {
etat = 2;
dernierChangement = now;
}
break;
case 2: // VOITURES passent
digitalWrite(RED3, LOW);
digitalWrite(GREEN2, HIGH);
digitalWrite(RED5, HIGH);
digitalWrite(ORANGE1, LOW);
digitalWrite(ORANGE6, LOW);
if (now - dernierChangement >= 10000) {
etat = 3;
dernierChangement = now;
}
break;
case 3: // ORANGE retour
digitalWrite(GREEN2, LOW);
digitalWrite(RED5, LOW);
digitalWrite(ORANGE1, HIGH);
digitalWrite(ORANGE6, HIGH);
if (now - dernierChangement >= 3000) {
etat = 0;
dernierChangement = now;
}
break;
}
}
// === Fonctions d'affichage ===
void afficherChiffre(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], chiffres[num][i] ? LOW : HIGH); // Anode commune
}
}
void eteindreAfficheur() {
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], HIGH);
}
}