Componenti · 5 min di lettura

Come usare un display LCD I2C (16x2) con Arduino, ESP32 e Pico

Come si collega un display LCD I2C 16x2 ad Arduino? Collegamento a 4 fili, trovare l'indirizzo I2C (0x27, 0x3F), libreria LiquidCrystal_I2C, regolazione del contrasto, caratteri personalizzati e testo scorrevole.

Il display LCD 16x2, che mostra 2 righe da 16 caratteri, è il display più diffuso nel mondo Arduino. Si usa per mostrare misure come temperatura e distanza, menu, orologi e punteggi di giochi. Il display ha 16 pin e da solo richiede almeno 6 pin digitali; il piccolo modulo I2C saldato sul retro riduce il tutto a soli 2 fili dati. In questo articolo vedrai passo passo come collegare un LCD I2C, trovarne l'indirizzo e scriverci quello che vuoi.

Display LCD 16x2 con modulo I2C
LCD 16x2 con modulo I2C: grazie alla piccola scheda sul retro si collega con soli 4 fili.

Come funziona un display LCD?

Questi display funzionano con un chip di controllo chiamato HD44780. Ogni carattere viene disegnato in una piccola casella di 5x8 pixel e il chip contiene una tabella di caratteri già pronta con lettere, cifre e alcuni simboli. Arduino invia soltanto il comando "scrivi questa lettera in questa posizione"; trasformare la lettera in pixel è compito del display. La retroilluminazione a LED rende il testo leggibile al buio, mentre lo strato a cristalli liquidi forma il testo oscurando i pixel.

Cos'è l'I2C e perché semplifica tutto?

L'I2C è un modo per far comunicare più dispositivi con due soli fili: SDA trasporta i dati e SCL il segnale di clock. Ogni dispositivo ha il proprio indirizzo e Arduino chiama quello che gli serve tramite l'indirizzo. I moduli LCD usano di solito l'indirizzo 0x27 o 0x3F. Sugli stessi due fili si possono collegare anche un modulo orologio, un display OLED e sensori come il BME280: finché gli indirizzi sono diversi, funzionano tutti insieme.

Modulo adattatore I2C PCF8574 per LCD
Modulo I2C con PCF8574: il trimmer blu regola il contrasto e il ponticello accende o spegne la retroilluminazione.

Il chip PCF8574 del modulo converte i comandi che arrivano via I2C negli 8 segnali paralleli che il display si aspetta. Puoi usare il display anche senza modulo I2C, ma in quel caso servono 6 pin, un potenziometro e molti fili. Il modulo fa risparmiare pin e semplifica il circuito.

Caratteristiche tecniche

CaratteristicaValore
Visualizzazione16 colonne × 2 righe di caratteri
Dimensione del carattere5 × 8 pixel
Chip di controlloHD44780 (o compatibile)
Adattatore I2CPCF8574 / PCF8574A
Indirizzo predefinito0x27 (PCF8574) o 0x3F (PCF8574A)
Alimentazione5 V, circa 20–30 mA con retroilluminazione accesa
CollegamentiGND, VCC, SDA, SCL

Collegamento dell'LCD I2C: Arduino, ESP32 e Pico

Su tutte le schede si usano gli stessi quattro fili; cambia solo su quali pin si trovano SDA e SCL. Per vedere i pin I2C della tua scheda, consulta lo strumento Pinout.

Pin dell'LCDArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5V)VBUS (5V)
SDAA420GPIO 21GP4
SCLA521GPIO 22GP5
Il modulo I2C porta le linee SDA e SCL al proprio VCC, cioè a 5 V. I pin di ESP32 e Pico lavorano a 3,3 V. Anche se in pratica di solito funziona, la soluzione più sicura è inserire un convertitore di livello I2C bidirezionale, oppure rimuovere le resistenze di pull-up del modulo e tirare le linee a 3,3 V.

Trovare l'indirizzo I2C: lo scanner

Se non conosci l'indirizzo del tuo display, carica il codice qui sotto. Prova tutti gli indirizzi da 1 a 126 e scrive nel Monitor seriale l'indirizzo di ogni dispositivo che risponde. Userai questo indirizzo quando configuri il display.

Arduino (C++)
1#include <Wire.h>
2
3void setup() {
4  Wire.begin();
5  Serial.begin(9600);
6  Serial.println("I2C taranıyor / scanning...");
7  for (byte addr = 1; addr < 127; addr++) {
8    Wire.beginTransmission(addr);
9    if (Wire.endTransmission() == 0) {   // cihaz cevap verdi / device answered
10      Serial.print("Bulundu / found: 0x");
11      Serial.println(addr, HEX);
12    }
13  }
14}
15
16void loop() {
17}

Installare la libreria e scrivere del testo

Nel Gestore librerie cerca LiquidCrystal I2C e installa la libreria di Frank de Brabander. Il codice qui sotto scrive un saluto sulla prima riga e, sulla seconda, i secondi trascorsi da quando Arduino si è acceso.

Arduino (C++)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);  // adres, sütun, satır / address, columns, rows
5
6void setup() {
7  lcd.init();
8  lcd.backlight();               // arka ışığı aç / backlight on
9  lcd.setCursor(0, 0);           // sütun 0, satır 0 / column 0, row 0
10  lcd.print("Merhaba Dunya!");
11}
12
13void loop() {
14  lcd.setCursor(0, 1);           // ikinci satır / second row
15  lcd.print("Sure: ");
16  lcd.print(millis() / 1000);    // saniye / seconds
17  lcd.print(" sn   ");           // eski rakamları sil / clear old digits
18  delay(200);
19}
Se il display si accende ma non mostra testo, o la riga superiore mostra solo quadratini pieni, gira lentamente il trimmer blu sul retro del modulo con un piccolo cacciavite. È la regolazione del contrasto e risolve la maggior parte dei problemi del tipo "il mio display non funziona".

I comandi LCD più usati

ComandoCosa fa
lcd.init()Inizializza il display; si chiama una volta in setup().
lcd.backlight() / lcd.noBacklight()Accende o spegne la retroilluminazione.
lcd.setCursor(colonna, riga)Sceglie dove inizia il testo; si conta da 0.
lcd.print(valore)Scrive testo o un numero.
lcd.clear()Cancella tutto il display e riporta il cursore all'inizio.
lcd.scrollDisplayLeft()Sposta tutto il contenuto di un carattere a sinistra.
lcd.blink() / lcd.cursor()Mostra un cursore lampeggiante o sottolineato.
lcd.createChar(n, array)Salva un carattere personalizzato nelle posizioni 0–7.

Testo scorrevole

Per mostrare un testo più lungo di 16 caratteri puoi far scorrere il display. Il codice qui sotto scrive il testo e lo sposta a sinistra ogni 300 millisecondi, così un messaggio lungo scorre sullo schermo come un'insegna.

Arduino (C++)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);
5
6void setup() {
7  lcd.init();
8  lcd.backlight();
9  lcd.print("BlueGrays ile elektronik ogren");  // 16 karakterden uzun / longer than 16 chars
10}
11
12void loop() {
13  lcd.scrollDisplayLeft();   // bir adım sola / one step left
14  delay(300);
15}

Caratteri personalizzati e lettere accentate

La tabella dei caratteri dell'HD44780 non contiene lettere accentate come à, è, ì, ò, ù; se provi a scriverle vedrai simboli senza senso. La soluzione è definire fino a 8 caratteri personalizzati da 5x8 pixel. Ogni riga si scrive come un byte e i bit a 1 sono i pixel accesi. L'esempio qui sotto disegna un cuore; allo stesso modo puoi disegnare qualsiasi lettera accentata.

Arduino (C++)
1byte heart[8] = {
2  0b00000,
3  0b01010,
4  0b11111,
5  0b11111,
6  0b01110,
7  0b00100,
8  0b00000,
9  0b00000
10};
11
12// setup() içinde / inside setup()
13lcd.createChar(0, heart);   // 0. yuvaya kaydet / store in slot 0
14lcd.setCursor(15, 0);
15lcd.write(byte(0));         // kalbi göster / show the heart

LCD I2C con ESP32 e Raspberry Pi Pico

Sull'ESP32 funzionano lo stesso codice Arduino e la stessa libreria; Wire.begin() usa per impostazione predefinita GPIO 21 (SDA) e GPIO 22 (SCL). Per usare altri pin scrivi Wire.begin(SDA, SCL). Sul Raspberry Pi Pico con MicroPython copia sul Pico due piccoli file chiamati lcd_api.py e pico_i2c_lcd.py e usali così:

MicroPython
1from machine import I2C, Pin
2from pico_i2c_lcd import I2cLcd   # Pico'ya kopyalanan dosya / file copied to the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5addr = i2c.scan()[0]              # ilk bulunan adres / first found address
6lcd = I2cLcd(i2c, addr, 2, 16)    # 2 satır, 16 sütun / 2 rows, 16 columns
7
8lcd.putstr("Merhaba Pico!")
9lcd.move_to(0, 1)                 # sütun 0, satır 1 / column 0, row 1
10lcd.putstr("BlueGrays")

Idee di progetti con LCD I2C

  • Termometro digitale: mostra temperatura e umidità sul display; per il sensore vedi Sensore di temperatura e umidità DHT11.
  • Indicatore di distanza: mostra in centimetri la distanza misurata con un HC-SR04; dettagli in Sensore di distanza HC-SR04.
  • Voltmetro digitale: mostra la tensione letta su un pin analogico.
  • Serratura a codice: mostra con asterischi il codice digitato su un tastierino.
  • Sistema di menu: scorri le opzioni sul display con un potenziometro o due pulsanti.
  • Minigioco: fai schivare gli ostacoli a un corridore disegnato con caratteri personalizzati.

Errori comuni e come risolverli

  • Display acceso ma senza testo: il contrasto non è regolato; gira il trimmer.
  • Quadratini pieni sulla riga superiore: il display è alimentato ma non inizializzato; l'indirizzo potrebbe essere sbagliato, SDA e SCL invertiti o manca lcd.init().
  • Indirizzo sbagliato: nel codice c'è 0x27 ma il display è 0x3F; trova l'indirizzo reale con lo scanner.
  • Restano cifre vecchie: un numero che scende da 100 a 99 appare come 990; scrivi qualche spazio dopo il numero. Anche lcd.clear() funziona, ma è lento e fa sfarfallare il display se lo chiami spesso nel loop.
  • Lettere accentate illeggibili: non sono nella tabella del display; definisci caratteri personalizzati o evitale.
  • Testo che si corrompe a caso: fili lunghi e allentati o componenti rumorosi come i motori possono disturbare il bus I2C; usa fili corti e alimenta i motori separatamente.

Abbinare il display a un sensore è il modo più rapido per realizzare il tuo primo vero progetto. Nell'app BlueGrays trovi decine di progetti con LCD I2C, con schemi e codice pronto all'uso; e per cambiare i valori con una manopola ti sarà utile Cos'è un potenziometro?

Domande frequenti

Perché il mio LCD mostra solo quadratini?

I quadratini pieni sulla riga superiore indicano che il display è alimentato ma non è stato inizializzato. L'indirizzo potrebbe essere sbagliato, SDA e SCL invertiti o il contrasto troppo alto. Prima verifica l'indirizzo con lo scanner I2C, poi regola il trimmer.

L'indirizzo del mio LCD I2C è 0x27 o 0x3F?

I moduli con chip PCF8574 usano di solito 0x27, quelli con PCF8574A 0x3F. Il modo più semplice per saperlo è lo scanner I2C; poi basta modificare il codice in LiquidCrystal_I2C lcd(0x3F, 16, 2).

Si possono collegare due LCD allo stesso Arduino?

Sì. Unendo con lo stagno le piazzole A0, A1 e A2 del modulo si cambia l'indirizzo, così fino a 8 LCD possono condividere gli stessi due fili. Nel codice definisci un oggetto per ogni display con il suo indirizzo.

Lo stesso codice funziona per un LCD 20x4?

Sì. Basta cambiare la dichiarazione in LiquidCrystal_I2C lcd(0x27, 20, 4); le righe vanno da 0 a 3 e le colonne da 0 a 19.

Come scrivo le lettere accentate su un LCD?

La tabella integrata del display non contiene à, è, ì, ò, ù. Disegna ciascuna lettera come carattere personalizzato da 5x8 pixel con lcd.createChar() e scrivila con lcd.write(). Ricorda che si possono definire al massimo 8 caratteri personalizzati alla volta.

Meglio un display LCD o OLED?

L'LCD è economico, leggibile al sole e ideale per testo e numeri. L'OLED è più piccolo, molto contrastato e può disegnare grafica e icone, ma può lasciare segni se mostra a lungo la stessa immagine. Scegli l'LCD per il testo e l'OLED per la grafica.

Vedi tutti i progetti
Utilizzo dello schermo LCD con I2C
#32Principiante
Premium

Utilizzo dello schermo LCD con I2C

Grazie al modulo I2C, il progetto che stampa messaggi controllando lo schermo LCD con solo 2 cavi (SDA, SCL). Insegna come salvare i pin con il protocollo I2C.

4.8(53)
69
Stampa del messaggio su schermo LCD 2x16
#29Avanzato
Premium

Stampa del messaggio su schermo LCD 2x16

Progetto che stampa carattere per carattere su uno schermo LCD 2x16 e visualizza un messaggio ciclico cancellando lo schermo. La libreria LCD insegna l'uso delle funzioni setCursor e print.

4.6(37)
51
Scrittura del moltiplicatore destro e sinistro con LCD
#30Avanzato
Premium

Scrittura del moltiplicatore destro e sinistro con LCD

Progetto che crea un effetto di animazione che colpisce le pareti spostando il testo a destra e a sinistra sullo schermo LCD. Insegna il posizionamento dinamico del setCursore e la logica di animazion

4.5(29)
40
Schermo LCD I2C per ESP32 (16x2)
#119Intermedio
Premium

Schermo LCD I2C per ESP32 (16x2)

In questo progetto visualizziamo del testo collegando un display LCD a 16x2 caratteri all'ESP32 tramite il protocollo I2C. Grazie all'I2C possiamo controllare il display utilizzando solo 2 pin di dati (SDA e SCL); si elimina così lo spreco dei 6+ pin tipici del collegamento parallelo classico. Il codice stampa un messaggio fisso sulla prima riga e un contatore che aumenta ogni secondo sulla seconda riga. Inoltre, all'inizio, eseguendo lo scanner I2C, stampiamo l'indirizzo del display sul Serial

4.9(22)
39
Temperatura e umidità con DHT11
#55Intermedio

Temperatura e umidità con DHT11

Progetto che misura il valore della temperatura e dell'umidità ambientale con un sensore DHT11 e lo visualizza su uno schermo LCD I2C. Insegna l'uso del sensore digitale di temperatura/umidità.

4.7(47)
60
Voltmetro digitale con display LCD
#56Intermedio
Premium

Voltmetro digitale con display LCD

Progetto di voltmetro digitale che mostra il risultato sullo schermo LCD I2C misurando la tensione nell'intervallo 0-55V con un circuito divisore di tensione. Insegna la formula del partitore di tensi

4.5(27)
36
Tastiera 4x4 Display LCD Applicazione password
#64Avanzato
Premium

Tastiera 4x4 Display LCD Applicazione password

Progetto di sicurezza che apre la porta con un servo se è corretta l'immissione di una password con una tastiera 4x4 e accende un LED rosso se è errata. Insegna il confronto delle password e l'integra

4.8(57)
75
Arduino LCD Runner Game
#98Intermedio
Premium

Arduino LCD Runner Game

Gioco endless runner a scorrimento laterale su schermo LCD a 6x2 caratteri. L'eroe corre automaticamente, il giocatore salta gli ostacoli premendo il pulsante. Sulla riga superiore e inferiore compaiono ostacoli casuali. Il cicalino passivo riproduce la melodia di apertura, il suono di salto, il suono di celebrazione dei 50 punti e la melodia di fine gioco. All'avvio viene visualizzata la schermata iniziale "BlueGrays - Arduino Projects". Il punteggio viene aggiornato istantaneamente nell'angolo

4.7(31)
53

Impara a collegare un LCD 16x2 con modulo I2C usando solo 4 fili, a trovarne l'indirizzo, a scrivere testo e numeri, a far scorrere i messaggi e a disegnare i tuoi simboli.

Come usare un display LCD I2C (16x2) con Arduino, ESP32 e Pico | BlueGrays