#116Intermedio

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni

Il sensore a ultrasuoni HC-SR04 calcola la distanza misurando il tempo di volo (Time of Flight) dell'onda sonora che emette dopo aver colpito un oggetto e essere rimbalzata indietro. In questo progetto invieremo un impulso di 10 microsecondi dall'ESP32 al pin TRIG del sensore e leggeremo il tempo di eco proveniente dal pin ECHO con `pulseIn()`. Visualizziamo la distanza calcolata in cm su un display LCD I2C 16x2. Poiché l'HC-SR04 funziona a 5V, è necessario un **divisore di tensione** sul pin EC

4.9(28)
44 completato
ESP32 HC-SR04 Misuratore di distanza a ultrasuoni
Un piccolo strumento che ti dice quanto è lontana la tua mano o una scatola, senza bisogno del righello. Il sensore di distanza manda un suono che le tue orecchie non sentono e ascolta l'eco, poi l'ESP32 scrive il risultato in centimetri su un piccolo schermo e ti avvisa quando l'oggetto è fuori portata. Vedrai sulla tua scrivania come fanno i pipistrelli a orientarsi al buio.

Video

Schema circuito

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni - Circuit

Codice sorgente

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 HC-SR04 Misuratore di distanza a ultrasuoni
4// ─────────────────────────────────────────
5// Attiva l'HC-SR04 con un impulso TRIG, calcola la distanza (cm) dal tempo
6// dell'ECHO e la mostra su un LCD I2C 16x2 ogni 0.2 s. Se non torna nessun
7// eco, lo schermo mostra "Menzil disinda" (fuori portata).
8//
9// Pin:
10//   GPIO 5  -> TRIG dell'HC-SR04
11//   GPIO 18 -> ECHO dell'HC-SR04 (tramite un partitore di tensione)
12//   Partitore: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13//   GPIO 21 -> SDA dell'LCD, GPIO 22 -> SCL dell'LCD
14//   VCC dell'HC-SR04 e dell'LCD -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Definizione dei pin
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18;   // Richiede un partitore di tensione 1k + 2k
22
23// Indirizzo dell'LCD 0x27 o 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Velocità del suono (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Timeout dell'eco (~5 m)
28
29void setup() {
30  pinMode(TRIG_PIN, OUTPUT);
31  pinMode(ECHO_PIN, INPUT);
32  digitalWrite(TRIG_PIN, LOW);
33
34  // Pin I2C predefiniti della DevKit V1
35  Wire.begin(21, 22);
36
37  lcd.init();
38  lcd.backlight();
39
40  // Schermata iniziale 3 s
41  lcd.setCursor(3, 0);
42  lcd.print("BlueGrays");
43  lcd.setCursor(1, 1);
44  lcd.print("HC-SR04 v1.0");
45  delay(3000);
46
47  // Schermata principale
48  lcd.clear();
49  lcd.setCursor(0, 0);
50  lcd.print("Mesafe:");
51}
52
53// Legge la distanza in cm, -1 in caso di errore
54float readDistanceCm() {
55  // Un impulso TRIG di 10 us avvia una misura
56  digitalWrite(TRIG_PIN, LOW);
57  delayMicroseconds(2);
58  digitalWrite(TRIG_PIN, HIGH);
59  delayMicroseconds(10);
60  digitalWrite(TRIG_PIN, LOW);
61
62  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63  if (duration == 0) return -1.0f;
64  // Andata e ritorno, quindi dividere per 2
65  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69  float distance = readDistanceCm();
70
71  // Cancellare la riga in basso
72  lcd.setCursor(0, 1);
73  lcd.print("                ");
74  lcd.setCursor(0, 1);
75
76  if (distance < 0) {
77    lcd.print("Menzil disinda");
78  } else {
79    lcd.print(distance, 1);   // 1 cifra decimale
80    lcd.print(" cm");
81  }
82
83  delay(200);
84}
85

FAQ

Perché viene installato un divisore di tensione sulla linea ECHO?▾

L'HC-SR04 funziona a 5 V e il pin ECHO eroga 5 V; gli ingressi dell'ESP32 accettano al massimo 3,3 V. Il partitore realizzato con resistenze da 1 kΩ e 2 kΩ riduce la tensione da 5 V a circa 3,3 V, proteggendo così l’ESP32.

È necessario un divisore anche per il pin TRIG?▾

No. TRIG è un segnale proveniente dall'ESP32 diretto al sensore; il livello HIGH a 3,3 V dell'ESP32 viene rilevato dall'HC-SR04 in modo generalmente affidabile.

Con l'HC-SR04P è necessario un divisore?▾

Modelli come l'HC-SR04P e l'RCWL-1601 possono essere alimentati a 3,3 V; in questo caso anche l'uscita ECHO è a 3,3 V e non è necessario un divisore di tensione.

Come si può ottenere una misurazione della distanza più precisa?▾

La velocità del suono varia in funzione della temperatura (circa 343 m/s a 20 °C). La correzione della velocità del suono tramite un sensore di temperatura e il calcolo della mediana di alcune misurazioni aumentano la precisione.

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni | BlueGrays