#116Intermédiaire

ESP32 HC-SR04 Télémètre à ultrasons

Le capteur à ultrasons HC-SR04 calcule la distance en mesurant le temps de vol (Time of Flight) de l'onde sonore qu'il émet lorsqu'elle rebondit sur un objet. Dans ce projet, nous enverrons une impulsion de 10 microsecondes depuis l'ESP32 vers la broche TRIG du capteur et nous lirons la durée de l'écho provenant de la broche ECHO à l'aide de la fonction `pulseIn()`. Nous afficherons la distance calculée en cm sur un écran LCD I2C 16x2. Le capteur HC-SR04 fonctionnant en 5 V, un **diviseur de ten

4.9(28)
44 terminé
ESP32 HC-SR04 Télémètre à ultrasons
Un petit appareil qui te dit à quelle distance se trouve ta main ou une boîte, sans règle. Le capteur de distance envoie un son que tes oreilles ne peuvent pas entendre et écoute l'écho, puis l'ESP32 affiche le résultat en centimètres sur un petit écran et te prévient quand l'objet est hors de portée. Tu vois sur ton bureau comment les chauves-souris trouvent leur chemin dans le noir.

Vidéo

Schéma du circuit

ESP32 HC-SR04 Télémètre à ultrasons - Circuit

Code source

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 HC-SR04 Télémètre à ultrasons
4// ─────────────────────────────────────────
5// Déclenche le HC-SR04 avec une impulsion TRIG, calcule la distance (cm) à
6// partir du temps ECHO et l'affiche sur un LCD I2C 16x2 toutes les 0.2 s.
7// Si aucun écho ne revient, l'écran affiche "Menzil disinda" (hors
8// portée).
9//
10// Broches :
11//   GPIO 5  -> TRIG du HC-SR04
12//   GPIO 18 -> ECHO du HC-SR04 (via un diviseur de tension)
13//   Diviseur : ECHO -> 1k -> GPIO 18 -> 2k -> GND
14//   GPIO 21 -> SDA du LCD, GPIO 22 -> SCL du LCD
15//   VCC du HC-SR04 et du LCD -> 5V (VIN), GND -> GND
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19
20// Définitions des broches
21const int TRIG_PIN = 5;
22const int ECHO_PIN = 18;   // Nécessite un diviseur de tension 1k + 2k
23
24// Adresse du LCD 0x27 ou 0x3F
25LiquidCrystal_I2C lcd(0x27, 16, 2);
26
27const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Vitesse du son (cm/us)
28const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Délai d'attente de l'écho (~5 m)
29
30void setup() {
31  pinMode(TRIG_PIN, OUTPUT);
32  pinMode(ECHO_PIN, INPUT);
33  digitalWrite(TRIG_PIN, LOW);
34
35  // Broches I2C par défaut du DevKit V1
36  Wire.begin(21, 22);
37
38  lcd.init();
39  lcd.backlight();
40
41  // Écran d'accueil 3 s
42  lcd.setCursor(3, 0);
43  lcd.print("BlueGrays");
44  lcd.setCursor(1, 1);
45  lcd.print("HC-SR04 v1.0");
46  delay(3000);
47
48  // Écran principal
49  lcd.clear();
50  lcd.setCursor(0, 0);
51  lcd.print("Mesafe:");
52}
53
54// Lit la distance en cm, -1 en cas d'erreur
55float readDistanceCm() {
56  // Une impulsion TRIG de 10 us lance une mesure
57  digitalWrite(TRIG_PIN, LOW);
58  delayMicroseconds(2);
59  digitalWrite(TRIG_PIN, HIGH);
60  delayMicroseconds(10);
61  digitalWrite(TRIG_PIN, LOW);
62
63  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
64  if (duration == 0) return -1.0f;
65  // Aller-retour, donc diviser par 2
66  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
67}
68
69void loop() {
70  float distance = readDistanceCm();
71
72  // Effacer la rangée du bas
73  lcd.setCursor(0, 1);
74  lcd.print("                ");
75  lcd.setCursor(0, 1);
76
77  if (distance < 0) {
78    lcd.print("Menzil disinda");
79  } else {
80    lcd.print(distance, 1);   // 1 décimale
81    lcd.print(" cm");
82  }
83
84  delay(200);
85}
86

FAQ

Pourquoi installe-t-on un diviseur de tension sur la ligne ECHO ?▾

Le HC-SR04 fonctionne à 5 V et la broche ECHO délivre 5 V ; les entrées de l'ESP32 acceptent au maximum 3,3 V. Le diviseur de tension constitué de résistances de 1 kΩ et 2 kΩ abaisse la tension de 5 V à environ 3,3 V, ce qui protège l'ESP32.

Faut-il un diviseur sur la broche TRIG ?▾

Non. TRIG est un signal provenant de l'ESP32 et destiné au capteur ; le niveau HIGH de 3,3 V de l'ESP32 est généralement détecté de manière fiable par le HC-SR04.

Avec le HC-SR04P, a-t-on besoin d'un diviseur ?▾

Les modèles tels que le HC-SR04P et le RCWL-1601 peuvent être alimentés en 3,3 V ; dans ce cas, la tension de sortie ECHO est également de 3,3 V et aucun diviseur n'est nécessaire.

Comment obtenir une mesure de distance plus précise ?▾

La vitesse du son varie en fonction de la température (environ 343 m/s à 20 °C). La correction de la vitesse du son à l'aide d'un capteur de température et le calcul de la médiane de plusieurs mesures permettent d'améliorer la précision.