// 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
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();
// Compteur piéton (actif si RED8 est éteint)
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 des feux
switch (etat) {
case 0: // PIÉTONS passent
digitalWrite(RED3, HIGH);
digitalWrite(GREEN4, HIGH);
digitalWrite(RED8, LOW);
digitalWrite(GREEN7, HIGH);
digitalWrite(GREEN2, LOW);
digitalWrite(RED5, LOW);
eteindreOranges();
if (now - dernierChangement >= 3000) {
etat = 1;
dernierChangement = now;
}
break;
case 1: // Transition vers voitures (pas d’orange ici)
digitalWrite(GREEN7, LOW);
digitalWrite(RED8, HIGH);
digitalWrite(GREEN4, LOW);
etat = 2;
dernierChangement = now;
break;
case 2: // VOITURES passent
digitalWrite(RED3, LOW);
digitalWrite(GREEN2, HIGH);
digitalWrite(RED5, HIGH);
eteindreOranges();
if (now - dernierChangement >= 3000) {
etat = 3;
dernierChangement = now;
}
break;
case 3: // ORANGE retour vers piétons
digitalWrite(GREEN2, LOW);
digitalWrite(RED5, LOW);
digitalWrite(ORANGE1, HIGH);
digitalWrite(ORANGE6, HIGH);
if (now - dernierChangement >= 1000) {
digitalWrite(ORANGE1, LOW);
digitalWrite(ORANGE6, LOW);
etat = 0;
dernierChangement = now;
}
break;
}
}
// 🔢 Affiche un chiffre sur le 7 segments (anode commune)
void afficherChiffre(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], chiffres[num][i] ? LOW : HIGH);
}
}
// ✖️ Éteint l’afficheur
void eteindreAfficheur() {
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], HIGH);
}
}
// 🟠 Éteint les feux oranges
void eteindreOranges() {
digitalWrite(ORANGE1, LOW);
digitalWrite(ORANGE6, LOW);
}