Sensore distanza HC-SR04 con Arduino e display LCD
Costruiamo un metro digitale a ultrasuoni con Arduino, sensore HC-SR04 e display LCD 16×2, visualizzando la distanza misurata in centimetri.
Cosa imparerai
- come funziona il sensore HC-SR04;
- come usare Trigger ed Echo;
- come misurare un intervallo con
pulseIn(); - come convertire il tempo in centimetri;
- come visualizzare la distanza su un LCD 16×2;
- come gestire il caso di oggetto fuori portata.
Come funziona il sensore HC-SR04
Il sensore HC-SR04 invia un breve impulso ultrasonico e misura il tempo necessario affinché l’eco ritorni dopo aver incontrato un ostacolo. Poiché il suono percorre il tragitto di andata e ritorno, la distanza finale va calcolata dividendo per due.
Sensore a ultrasuoni HC-SR04 utilizzato nel progetto.
pulseIn() rappresenta il tempo totale andata + ritorno dell’onda sonora.Materiale necessario
🧰 Kit Arduino consigliato
Un kit completo è comodo per avere già a disposizione display, breadboard, potenziometri, resistenze e altri componenti usati nei progetti del sito.
👉 Guarda il kit Arduino consigliatoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
📘 Vuoi imparare Arduino passo dopo passo?
Nei miei libri trovi spiegazioni progressive, schemi chiari e molti progetti pratici pensati anche per chi parte da zero.
👉 Scopri i miei libri su ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
Schema del progetto con sensore HC-SR04 e display LCD 16×2.
Pin utilizzati
| Elemento | Pin Arduino | Funzione |
|---|---|---|
| HC-SR04 Trigger | D7 | Invio impulso ultrasonico |
| HC-SR04 Echo | D8 | Misura della durata dell’eco |
| LCD RS | D12 | Register Select |
| LCD Enable | D11 | Abilitazione display |
| LCD D4 | D5 | Dati |
| LCD D5 | D4 | Dati |
| LCD D6 | D3 | Dati |
| LCD D7 | D2 | Dati |
Codice Arduino commentato
#include <LiquidCrystal.h>
// Pin del sensore HC-SR04
const int triggerPort = 7;
const int echoPort = 8;
// Collegamenti LCD:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// Trigger invia l'impulso ultrasonico
pinMode(triggerPort, OUTPUT);
// Echo riceve il segnale di ritorno
pinMode(echoPort, INPUT);
// Avvia il Monitor Seriale
Serial.begin(9600);
Serial.println("Sensore ultrasuoni:");
// Inizializza il display 16x2
lcd.begin(16, 2);
// Scritta fissa sul display
lcd.print("Distanza:");
}
void loop() {
// Porta inizialmente LOW il Trigger
digitalWrite(triggerPort, LOW);
delayMicroseconds(2);
// Impulso di 10 microsecondi
digitalWrite(triggerPort, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPort, LOW);
// Misura per quanto tempo Echo resta HIGH
unsigned long duration = pulseIn(echoPort, HIGH, 40000UL);
// Se non arriva nessun eco entro il timeout
if (duration == 0) {
Serial.println("Fuori portata");
lcd.setCursor(10, 0);
lcd.print(" ");
}
else {
// Velocità del suono ≈ 0,034 cm/us.
// Dividiamo per 2 perché il suono
// percorre andata e ritorno.
float distanza = duration * 0.0343 / 2.0;
// Mostra il valore sul Monitor Seriale
Serial.print("Durata: ");
Serial.print(duration);
Serial.print(" us - Distanza: ");
Serial.print(distanza, 1);
Serial.println(" cm");
// Pulisce l'area numerica precedente
lcd.setCursor(10, 0);
lcd.print(" ");
// Scrive la nuova distanza
lcd.setCursor(10, 0);
lcd.print(distanza, 1);
lcd.setCursor(14, 0);
lcd.print("cm");
}
delay(300);
}
Come funziona il calcolo della distanza
La formula usata è:
Nel codice la velocità del suono viene approssimata a circa 0.0343 cm/µs. Se per esempio l’eco impiega 1000 microsecondi:
Perché dividiamo per 2?
Il tempo misurato comprende sia il percorso dal sensore all’ostacolo sia il ritorno dell’eco dall’ostacolo al sensore. A noi interessa soltanto la distanza in una direzione, quindi dividiamo il percorso totale per due.
Che cosa fa pulseIn()
pulseIn(echoPort, HIGH) misura per quanto tempo il pin Echo rimane nello stato HIGH. Questa durata, espressa in microsecondi, è la base per il calcolo della distanza.
pulseIn(). Senza timeout, in alcune condizioni il programma può restare in attesa più a lungo del necessario se non viene ricevuto un eco valido.Monitor Seriale e LCD
Lo sketch mostra la distanza contemporaneamente sul display LCD e sul Monitor Seriale. Questo è molto utile durante il collaudo, perché permette di verificare sia il valore calcolato sia il corretto funzionamento del display.
Perché il potenziometro da 10 kΩ?
Nel classico LCD 16×2 parallelo il potenziometro viene utilizzato per regolare il contrasto del display. Se il display sembra completamente vuoto oppure mostra soltanto rettangoli scuri, la prima cosa da controllare è proprio il contrasto.
Scarica lo sketch originale
⬇️ Scarica misuratore_di_distanza.ino
Limiti pratici della misura
La precisione può dipendere dalla forma, dall’orientamento e dal materiale dell’oggetto. Superfici inclinate, morbide o poco riflettenti possono restituire un eco debole o deviarlo lontano dal ricevitore.
Anche temperatura e condizioni ambientali modificano leggermente la velocità del suono, quindi questo progetto va considerato un ottimo misuratore didattico, non uno strumento metrologico di precisione.
Debug rapido
- controlla VCC e GND del sensore;
- verifica che Trigger sia su D7 ed Echo su D8;
- controlla tutti i sei collegamenti dati del display;
- regola il potenziometro del contrasto;
- apri il Monitor Seriale a 9600 baud;
- prova con un oggetto piano davanti al sensore;
- se ottieni valori instabili, evita ostacoli troppo inclinati o troppo vicini.
Varianti del progetto
- aggiungere un buzzer che aumenta la frequenza quando l’ostacolo si avvicina;
- usare LED verdi, gialli e rossi in base alla distanza;
- realizzare un sensore di parcheggio;
- montare HC-SR04 su un servomotore per effettuare una scansione;
- visualizzare i dati su OLED;
- inviare la distanza via Bluetooth o Wi-Fi.
Cosa devi ricordare
- Trigger genera l’impulso ultrasonico.
- Echo restituisce la durata del viaggio dell’onda.
- La distanza si calcola moltiplicando il tempo per la velocità del suono e dividendo per due.
pulseIn()permette di misurare la durata dell’impulso.- Il display LCD visualizza direttamente la distanza in centimetri.
- Un timeout rende il programma più robusto quando non arriva un eco valido.
Domande frequenti
Perché il display è acceso ma non vedo testo?
Controlla soprattutto il potenziometro del contrasto e i collegamenti RS, Enable e D4-D7.
Perché la distanza cambia continuamente?
Piccole oscillazioni sono normali. Riflessi, posizione dell’oggetto e ambiente possono influenzare la misura. Puoi anche applicare una media di più letture.
Posso usare un display I2C?
Sì, ma il cablaggio e la libreria cambiano. Con un modulo I2C servono normalmente soltanto SDA, SCL, alimentazione e massa.
Posso usare il progetto come sensore di parcheggio?
Sì, come progetto didattico. Puoi aggiungere LED e buzzer con soglie diverse in base alla distanza.

