Skip to Content

Sensore di parcheggio con CrowPanel ESP32 Display

Sensore di parcheggio con CrowPanel ESP32 Display

In questo tutorial imparerai come costruire un sensore di parcheggio con il TOF10120 IR Laser Distance Sensor e un CrowPanel 3.5″ ESP32 Display Un sensore di parcheggio aiuta i conducenti a evitare ostacoli durante le manovre, ad esempio misurando la distanza tra l’auto e il muro del garage.

Il breve video qui sotto mostra il sensore di parcheggio. Illustra come le distanze vengono misurate in centimetri e come impostare la distanza per l’allarme di prossimità (colore rosso):

Demo del sensore di parcheggio su CrowPanel Display con TOF10120

Il sensore TOF10120 usa la tecnologia time-of-flight. Emette un fascio laser a infrarossi e misura quanto tempo impiega il fascio a tornare dopo aver colpito un oggetto. Questo intervallo temporale viene convertito in distanza.

Il microcontrollore ESP32 integrato nel CrowPanel Display elabora i dati del sensore TOF10120. Calcola la distanza e prepara le informazioni per la visualizzazione.

Infine, il display TFT del CrowPanel mostra la distanza in tempo reale. Fornisce l’output visivo, permettendo al guidatore di vedere a che distanza si trova dagli ostacoli.

Nelle sezioni successive imparerai come collegare il sensore TOF10120 al CrowPanel Display e come programmarlo per mostrare le informazioni di distanza. Iniziamo con i componenti necessari.

Componenti necessari

Oltre al sensore TOF10120, avrai bisogno del CrowPanel 3.5″ ESP32 Display di ELECROW e dell’Arduino IDE. Anche alcuni cavi Dupont per collegare sensore e display saranno utili.

TOF10120 Distance Sensor

CrowPanel 3.5″ ESP32 Display

Dupont wire set

Set di cavi Dupont

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Caratteristiche del CrowPanel 3.5″ ESP32 Display

Il CrowPanel 3.5″ ESP32 Display è uno schermo touch resistivo con display TFT a risoluzione 480*320 e un integrato ESP32-WROVER-B come processore di controllo. Puoi ottenere il display con un involucro in acrilico (vedi immagine sotto), il che significa che non devi costruire un case da solo.

CrowPanel 3.5" ESP32 Display with Housing
CrowPanel 3.5″ ESP32 Display with Housing (source)

Oltre a questo, la scheda dispone di uno slot per TF card, un’interfaccia UART, un’interfaccia I2C, un’interfaccia per speaker, un connettore per batteria con funzione di ricarica e una piccola porta GPIO con due pin GPIO. Vedi il pinout qui sotto:

Pinout of CrowPanel 3.5" ESP32 Display
Pinout of CrowPanel 3.5″ ESP32 Display

La tabella seguente elenca quali pin GPIO sono assegnati a ciascuna delle tre interfacce IO.

GPIO_DIO25; IO32
UARTRX(IO16); TX(IO17)
I2CSDA(IO22); SCL(IO21)

La scheda può essere alimentata tramite la porta USB (5V, 2A) oppure collegando una batteria LiPo standard da 3.7V al connettore BAT. Fai attenzione alla polarità del connettore e della batteria. Se il cavo USB e la batteria sono collegati contemporaneamente, la scheda caricherà la batteria (corrente massima di carica 500mA).

Puoi programmare la scheda usando vari ambienti di sviluppo come Arduino IDE, Espressif IDF, Lua RTOS e Micro Python, ed è compatibile con il LVGL graphics library. Tuttavia, in questo tutorial useremo l’Arduino IDE e il TFT_eSPI graphics library.

Caratteristiche del TOF10120

Il sensore di distanza Time-of-Flight TOF10120 è molto piccolo (10mm x 13mm), ad alta precisione e utilizza luce infrarossa per misurare le distanze.

Dimensions of TOF10120
Dimensioni del TOF10120 (source)

Si basa sul principio Time-of-Flight (ToF), in cui il sensore emette impulsi luminosi e misura il tempo necessario al ritorno della luce riflessa per calcolare la distanza. Il TOF10120 ha una portata fino a 180 cm e opera a una lunghezza d’onda di 940nm. L’immagine sotto mostra il cono del LED laser che emette l’impulso luminoso e il cono di vista del rilevatore che registra la luce riflessa.

Working Principle of TOF10120
Principio di funzionamento del TOF10120 (source)

Il TOF10120 funziona a 3V–5V, con un basso consumo medio di corrente di soli 35 mA. La lista seguente riassume le sue caratteristiche principali:

  • Intervallo operativo: 100-1800mm
  • Errore di misura: fino al 5%
  • Misurazione ad alta velocità: max 30ms
  • Interfaccia di comunicazione: UART / I2C
  • Parametri di trasmissione UART: 9600 8n1
  • Lunghezza d’onda: 940 nm
  • Campo visivo: 25°
  • Immunità alla luce ambientale: 50k lux
  • Gamma di tensione: 3V a 5V
  • Consumo medio di corrente: 35 mA

La specifica sopra e il datasheet indicano che la distanza minima misurabile è 100mm. Tuttavia, ho riscontrato che è possibile ottenere misure fino a 10mm e fino a 2000mm, ma sotto i 30mm le letture diventano molto imprecise.

Il TOF10120 comunica con i microcontrollori tramite interfaccia I2C o UART. L’immagine sotto mostra il pinout. SDA e SCL sono per l’interfaccia I2C e RxD e TxD per la comunicazione UART.

Pinout of TOF10120
Pinout del TOF10120

Nella sezione successiva imparerai come collegare il TOF10120 al CrowPanel Display.

Collegare il TOF10120 al CrowPanel Display

Il CrowPanel Display ha una porta I2C e viene fornito con un connettore codificato a colori. Ground è nero, l’alimentazione 3.3V è rossa, SCL è bianco (grigio) e SDA è gialla. Collega Ground al pin 1, 3.3V al pin 2, SDA al pin 5 e SCL al pin 6 del TOF10120 come mostrato sotto:

Connecting TOF10120 to CrowPanel Display
Collegamento TOF10120 al CrowPanel Display

Nota che i pin 3 e 4 (RxD, TxD) del TOF10120 non sono collegati, poiché non stiamo usando l’interfaccia UART ma l’I2C.

L’immagine sotto mostra il cablaggio, seppur un po’ disordinato, del TOF10120 con CrowPanel usando i connettori forniti e alcuni cavi Dupont.

Wiring of TOF10120 with CrowPanel
Cablaggio del TOF10120 con CrowPanel

La buona notizia è che non serve una breadboard né saldare alcun filo.

Test del sensore TOF10120

Prima di implementare qualcosa di complesso è meglio verificare che il sensore sia collegato correttamente e funzioni. Per farlo, prima dobbiamo installare una libreria per leggere le misure di distanza dal sensore TOF10120.

Installare la libreria TOF10120

Per installare la libreria TOF10120 vai al tof10120_arduino_lib repo e clicca sul pulsante verde “Code”. Poi clicca su “Download Zip” come mostrato sotto:

Download TOF10120 library
Scarica la libreria TOF10120

Nel Arduino IDE crea il seguente codice di test:

#include "TOF10120.h"

TOF10120 sensor = TOF10120();

void setup() {
  Serial.begin(9600);
  sensor.init();
}

void loop() {
  Serial.print("distance:");
  Serial.println(sensor.distance());
  delay(100);
}

Poi vai su “Sketch” -> “Include Library” -> “Add .Zip Library..” e seleziona il file “tof10120_arduino_lib-main.zip” che hai appena scaricato:

Adding TOF10120 library to sketch
Aggiunta della libreria TOF10120 allo sketch

Il codice di test è molto semplice. Per prima cosa include la libreria TOF10120 e crea il TOF10120 sensor oggetto. Nella setup() funzione il sensore viene inizializzato e nella loop() funzione chiamiamo infine sensor.distance() per leggere la distanza misurata dal sensore.

Esegui il codice di test per TOF10120 sensor

Nell’Arduino IDE seleziona “ESP32 Dev Module” come scheda e assicurati che il CrowPanel Display sia collegato alla porta USB e visibile nell’Arduino IDE.

ESP32 Dev Module selected as board
ESP32 Dev Module selected as board

Ora carica il codice sul tuo CrowPanel Display e dovresti vedere i valori di distanza stampati sul Serial Monitor. Se non c’è alcun oggetto davanti al sensore vedrai stampato 2000mm, e se il sensore non viene trovato vedrai -1.

Distances printed on Serial Monitor
Distanze stampate sul Serial Monitor

Se hai problemi e il sensore sembra non funzionare assicurati che il cablaggio sia corretto e che siano usati i pin SDA e SCL giusti. Puoi anche controllare il diodo laser del sensore scattando una foto con una fotocamera digitale (telefono). Mentre la luce IR è invisibile all’occhio umano, la fotocamera la può vedere. L’immagine sotto mostra il TOF10120 con il diodo IR chiaramente illuminato:

Illuminated IR Diode of TOF10120
Diodo IR illuminato del TOF10120

Se il sensore TOF10120 funziona e vedi le misure di distanza, possiamo iniziare con la struttura del progetto per il codice principale.

Creare la struttura del progetto

In questa sezione creiamo la struttura del progetto e la configurazione per il TFT_eSPI library che è necessario per controllare il display TFT.

Apri il tuo Arduino IDE e crea un progetto “parking_sensor_display” e salvalo (Save As …). Questo creerà una cartella “parking_sensor_display” con il file “parking_sensor_display.ino” al suo interno. In questa cartella crea un altro file chiamato “tft_setup.h“. La cartella del progetto dovrebbe apparire così

Project Folder Structure
Struttura della cartella del progetto

e nel tuo Arduino IDE dovresti ora avere due tab chiamate “parking_sensor_display.ino” e “tft_setup.h“.

Arduino IDE with two Tabs
Arduino IDE with two Tabs

Clicca sulla scheda “tft_setup.h” per aprire il file e copia il codice seguente al suo interno:

// tft_setup.h
#define ILI9488_DRIVER
#define TFT_HEIGHT  480
#define TFT_WIDTH   320 

#define TFT_BACKLIGHT_ON HIGH
#define TFT_BL   27 
#define TFT_MISO 12
#define TFT_MOSI 13
#define TFT_SCLK 14
#define TFT_CS   15
#define TFT_DC    2 
#define TFT_RST  -1
#define TOUCH_CS 33

#define SPI_FREQUENCY        27000000
#define SPI_TOUCH_FREQUENCY   2500000
#define SPI_READ_FREQUENCY   16000000

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

Questo codice indica al TFT_eSPI library quale display stiamo usando. In particolare, informiamo la libreria delle dimensioni del display (TFT_WIDTH, TFT_WIDTH), del suo driver (ILI9488_DRIVER), di quali pin SPI vengono usati per controllarlo e di quali font caricare. Senza queste impostazioni non sarà possibile visualizzare nulla sul display.

Per informazioni più dettagliate dai un’occhiata al tutorial CrowPanel 2.8″ ESP32 Display : Easy Setup Guide. Lì spieghiamo come configurare il Display da 2.8″. Ma i passaggi e le descrizioni si applicano anche al Display da 3.5″ nello stesso modo. Solo le impostazioni per le dimensioni dello schermo e il driver sono diverse.

Calibrazione del touchscreen

Il CrowPanel 3.5″ Display è dotato di uno schermo touch resistivo che va calibrato prima di poterlo usare con la libreria TFT_eSPI. Copia il codice qui sotto nel file “parking_sensor_display.ino“, compila e caricalo sul CrowPanel 3.5” Display. Come prima, usa la scheda ESP32 Dev Module come scheda.

#include "tft_setup.h"
#include "TFT_eSPI.h"

TFT_eSPI tft = TFT_eSPI();

void setup() {
  Serial.begin(9600);
  tft.begin();
  tft.setRotation(3);
}

void loop() {
  uint16_t cal[5];
  tft.fillScreen(TFT_BLACK);
  tft.setCursor(20, 0);
  tft.setTextFont(2);
  tft.setTextSize(1);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.print("Touch corners ... ");
  tft.calibrateTouch(cal, TFT_MAGENTA, TFT_BLACK, 15);
  tft.println("done.");

  Serial.printf("cal: {%d, %d, %d, %d, %d}\n",
                cal[0], cal[1], cal[2], cal[3], cal[4]);
  delay(10000);
}

Quando il codice è in esecuzione il display mostra una freccia e ti chiede di toccare l’angolo verso cui punta. Questo verrà ripetuto per gli altri tre angoli. Usa la piccola penna gialla fornita con il Display per farlo e cerca di toccare gli angoli il più precisamente possibile.

Calibration of touch screen
Calibrazione del touchscreen

Al termine della procedura di calibrazione il codice stampa i 5 parametri di calibrazione (coordinate degli angoli e orientamento dello schermo) sul Serial Monitor. Dovresti vedere qualcosa del genere:

cal: { 273, 3534, 286, 3615, 4 }

Copia i parametri da qualche parte, poiché ti serviranno nel codice principale. La calibrazione si ripete ogni 10 secondi, quindi puoi fare diversi tentativi per ottenere i parametri più accurati. Per informazioni più dettagliate sul processo di calibrazione consulta il CrowPanel 2.8″ ESP32 Display : Easy Setup Guide tutorial.

Codice per il sensore di parcheggio

In questa sezione scriviamo il codice principale per il sistema di sensore di parcheggio usando il display CrowPanel ESP32 e il sensore di distanza laser TOF10120. Il sistema misura continuamente la distanza da un oggetto e la mostra sullo schermo, cambiando colore in base alla prossimità dell’oggetto. Un pulsante sul display permette all’utente di impostare una soglia di distanza minima.

Lo screenshot seguente mostra gli elementi principali dell’interfaccia utente:

User Interface for Parking Sensor
Interfaccia utente per il sensore di parcheggio

Dai prima uno sguardo veloce al codice completo, poi entriamo nei dettagli:

#include "stdarg.h"
#include "tft_setup.h"
#include "TFT_eSPI.h"
#include "TOF10120.h"

TFT_eSPI tft = TFT_eSPI();
TOF10120 sensor = TOF10120();

uint16_t cal[5] = { 273, 3534, 286, 3615, 4 };
int minDist = 50;


int getDistance() {
  return sensor.distance() / 10;
}

void drawString(int16_t x, int16_t y, uint8_t font, const char* format, ...) {
  static char buf[64];
  va_list args;
  va_start(args, format);
  vsnprintf(buf, 64, format, args);
  tft.setTextDatum(MC_DATUM);
  tft.drawString(buf, x, y, font);
}

void drawDistance() {
  static char buf[32];
  int dist = getDistance();
  uint32_t color = TFT_GREEN;
  if (dist < minDist * 1.5) color = TFT_YELLOW;
  if (dist < minDist) color = TFT_RED;
  tft.setTextColor(color, TFT_BLACK);
  tft.setTextSize(3);
  drawString(tft.width() / 2, 120, 7, "   %d   ", dist);
}

void drawButton() {
  static bool oldTouch = true;
  int cx = tft.width() / 2;
  int bw = 140, bh = 50, bt = 3;
  int x = cx - bw / 2, y = tft.height() - bh - 10;

  uint16_t tx, ty;
  bool isTouch = tft.getTouch(&tx, &ty);
  isTouch = isTouch && (abs(tx - cx) < bw / 2) && (ty > y);
  if (isTouch == oldTouch) return;
  oldTouch = isTouch;

  tft.fillSmoothRoundRect(x, y, bw, bh, 10, TFT_WHITE);
  if (isTouch) {
    tft.setTextColor(TFT_BLACK, TFT_WHITE, true);
    minDist = getDistance();
  } else {
    tft.fillSmoothRoundRect(x + bt, y + bt, bw - 2 * bt, bh - 2 * bt, 10, TFT_BLACK);
    tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  }
  drawString(cx, y + bh / 2, 1, "set");
  tft.setTextColor(TFT_SILVER, TFT_BLACK, true);
  drawString(cx, y - 30, 1, "  %d  ", minDist);
}

void setup(void) {
  sensor.init();
  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
}

void loop() {
  drawDistance();
  drawButton();
  delay(100);
}

Suddividiamo il codice nei suoi componenti per una migliore comprensione.

Inclusioni di librerie

Iniziamo includendo le librerie necessarie per il nostro progetto. Queste librerie forniscono le funzionalità richieste per interagire con il display e il sensore di distanza.

#include "stdarg.h"
#include "tft_setup.h"
#include "TFT_eSPI.h"
#include "TOF10120.h"

Inizializzazione degli oggetti

Successivamente, creiamo istanze del display e del sensore. Il TFT_eSPI oggetto tft viene usato per controllare il display, mentre il TOF10120 oggetto sensor viene usato per interagire con il sensore laser di distanza.

TFT_eSPI tft = TFT_eSPI();
TOF10120 sensor = TOF10120();

Calibrazione e distanza minima

Definiamo un array cal per i valori di calibrazione e un intero minDist che imposta la soglia di distanza minima per il sensore. Questa soglia verrà usata per cambiare il colore della distanza visualizzata in base a quanto è vicino un oggetto. I valori di calibrazione provengono dal processo di calibrazione del touchscreen descritto in precedenza.

uint16_t cal[5] = { 273, 3534, 286, 3615, 4 };
int minDist = 50;

Funzione di lettura della distanza

La getDistance() funzione recupera la distanza misurata dal sensore e la converte da millimetri a centimetri dividendo per 10.

int getDistance() {
  return sensor.distance() / 10;
}

Funzione per disegnare stringhe

La drawString() funzione è una utility per mostrare testo formattato sullo schermo. Usa argomenti variabili per formattare la stringa e poi la disegna centrata alle coordinate specificate con un font specifico.

void drawString(int16_t x, int16_t y, uint8_t font, const char* format, ...) {
  static char buf[64];
  va_list args;
  va_start(args, format);
  vsnprintf(buf, 64, format, args);
  tft.setTextDatum(MC_DATUM);
  tft.drawString(buf, x, y, font);
}

Funzione per disegnare la distanza

Nella drawDistance() funzione, prima otteniamo la distanza corrente usando getDistance(). Determiniamo poi il colore del testo in base alla distanza: verde per distanze sicure, giallo per attenzione e rosso per pericolo.

void drawDistance() {
  static char buf[32];
  int dist = getDistance();

  uint32_t color = TFT_GREEN;
  if (dist < minDist * 1.5) color = TFT_YELLOW;
  if (dist < minDist) color = TFT_RED;

  tft.setTextColor(color, TFT_BLACK);
  tft.setTextSize(3);
  drawString(tft.width() / 2, 120, 7, "   %d   ", dist);
}

Infine, mostriamo la distanza con un font grande sullo schermo. I tre screenshot seguenti mostrano tre distanze (in centimetri) nei tre colori differenti:

Screen shots of Display
Screenshot del display

Funzione per disegnare il pulsante

La drawButton() funzione gestisce la visualizzazione di un pulsante sullo schermo. Controlla l’input touch e aggiorna la soglia di distanza minima quando il pulsante viene premuto.

void drawButton() {
  static bool oldTouch = true;
  int cx = tft.width() / 2;
  int bw = 140, bh = 50, bt = 3;
  int x = cx - bw / 2, y = tft.height() - bh - 10;

  uint16_t tx, ty;
  bool isTouch = tft.getTouch(&tx, &ty);
  isTouch = isTouch && (abs(tx - cx) < bw / 2) && (ty > y);
  if (isTouch == oldTouch) return;
  oldTouch = isTouch;

  tft.fillSmoothRoundRect(x, y, bw, bh, 10, TFT_WHITE);
  if (isTouch) {
    tft.setTextColor(TFT_BLACK, TFT_WHITE, true);
    minDist = getDistance();
  } else {
    tft.fillSmoothRoundRect(x + bt, y + bt, bw - 2 * bt, bh - 2 * bt, 10, TFT_BLACK);
    tft.setTextColor(TFT_WHITE, TFT_BLACK, true);
  }
  drawString(cx, y + bh / 2, 1, "set");
  tft.setTextColor(TFT_SILVER, TFT_BLACK, true);
  drawString(cx, y - 30, 1, "  %d  ", minDist);
}

L’aspetto del pulsante cambia in base al fatto che sia premuto o meno. L’immagine sotto mostra il pulsante “set” quando non è premuto:

"set" button
“set” button

Setup Function

Nella setup() funzione inizializziamo il sensore e il display, impostiamo la rotazione del display e riempiamo lo schermo con uno sfondo nero.

void setup(void) {
  sensor.init();
  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);
}

Loop Function

Infine, il loop() funzione chiama continuamente drawDistance() e drawButton() per aggiornare il display con la distanza corrente e gestire le interazioni del pulsante. È aggiunto un breve ritardo per evitare aggiornamenti eccessivi.

void loop() {
  drawDistance();
  drawButton();
  delay(100);
}

Conclusioni

In questo tutorial hai imparato come costruire un sensore di parcheggio con il TOF10120 IR Laser Distance Sensor e un CrowPanel 3.5″ ESP32 Display.

Ci sono molte possibili estensioni a questo progetto. Ad esempio, potresti collegare un LED luminoso alla porta GPIO e attivarlo quando viene raggiunta la distanza minima.

Allo stesso modo, potresti usare la porta speaker del CrowPanel Display per far suonare un allarme se un oggetto si avvicina troppo. Esiste infatti un CrowPanel Pico 4.3″ Display basato su RP2040 che ha un buzzer integrato che potresti usare, oppure, naturalmente, puoi collegare un buzzer alla porta GPIO. Vedi il Scribble on CrowPanel Pico 4.3″ Display per maggiori dettagli.

Infine, invece del TOF10120 potresti usare altri sensori di distanza a infrarossi come il comune GP2Y0A710K0F o il GP2Y0A21YK0F. Anche comunemente usato è il sensore di distanza a ultrasuoni HC-SR04 che usa onde sonore per misurare la distanza. Tuttavia, i sensori laser IR sono più precisi e hanno una portata maggiore rispetto ai sensori a ultrasuoni.

Se hai domande sentiti libero di lasciarle nella sezione commenti.

Buona sperimentazione ; )

Paolo

Friday 9th of January 2026

Ciao Stefan ho apprezzato questo tuo progetto. Ti chiedo gentilmente un piccolo aiuto. Dispongo di un tft Crowpanel da 7 pollici, Vorrei disegnarci una tabella con LVGL in modo poi da aggiornarla con dei sensori, non riesco a farlo, gli esempi sul web non funzionano. Potresti gentilmente aiutarmi.

Stefan Maetschke

Saturday 7th of February 2026

Mi dispiace, ma non ho alcuna esperienza con LVGL.