Il Display LCD 20×04 è uno strumento versatile per mostrare output di sensori o mostrare contenuti testuali, semplice da programmare in ESPHome e da integrare in Home Assistant
In questo articolo vedremo come collegare e configurare un display LCD 20×4 con interfaccia I2C a una scheda ESP32 utilizzando ESPHome. Questo tipo di display è ideale per progetti domotici e permette di visualizzare fino a quattro righe di testo. Grazie all’interfaccia I2C, il cablaggio è ridotto al minimo, rendendo l’installazione semplice e ordinata. Utilizzeremo ESPHome per integrare il display in Home Assistant o altri ecosistemi compatibili.
- Acquistalo su Amazon: https://amzn.to/4lTPvw6
- Acquistalo su Aliexpress: https://s.click.aliexpress.com/e/_ookFS3l
Specifiche tecniche
Il display LCD con interfaccia I2C è una delle soluzioni più diffuse per la visualizzazione di dati testuali nei progetti basati su microcontrollori. Le versioni più comuni sono il 16×02 e il 20×04, sigle che indicano rispettivamente la capacità di mostrare 16 colonne su 2 righe (16×02) oppure 20 colonne su 4 righe (20×04). Entrambi utilizzano lo stesso controller HD44780, il che li rende compatibili con le stesse librerie software e logiche di controllo. La differenza principale sta nel numero di caratteri che possono essere visualizzati contemporaneamente: 32 per il 1602 e ben 80 per il 2004, rendendo quest’ultimo più adatto per visualizzare più informazioni senza dover scorrere il contenuto.

Dal punto di vista elettrico, questi display funzionano solitamente a 5V, anche se nella maggior parte dei casi sono compatibili con segnali logici a 3.3V, come quelli dell’ESP32. Per semplificare il cablaggio, è spesso presente un modulo adattatore I2C basato su chip come il PCF8574, che converte la comunicazione da parallela (necessaria al controller HD44780) a seriale su bus I2C. Questo riduce le connessioni a soli quattro fili: VCC, GND, SDA e SCL. L’indirizzo I2C di default è solitamente 0x27 o 0x3F, ma può variare a seconda del modulo; è possibile verificarlo con uno scanner I2C prima di configurarlo nel software.

La visibilità del display è garantita da una retroilluminazione LED, che può essere accesa o spenta tramite un ponticello o controllata via software, e da un potenziometro di contrasto montato sul modulo, che regola la nitidezza dei caratteri. I caratteri stessi sono disegnati in una griglia 5×8 pixel (5 colonne per 8 righe), e sono disponibili caratteri ASCII estesi e personalizzabili. Entrambe le versioni del display possono memorizzare fino a 8 caratteri custom definiti dall’utente, una funzionalità utile per creare simboli, icone o lettere speciali.

Dal punto di vista prestazionale, il display 20×04 ha un ingombro leggermente maggiore, ma rappresenta la scelta ideale in scenari dove è necessario visualizzare molte informazioni contemporaneamente, come nei pannelli di stato, dashboard locali o sistemi domotici. La versione 1602, più compatta, è invece preferibile in progetti con vincoli di spazio o di consumo energetico.

Collegamenti
Per collegare correttamente il display LCD 20×4 all’ESP32 tramite interfaccia I2C, è necessario identificare i pin SDA e SCL sulla scheda ESP32, che variano in base al modello ma comunemente corrispondono ai pin GPIO21 (SDA) e GPIO23 (SCL). I pin VCC e GND del display vanno collegati rispettivamente ai 5V e al GND dell’ESP32. È importante verificare che l’indirizzo I2C del modulo, di default spesso 0x27 o 0x3F, sia corretto; questo può essere fatto tramite uno scanner I2C.
Codice
Andiamo a creare un nuovo device su ESPHome e chiamiamolo LCD. Saltiamo per il momento la connessione e selezioniamo la scheda che dobbiamo programmare (ESP32).

Una volta creato, clicchiamo su EDIT per modificare il codice.

Questo è il codice per configurare una ESP32 per scrivere un testo o inviare dati al display da Home Assistant tramite ESPHome. Il dispositivo sarà accessibile in rete tramite Wi-Fi e potrà essere aggiornato via OTA (Over-The-Air) senza bisogno di connessione fisica. Potete scaricarlo a questo LINK.
All’inizio, il codice definisce il nome del dispositivo, sia quello tecnico (“lcd”) che quello più leggibile per Home Assistant (“LCD”).
esphome:
name: lcd
friendly_name: LCD
Poi si specifica che il microcontrollore utilizzato è un ESP32 e che il firmware verrà compilato usando il framework Arduino, che è più semplice e supportato rispetto ad altre alternative come ESP-IDF.
esp32:
board: esp32dev
framework:
type: arduino
Il codice attiva il logger, che serve a registrare gli eventi e inviare messaggi di debug. Inoltre, viene attivata l’API di ESPHome, che permette a Home Assistant di comunicare con il dispositivo in modo sicuro grazie a una chiave di crittografia.
logger:
api:
encryption:
key: "ReFbnDC05JxxJZVsb86EIQnaYrwBzL25AK+1/pgCgvY="
Per evitare di dover collegare il dispositivo fisicamente ogni volta che si vuole aggiornare il firmware, viene attivata la modalità OTA (Over-The-Air), con una password di sicurezza. Inoltre, è presente la funzione captive portal, che permette di riconfigurare il Wi-Fi direttamente da un browser in caso di problemi di connessione.
ota:
- platform: esphome
password: "2f109b22b920691a02f9ec73d9c7516a"
captive_portal:
Per collegarsi alla rete, il codice usa le credenziali Wi-Fi salvate nei secrets di ESPHome (file separato non visibile nel codice). Se la connessione fallisce, il dispositivo crea un hotspot Wi-Fi di emergenza (“Lcd Fallback Hotspot”) con una password predefinita, in modo che sia possibile riconfigurarlo.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Lcd Fallback Hotspot"
password: "NGMso0wk9jQZ"
Il Display LCDsfrutta l’interfaccia I2C, pertanto dichiariamo che è il pin SDA collegato al pin GPIO21 dell’ESP32, il pin SCL collegato al pin GPIO23, impostando la funziona scan come true.
i2c:
sda: GPIO21
scl: GPIO23
scan: true
id: bus_a
Configuriamo il Display, specificando che si tratta di un LCD basato su comunicazione I2C e chip PCF8574, indicando che ha 20 colonne e 4 righe. L’indirizzo per la comunicazione è 0x27, mentre con la funziona lambda scriviamo partendo dalla prima riga e prima colonna “Fattelo da solo” e poi scrivendo alla terza riga “iscriviti al canale”.
display:
- platform: lcd_pcf8574
dimensions: 20x4
address: 0x27 # Cambia in 0x3F
update_interval: 5s
lambda: |-
it.print(0, 0, "Fattelo da solo");
it.print(0, 2, "iscriviti al canale");
Salvate e verificate con Validate se il codice è stato scritto correttamente.

Collegate la ESP32 al computer tramite cavo USB, e cliccate su Install.

Conclusa l’installazione, integriamo il device su Home Assistant. Dovrebbe essere arrivata una notifica sulla plancia. In ogni caso, per integrarlo andate su Impostazioni -> Dispositivi e servizi e apparirà il dispositivo LCD da integrare.

Autorizziamo la configurazione e vedremo apparire la scritta sul nostro display LCD.

Volendo possiamo anche creare un testo scorrevole, modificando solo la parte relativa al display. Aggiungiamo un intervallo di tempo di 500 millisecondi tra uno spostamento e l’altro del testo ed una variabile intera statica, per mantenere il valore tra un aggiornamento e l’altro; poi con lambda riscriviamo la farse “Fattelo da solo” come abbiamo fatto prima, per mantenere così questo testo fisso, mentre nella parte che sarà scorrevole generiamo una frase lunga con spazi extra alla fine per creare una pausa visiva quando finisce il testo (questo migliora l’effetto di scorrimento continuo). Stampiamo una linea di testo di 20 caratteri, che si aggiornerà in base allo spostamento del testo, infatti incrementando la variabile intera scroll2 si sposterà il testo ogni mezzo secondo. Quando arriva alla fine della stringa, riparte da capo. Potete scaricare il codice completo a questo LINK.
display:
- platform: lcd_pcf8574
dimensions: 20x4
address: 0x27
update_interval: 500ms
lambda: |-
static int scroll2 = 0;
// Riga fissa (prima riga - index 0)
it.print(0, 0, "Fattelo da solo");
// Riga scorrevole (terza riga - index 2)
std::string line2 = "iscriviti al canale "; // Aggiungi spazi per pausa visiva
it.print(0, 2, line2.substr(scroll2, 20).c_str());
scroll2++;
if (scroll2 >= line2.length() - 1) scroll2 = 0;
Ricarichiamo il codice e vedremo sul display il testo che scorre.

In ultimo, abbiamo collegato un sensore DHT22 per misurare la temperatura e l’umidità ambientali e stamparle sul Display LCD. Come prima, modifichiamo solo la parte di codice del display, aggiungendo la parte relativa al sensore DHT22, che abbiamo spiegato quando abbiamo esaminato il sensore DHT11 [LINK]. Il codice completo lo trovare a questo LINK.I collegamenti sono i seguenti:

Sempre tramite la funzione lambda stampiamo nella prima riga l’intestazione del progetto di esempio (Mini Stazione), mentre nella seconda riga il rilevamento della temperatura. Alla fine del testo, stampiamo il valore rilevato dal sensore, identificato in temp_sensor. In pratica, ogni volta che il sensore compie una misurazione, il valore viene stampato in una variabile (ID) in modo che venga mostrato sul display. Ripetiamo lo stesso discorso per l’umidità alla terza riga, aggiornando il display ogni secondo.
display:
- platform: lcd_pcf8574
dimensions: 20x4
address: 0x27 # Modifica se necessario (può essere anche 0x3F)
update_interval: 1s
lambda: |-
it.print(0, 0, "Mini Stazione");
it.print(0, 1, "Temperatura:");
it.printf(12, 1, "%.1f C", id(temp_sensor).state);
it.print(0, 2, "Umidita':");
it.printf(12, 2, "%.1f %%", id(humidity_sensor).state);
sensor:
- platform: dht
pin: GPIO4
temperature:
name: "Temperatura"
id: temp_sensor
humidity:
name: "Umidità"
id: humidity_sensor
model: DHT22
update_interval: 2s
Anche in questo caso, salviamo poi ricarichiamo il codice e vedremo sul display i valori rilevati dal sensore DHT22.

