PFE — Feu Rouge Intelligent
Contenu : Liste de matériel (BOM) + Schéma de connexion + Code Arduino complet +
Instructions maquette + Plan de présentation + Tests et recommandations.
1. Résumé du projet
Un feu tricolore intelligent pour une maquette de carrefour 2 voies. Fonctionnalités implémentées : -
Cycle standard Vert/Jaune/Rouge - Détection de véhicules (HC-SR04) pour allonger/prolonger le vert -
Bouton piéton avec phase piéton dédiée - Compteur affiché sur écran LCD I2C (temps restant) - Capteur
de luminosité (LDR) pour mode nuit - Contrôle Bluetooth (HC-05) pour modes manuels/urgence - Mode
"ambulance" (bouton d'urgence)
2. Liste de matériel (BOM)
Électronique principale - 1 × Arduino UNO R3 - 3 × LED haute luminosité (Rouge, Jaune, Verte) × 2
(pour 2 directions) — ou 2 modules feux tricolores - 6 × Résistances 220 Ω (pour LEDs) - 1 × Breadboard
grande - 1 × Câbles Dupont (lots) - 1 × Module d'alimentation 5V (ou câble USB)
Détection & Entrées - 2 × HC-SR04 (capteurs ultrason) — un par voie - 2 × Boutons poussoirs (piéton +
urgence) - 1 × LDR + 10 kΩ (diviseur) pour capteur de luminosité - 1 × Buzzer actif
Affichage & Communication - 1 × Écran LCD 16x2 I2C (adresse 0x27 ou 0x3F) - 1 × Module Bluetooth
HC-05
Optionnel / Maquette - Carton plume / foam board - Mini-voitures - Tubes PVC ou pièces imprimées
pour feux - Peinture et marquages - Boîte plastique pour l’électronique
Divers - Résistances supplémentaires (10k, etc.) - Ruban adhésif, colle chaude, vis
3. Plan des connexions (schéma verbal)
Remarque : Pour la présentation, dessine ce schéma sur papier ou Fritzing. Voici le
mapping de pins recommandé :
Arduino pins (exemple) - Feu direction A (route principale) : - LED Vert A -> D2 (via 220Ω) - LED Jaune A -
> D3 - LED Rouge A -> D4
• Feu direction B (route perpendiculaire) :
• LED Vert B -> D5
• LED Jaune B -> D6
• LED Rouge B -> D7
1
• Bouton piéton -> D8 (INPUT_PULLUP)
• Bouton urgence (ambulance) -> D9 (INPUT_PULLUP)
• Buzzer -> D10 (digital ou PWM)
• HC-SR04 voie A : TRIG_A -> D11, ECHO_A -> D12
• HC-SR04 voie B : TRIG_B -> D13, ECHO_B -> A0 (analog pin used as digital input)
• LDR -> A1 (via diviseur 10k)
• LCD I2C -> SDA (A4), SCL (A5)
• HC-05 RX/TX -> Arduino TX/RX through logiciel Serial ou SoftwareSerial (RX HC05 -> D2? but D2
used). Utiliser SoftwareSerial pins D2(DRX)/D3(DTX) si disponibles.
Important : Si tu utilises beaucoup de composants, passe d'abord par des tests séparés
pour chaque module.
4. Code Arduino (complet)
// Feu Rouge Intelligent - Arduino UNO
// Matériel attendu : LEDs, HC-SR04 x2, LCD I2C, Boutons, LDR, HC-05
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
LiquidCrystal_I2C lcd(0x27,16,2); // change address si besoin
SoftwareSerial bt(4, 5); // RX, TX (adapter si nécessaire)
// Pins LEDs
const int V_A = 2; // Vert A
const int J_A = 3; // Jaune A
const int R_A = 4; // Rouge A
const int V_B = 5; // Vert B
const int J_B = 6; // Jaune B
const int R_B = 7; // Rouge B
// Boutons
const int BTN_PEDESTRIAN = 8;
const int BTN_EMERGENCY = 9;
// Buzzer
const int BUZZER = 10;
// HC-SR04 A
const int TRIG_A = 11;
2
const int ECHO_A = 12;
// HC-SR04 B
const int TRIG_B = 13;
const int ECHO_B = A0; // utilise pin analog comme digital
// LDR
const int LDR_PIN = A1;
// Timings par défaut (modifiable)
int tVert = 8; // secondes
int tJaune = 3;
int tRouge = 10;
// Etat
bool pedestrianRequest = false;
bool emergencyMode = false;
void setup(){
// LEDs
pinMode(V_A, OUTPUT); pinMode(J_A, OUTPUT); pinMode(R_A, OUTPUT);
pinMode(V_B, OUTPUT); pinMode(J_B, OUTPUT); pinMode(R_B, OUTPUT);
// Buttons
pinMode(BTN_PEDESTRIAN, INPUT_PULLUP);
pinMode(BTN_EMERGENCY, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
// HC-SR04 pins
pinMode(TRIG_A, OUTPUT); pinMode(ECHO_A, INPUT);
pinMode(TRIG_B, OUTPUT); pinMode(ECHO_B, INPUT);
// LCD
[Link](); [Link]();
[Link]();
[Link](0,0); [Link]("Feu Intelligent");
[Link](0,1); [Link]("Demarrage...");
delay(1000);
// Bluetooth
[Link](9600);
// initial states
allRed();
}
void loop(){
// Lire boutons
if(digitalRead(BTN_PEDESTRIAN)==LOW) { // appuyé
pedestrianRequest = true;
3
}
if(digitalRead(BTN_EMERGENCY)==LOW) {
emergencyMode = true;
}
// Lire luminosite et adapter mode nuit
int ldr = analogRead(LDR_PIN);
bool nightMode = (ldr < 300); // ajuster seuil
// Lire distance capteurs
long distA = readUltrasonic(TRIG_A, ECHO_A);
long distB = readUltrasonic(TRIG_B, ECHO_B);
// Gérer les modes prioritaires
if(emergencyMode){
handleEmergency();
emergencyMode = false; // reset après gestion
return;
}
// Prioriser voie avec véhicules
if(distA < 100 && distB >= 100){
// beaucoup de véhicules sur A
runCycle(true, nightMode, distA);
} else if(distB < 100 && distA >= 100){
runCycle(false, nightMode, distB);
} else {
// cycle alterné
runCycle(true, nightMode, distA);
runCycle(false, nightMode, distB);
}
// Gérer commandes Bluetooth
if([Link]()){
char c = [Link]();
if(c=='E') emergencyMode = true;
if(c=='P') pedestrianRequest = true;
if(c=='M') { // mode manuel: ici tu peux implémenter commandes
// TODO
}
}
}
// Fonction pour exécuter le cycle pour une voie principale (isA true => voie
A verte)
void runCycle(bool isA, bool nightMode, long dist){
int greenTime = tVert;
// si beaucoup de vehicules, augmenter vert
if(dist < 50) greenTime += 4; // ajustable
if(pedestrianRequest){
4
// si piéton demandé, réduire vert et passer à piéton avant
greenTime = min(greenTime, 6);
}
if(isA){
setLights(HIGH, LOW, LOW, LOW, LOW, HIGH); // A=vert, B=rouge
countdown(greenTime);
setLights(LOW, HIGH, LOW, LOW, LOW, HIGH); // A=jaune
countdown(tJaune);
setLights(LOW, LOW, HIGH, LOW, LOW, HIGH); // A=rouge
countdown(tRouge);
} else {
setLights(LOW, LOW, HIGH, HIGH, LOW, LOW); // B vert
countdown(greenTime);
setLights(LOW, LOW, HIGH, LOW, HIGH, LOW); // B jaune
countdown(tJaune);
setLights(LOW, LOW, HIGH, LOW, LOW, HIGH); // both red briefly
countdown(tRouge);
}
// gérer la demande piéton après la fin du cycle
if(pedestrianRequest){
runPedestrianPhase();
pedestrianRequest = false;
}
}
void runPedestrianPhase(){
// Mettre tout au rouge, allumer buzzer et message
allRed();
[Link](); [Link](0,0); [Link]("Phase pieton");
[Link](0,1); [Link]("Attendez...");
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
delay(200);
// durée pieton
int tp = 8;
for(int i=tp;i>=0;i--){
[Link](10,1); [Link](i);
delay(1000);
}
}
void handleEmergency(){
// exemple simple : mettre voie A verte 10s
[Link](); [Link](0,0); [Link]("Mode Urgence");
5
allRed();
digitalWrite(V_A, HIGH);
for(int i=10;i>=0;i--){
[Link](10,1); [Link](i);
delay(1000);
}
allRed();
}
// Eteint toutes les leds sauf celles passées
void setLights(int VA, int JA, int RA, int VB, int JB, int RB){
digitalWrite(V_A, VA); digitalWrite(J_A, JA); digitalWrite(R_A, RA);
digitalWrite(V_B, VB); digitalWrite(J_B, JB); digitalWrite(R_B, RB);
}
void allRed(){
digitalWrite(V_A, LOW); digitalWrite(J_A, LOW); digitalWrite(R_A, HIGH);
digitalWrite(V_B, LOW); digitalWrite(J_B, LOW); digitalWrite(R_B, HIGH);
}
void countdown(int sec){
for(int i=sec;i>0;i--){
[Link]();
[Link](0,0); [Link]("Feu: ");
[Link](0,1); [Link]("Temps:"); [Link](i);
delay(1000);
}
}
long readUltrasonic(int trigPin, int echoPin){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000); // timeout
long distance = duration / 58; // cm
if(distance==0) distance = 300; // si aucune echo
return distance;
}
Notes sur le code : - Adapte les pins Bluetooth SoftwareSerial selon ton montage. -
Ajuste les seuils de distance et temps à la maquette (distances en cm).
5. Schéma électrique / conseils d'assemblage
1. Connecte chaque LED à la pin assignée via une résistance 220Ω vers la masse.
2. Les boutons en INPUT_PULLUP : relient un côté au GND et l'autre au pin.
3. HC-SR04 trig sur pin OUTPUT, echo sur INPUT. Ne pas oublier le timeout de pulseIn.
6
4. LDR en diviseur : LDR -> +5V, noeud -> A1, autre côté du noeud -> 10k -> GND.
5. LCD I2C : SDA -> A4, SCL -> A5 (sur UNO). Assure-toi de l'adresse I2C.
6. HC-05 : utiliser SoftwareSerial sur pins non utilisées et respecter niveaux (HC-05 fonctionne en 5V
TTL).
6. Construction de la maquette (étapes)
1. Découper le plateau de foam-board pour représenter 2 routes perpendiculaires.
2. Peindre la route en noir, dessiner marquages et passage piétons.
3. Fixer les tubes pour feux et insérer LEDs (ou utiliser petits modules).
4. Organiser l’électronique dans une boîte sous la maquette, câbler proprement.
5. Coller petites voitures et éléments de décor.
7. Tests et validation
• Tester chaque composant séparément (LED, capteur, écran, bouton).
• Tester la logique : lancer le script, vérifier que la priorité suit la détection.
• Ajuster les temps et seuils de distance.
• Faire une démonstration : mode normal, demande piéton, mode urgence, contrôle Bluetooth.
8. Plan de présentation pour la soutenance (slides recommandés)
1. Titre + équipe + encadrant
2. Problématique & objectifs
3. Cahier des charges
4. Architecture système (schéma)
5. Liste matériel (BOM)
6. Schéma de câblage et photos de la maquette
7. Démonstration vidéo / live
8. Tests & résultats
9. Difficultés rencontrées
10. Conclusion & perspectives
9. Fichiers que je peux te fournir maintenant
• Rapport formaté (PDF) contenant tout ce qui précède + images et schémas.
• Fichiers sources : code .ino, schéma Fritzing (si tu veux que je le génère en image texte), liste de
courses prête à l'emploi.
10. Remarques finales
• Si tu veux, je peux aussi :
• adapter le code pour écran 7 segments au lieu du LCD
7
• simplifier pour une version minimaliste (1 voie)
• générer un fichier PDF prêt à télécharger
Bonne chance ! Dis-moi si tu veux que je : - Génère le PDF maintenant (je peux créer le PDF à partir du
document), - Prépare le fichier .ino téléchargeable, - ou si tu veux que j’ajuste des pins / durées.
Document généré automatiquement pour ton PFE — modifie ou demande des compléments si besoin.