/* Claude EMERY 22/03/2026
Utiliisation du capteur Ultrason HC-SR04
2 LED verte -> Distance de 50cm à 38cm
2 LED Orange -> Distance de 37cm à 24cm
2 LED Rouge -> Distance de 23cm à 0cm
Buzzer -> tone(pin, fréquence, durée) & noTone(pin)
*/
#include <LiquidCrystal_I2C.h>
#define Broche_Echo 4 // Broche Echo du HC-SR04 sur D4
#define Broche_Trigger 5 // Broche Trigger du HC-SR04 sur D5
LiquidCrystal_I2C lcd2004(0x27, 20, 04); // LCD 0x27 20 caracteres 4 lignes
int MesureMaxi = 100; // Distance maxi a mesurer en cm
int MesureMini = 10; // Distance mini a mesurer en cm
int myBip = 3; // Buzzer
int ledVerte1 = 8;
int ledVerte2 = 9;
int ledOrange1 = 10;
int ledOrange2 = 11;
int ledRouge1 = 12;
int ledRouge2 = 13;
long Duree;
long Distance;
void setup(){
pinMode(Broche_Trigger, OUTPUT); // Broche Trigger en sortie
pinMode(Broche_Echo, INPUT); // Broche Echo en entree
pinMode(ledVerte1, OUTPUT); // Broche led rouge
pinMode(ledVerte2, OUTPUT); // Broche led rouge
pinMode(ledOrange1, OUTPUT); // Broche led rouge
pinMode(ledOrange2, OUTPUT); // Broche led rouge
pinMode(ledRouge1, OUTPUT); // Broche led rouge
pinMode(ledRouge2, OUTPUT); // Broche led rouge
pinMode(myBip, OUTPUT); // Broche Buzzer
lcd2004.init(); // Affichage de départ
lcd2004.backlight();
lcd2004.setCursor(2, 0); // Colonne 2, Ligne 0
lcd2004.print ("Sensor Ultrason");
lcd2004.setCursor(2, 2); // Colonne 1, Ligne 1
lcd2004.print ("<------------->");
lcd2004.setCursor(0, 2); // Colonne 1, Ligne 2
lcd2004.print ("Deplacer le curseur");
lcd2004.setCursor(5, 3); // Colonne 1, Ligne 3
lcd2004.print ("du HC-SR04");
digitalWrite(ledVerte1, LOW); // Eteindre les leds
digitalWrite(ledVerte2, LOW);
digitalWrite(ledOrange1, LOW);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
Serial.begin (9600);
}
void loop() {
// Debut de la mesure avec un signal de 10 μS applique sur TRIG
digitalWrite(Broche_Trigger, LOW); // On efface l'etat logique de TRIG
delayMicroseconds(2);
digitalWrite(Broche_Trigger, HIGH); // On met la broche TRIG a "1" pendant 10μS
delayMicroseconds(10);
digitalWrite(Broche_Trigger, LOW); // On remet la broche TRIG a "0"
// On mesure combien de temps le niveau logique haut est actif sur ECHO
Duree = pulseIn(Broche_Echo, HIGH); //Fonction pulseIn - Lecture des pulses
// Calcul de la distance grace au temps mesure
//(Durée totale (aller-retour ultrasons) * La vitesse du son (0.034 cm/μs)) / 2
Distance = Duree * 0.0344 / 2; // 0.034 ou 0.344 - Aller/Retour donc on divise par 2
// Verification si valeur mesuree dans la plage
if (Distance >= MesureMaxi || Distance <= MesureMini) {
//Si la distance est hors plage, on affiche un message d'erreur
lcd2004.init(); // Initialisation lcd
lcd2004.backlight();
lcd2004.clear();
lcd2004.setCursor(2, 0); // Colonne 2, Ligne 0
lcd2004.print ("Sensor Ultrason");
lcd2004.setCursor(2, 2); // Colonne 2, Ligne 3
lcd2004.print("Distance mesuree");
lcd2004.setCursor(0, 3); // Colonne 0, Ligne 4
lcd2004.print("hors plage (10cm/1m)");
// Eteindre toutes les leds
digitalWrite(ledVerte1, LOW); // Eteindre les leds
digitalWrite(ledVerte2, LOW);
digitalWrite(ledOrange1, LOW);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
//Affichage dans moniteur série
Serial.println("Distance mesuree hors plage (10cm/1m)");
//noTone(myBip);
}
else {
lcd2004.clear();
lcd2004.setCursor(2, 0); // Colonne 2, Ligne 0
lcd2004.print ("Sensor Ultrason");
lcd2004.setCursor(2, 2); // Colonne 2, Ligne 3
lcd2004.print("Distance mesuree");
lcd2004.setCursor(8, 3); // Colonne 8, Ligne 4
lcd2004.print(Distance);
lcd2004.setCursor(11, 3); // Colonne 11, Ligne 4
lcd2004.print("cm");
// Affichage dans le moniteur serie de la distance mesuree
Serial.print("Distance mesuree :");
Serial.print(Distance);
Serial.println("cm");
delay(500);
}
/*
Explication Led <=> Vitesse Max/Min
Led Rouge = R1 et R2, Led Orange = O1 et O2, led Verte = V1 et V23
-----------------------------------
Led | R2 | R1 | O2 | O1 | V2 | V1 |
-----------------------------------
Max | 16 | 23 | 30 | 37 | 44 | 50 | 51 et +
-----------------------------------
Min | 10 | 17 | 24 | 31 | 38 | 45 |
*/
// Eteindre les led si superieur à 50 cm
if (Distance <= 99 && Distance >= 51) {
digitalWrite(ledVerte1, LOW);
digitalWrite(ledVerte2, LOW);
digitalWrite(ledOrange1, LOW);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
Serial.println("Superieur 51");
}
if (Distance <= 50 && Distance >= 45) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, LOW);
digitalWrite(ledOrange1, LOW);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
melodie1(); // Mélodie1 -> de 50cm à 38cm
Serial.println("entre 45 et 50");
}
if (Distance <= 44 && Distance >= 38) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, LOW);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
melodie1(); // Mélodie1 -> de 50cm à 38cm
Serial.println("entre 38 et 44");
}
if (Distance <= 37 && Distance >= 31) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, HIGH);
digitalWrite(ledOrange2, LOW);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
melodie2(); // Mélodie2 -> de 37cm à 24cm
Serial.println("entre 31 et 37");
}
if (Distance <= 30 && Distance >= 24) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, HIGH);
digitalWrite(ledOrange2, HIGH);
digitalWrite(ledRouge1, LOW);
digitalWrite(ledRouge2, LOW);
melodie2(); // Mélodie2 -> de 37cm à 24cm
Serial.println("entre 24 et 30");
}
if (Distance <= 23 && Distance >= 17) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, HIGH);
digitalWrite(ledOrange2, HIGH);
digitalWrite(ledRouge1, HIGH);
digitalWrite(ledRouge2, LOW);;
melodie3(); // Mélodie3 -> de 23cm à 0cm
Serial.println("entre 17 et 23");
}
if (Distance <= 16 && Distance >= 10) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, HIGH);
digitalWrite(ledOrange2, HIGH);
digitalWrite(ledRouge1, HIGH);
digitalWrite(ledRouge2, HIGH);;
melodie3(); // Mélodie3 -> de 23cm à 0cm
Serial.println("entre 10 et 16");
}
if (Distance <= 9 && Distance >= 2) {
digitalWrite(ledVerte1, HIGH);
digitalWrite(ledVerte2, HIGH);
digitalWrite(ledOrange1, HIGH);
digitalWrite(ledOrange2, HIGH);
digitalWrite(ledRouge1, HIGH);
digitalWrite(ledRouge2, HIGH);
melodie3(); // Mélodie3 -> de 23cm à 0cm
lcd2004.clear();
lcd2004.setCursor(2, 0); // Colonne 2, Ligne 0
lcd2004.print ("--- COLLISION ---");
lcd2004.setCursor(2, 2); // Colonne 2, Ligne 3
lcd2004.print("--- TROP PRES ---");
Serial.println("Inférieur à 10 => Collision");
}
}
void melodie1() { // Mélodie1 -> de 50cm à 38cm
noTone(myBip); tone(myBip, 440, 200); delay(200);
}
void melodie2() { // Mélodie2 -> de 37cm à 24cm
noTone(myBip); tone(myBip, 494, 500); delay(500);
}
void melodie3() { // Mélodie3 -> de 23cm à 0cm
noTone(myBip); tone(myBip, 523, 300); delay(300);
}
/*
void melodie(){ // Mélodie - 3 tons
noTone(myBip); tone(myBip, 440, 200); delay(200);
noTone(myBip); tone(myBip, 494, 500); delay(500);
noTone(myBip); tone(myBip, 523, 300); delay(300);
}
*/