Codice Arduino e video per sensore di distanza a ultrasuoni HC-SR04 con display OLED SSD1306
In questo tutorial mostreremo come utilizzare il sensore di distanza a ultrasuoni HC-SR04 insieme al display OLED SSD1306 per visualizzare le misurazioni di distanza. Questo progetto ti permette di misurare distanze senza bisogno di un computer, rendendolo ideale per varie applicazioni, inclusa la robotica. Al termine di questo progetto avrai un sistema funzionante che mostra le letture di distanza direttamente sullo schermo OLED.


Man mano che procediamo, spiegherò il cablaggio necessario per entrambi i componenti e fornirò una guida passo passo del codice Arduino che integra questi componenti. Questo ti aiuterà a capire come il sensore misura la distanza e come visualizzare quei dati sul display OLED. Per ulteriori chiarimenti, puoi fare riferimento al video associato a questo tutorial (nel video a 00:00).
Hardware spiegato
Le componenti principali di questo progetto sono il sensore di distanza a ultrasuoni HC-SR04 e il display OLED SSD1306. L'HC-SR04 funziona utilizzando onde ultrasoniche; emette un impulso sonoro tramite il pin di trigger e rileva l'eco sul pin di echo. Calcolando il tempo impiegato dal suono per tornare, può determinare la distanza da un oggetto. Questo sensore è molto efficace per misurazioni a corto raggio, tipicamente fino a 400-500 cm.
Il display OLED SSD1306 è un display con interfaccia I2C che permette di visualizzare testo e grafica. Comunica tramite due pin: SDA (linea dati) e SCL (linea di clock). Nella nostra configurazione, questi pin sono collegati a pin specifici dell'Arduino, consentendo una facile integrazione e controllo.
Dettagli della scheda tecnica
| Produttore | Vari |
|---|---|
| Numero di parte | HC-SR04 |
| Tensione logica/I/O | 5 V |
| Tensione di alimentazione | 5 V |
| Corrente di uscita (per canale) | 15 mA |
| Corrente di picco (per canale) | 20 mA |
| Linee guida sulla frequenza PWM | Non applicabile |
| Soglie logiche di ingresso | da 0.3*Vcc a 0.7*Vcc |
| Caduta di tensione / RDS(on) / saturazione | Non applicabile |
| Limiti termici | 0-70 °C |
| Pacchetto | modulo a 4 pin |
| Note / varianti | Modulo standard |
- Assicurare un'alimentazione adeguata (5 V) per entrambi i componenti.
- Usare resistenze di pull-up se necessario per la comunicazione I2C.
- Mantieni corte le linee trigger ed echo per evitare interferenze.
- Controllare l'orientamento del sensore a ultrasuoni per misurazioni accurate.
- Utilizzare una superficie stabile per il display per evitare vibrazioni meccaniche.
Istruzioni di cablaggio

Per collegare il sensore ultrasonico HC-SR04, inizia collegando il pin VCC (di solito rosso) al pin 5V dell'Arduino. Successivamente, collega il pin GND (tipicamente nero o giallo) a uno dei pin GND dell'Arduino. Il pin trigger (spesso blu) dovrebbe essere collegato al pin digitale 12 dell'Arduino, mentre il pin echo (di solito verde) dovrebbe essere collegato al pin digitale 11.
Per il display OLED SSD1306, collega il pin VCC al pin 5V dell'Arduino e il pin GND a GND. Il pin SCL deve essere collegato al pin A5 e il pin SDA al pin A4 sull'Arduino. Se stai usando un modello di Arduino diverso che dispone di pin I2C dedicati, collega invece il display direttamente a quei pin.
Esempi di codice e guida passo passo
Nella funzione setup inizializziamo il display e la comunicazione seriale. L'estratto seguente mostra come viene configurato il display:
void setup() {
Serial.begin(9600);// set serial monitor with 9600 baud
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D
}Qui il display viene inizializzato con l'indirizzo I2C, permettendogli di comunicare con l'Arduino. Il monitor seriale è inoltre configurato per stampare i valori di distanza.
Nel ciclo principale cancelliamo il display, misuriamo la distanza e la stampiamo. Il seguente frammento di codice mostra come gestiamo la misurazione della distanza:
void loop() {
display.clearDisplay();
String distance = String(sonar.ping_cm());// get distance and convert it to string for display
robojaxText(distance +"cm", 3, 20, 3, false);
display.display();
delay(50); // Wait 50ms between pings
}Questo ciclo misura continuamente la distanza e aggiorna il display con la lettura corrente. La funzione robojaxText viene utilizzata per visualizzare il testo sullo schermo OLED.
Dimostrazione / Cosa aspettarsi
Quando la configurazione è completa e il codice è stato caricato, dovresti vedere la distanza visualizzata sullo schermo OLED in centimetri. Man mano che avvicini o allontani un oggetto dal sensore, il valore visualizzato dovrebbe cambiare di conseguenza. Assicurati che il sensore sia orientato correttamente e non sia ostruito (nel video a 02:30).
Timestamp del video
- 00:00- Introduzione al progetto
- 01:15- Istruzioni di cablaggio
- 02:30- Spiegazione del codice
- 04:00- Dimostrazione del sensore
/*
* This is the Arduino code for the HC-SR04 Ultrasonic Distance Sensor with SSD1306 Display
* to measure the distance using Arduino for a robotic car and other applications
* Watch the video https://youtu.be/Pgx5fNF4Q6M
*
* Written by Ahmad Shamshiri for Robojax Video
* Date: December 21, 2017, in Ajax, Ontario, Canada
* Permission granted to share this code given that this
* note is kept with the code.
* Disclaimer: this code is "AS IS" and for educational purposes only.
*
*/
/* Original Code
from https://github.com/adafruit/Adafruit_SSD1306
// https://playground.arduino.cc/Code/NewPing
* Modified for Robojax video on December 21, 2017
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
*/
//// start of SSD1306 display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 64
#define LOGO16_GLCD_WIDTH 128
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//// end of SSD1306 display
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
#include <NewPing.h>
#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
void setup() {
Serial.begin(9600);// set serial monitor with 9600 baud
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
}// setup end
void loop() {
display.clearDisplay();
robojaxText("Distance", 3, 0, 2, false);
String distance = String(sonar.ping_cm());// get distance and convert it to string for display
robojaxText(distance +"cm", 3, 20, 3, false);
display.display();
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
Serial.print("Ping: ");
Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
Serial.println("cm");
}// loop end
/*
* robojaxText(String text, int x, int y,int size, boolean d)
* text is the text string to be printed
* x is the integer x position of text
* y is the integer y position of text
* size is the text size, 1, 2, 3 etc
* d is either true or false. Use true to display.
*/
void robojaxText(String text, int x, int y,int size, boolean d) {
display.setTextSize(size);
display.setTextColor(WHITE);
display.setCursor(x,y);
display.println(text);
if(d){
display.display();
}
}
Risorse e riferimenti
-
EsternoLibreria Ultrasonica HC-SR04 dal sito ufficiale di Arduinoplayground.arduino.cc
File📁
Nessun file disponibile.