ArduinoElettronica digitale

LCD liquidcrystal con Arduino

Gestire un display LCD tramite un Arduino

L’utilizzo di un display LCD con Arduino è molto comune nei progetti di elettronica, in quanto permette di visualizzare informazioni in tempo reale senza la necessità di un computer. In questo articolo vedremo come utilizzare un display LCD 16×2 (oppure 20×4) con il controller Hitachi HD44780, sfruttando la libreria LiquidCrystal e utilizzando solo 6 pin digitali di Arduino.

Come funziona il controller HD44780

I display LCD basati sul controller HD44780 sono composti da:

  • Una memoria DDRAM (Display Data RAM) dove vengono memorizzati i caratteri da visualizzare.
  • Una memoria CGROM (Character Generator ROM) che contiene i caratteri predefiniti.
  • Una memoria CGRAM (Character Generator RAM) per definire caratteri personalizzati.
  • Un cursore che può essere spostato per scrivere in posizioni specifiche.

Il display LCD può operare in due modalità di comunicazione:

  • 8-bit: invia dati e comandi con 8 linee dati (D0-D7).
  • 4-bit: invia dati in due blocchi da 4 bit, riducendo il numero di pin utilizzati.

La modalità 4-bit è la più comune, in quanto consente di risparmiare pin senza perdere funzionalità. Il controller HD44780 inoltre utilizza due registri principali per l’interazione con Arduino:

  • Registro Comandi (Instruction Register – IR): accetta comandi per configurare il display (es. pulire lo schermo, muovere il cursore).
  • Registro Dati (Data Register – DR): riceve i caratteri da visualizzare sul display.

I dati vengono inviati sui pin dati (D0-D7) in modalità 8-bit o solo su D4-D7 in modalità 4-bit. Per comunicare con il display, Arduino utilizza i seguenti segnali di controllo:

Pin LCD Funzione Descrizione
RS (Register Select) Seleziona il registro 0 = comando, 1 = dati
RW (Read/Write) Modalità di lettura/scrittura 0 = scrittura, 1 = lettura (di solito connesso a GND)
E (Enable) Abilita il trasferimento di dati e comandi (strobe) Un impulso HIGH → LOW: dati e comandi vengono acquisiti sul fronte di discesa

Collegamenti

Serviranno inoltre una resistenza 1/4W da 220Ω per limitare la corrente del LED di retroilluminazione e un potenziometro (o trimmer) da 10kΩ per regolare il contrasto. La corrente del LED vale I = (5 V − Vf) / R, dove Vf è la caduta di tensione del LED indicata nel datasheet del modulo: ad esempio con Vf = 3 V e R = 220 Ω si ottengono circa 9 mA. Molti moduli integrano già una resistenza in serie al pin A (spesso siglata R8 o R9 sul circuito stampato): verificalo prima di scegliere il valore. Nella seguente tabella vengono riportate le connessioni necessarie.

Pin LCD Collegamento
VSS GND
VDD +5Vdc
V0 cursore potenziometro per regolazione contrasto
RS pin 7 Arduino
RW GND (scrittura permanente)
E pin 6 Arduino
D4 pin 5 Arduino
D5 pin 4 Arduino
D6 pin 3 Arduino
D7 pin 2 Arduino
A +5Vdc tramite resistenza 220Ω 
K GND

 

La libreria LiquidCrystal

Per gestire il display LCD basato sul controller Hitachi HD44780 (o compatibili), è necessario utilizzare la libreria LiquidCrystal.h, una delle librerie standard di Arduino. Questa libreria consente di controllare il display in modalità 4-bit o 8-bit e offre funzioni per:

  • Scrivere testo
  • Muovere il cursore
  • Creare caratteri personalizzati
  • Scorrere il testo e mostrare o far lampeggiare il cursore

La libreria LiquidCrystal non ha funzioni per la retroilluminazione: per accenderla e spegnerla da software serve un circuito dedicato, come il transistor dell’Esempio 2 (le funzioni backlight() e noBacklight() appartengono invece alla libreria LiquidCrystal_I2C, usata con i moduli I2C).

Passaggi per configurare il display:

  • Inclusione della libreria:
    Includere la libreria con #include <LiquidCrystal.h>.
  • Definizione dei pin digitali:
    Collegare i pin RS, E, D4, D5, D6 e D7 ai pin di Arduino.
  • Inizializzazione del display:
    Utilizzare lcd.begin(16, 2) per impostare un display da 16 colonne e 2 righe.
  • Scrittura di testo:
    Impiegare lcd.print(“Hello, Arduino!”) per visualizzare un messaggio sulla prima riga.
  • Cambio di riga:
    Usare lcd.setCursor(0, 1) per spostare il cursore sulla seconda riga.

Per progetti più complessi, si può valutare l’uso di un modulo I2C, che riduce il numero di connessioni necessarie e facilita la gestione del display.

Esempio 1: collegamento base

Cablaggio e semplice attivazione di un LCD con regolazione contrasto. Backlight (retroilluminazione sempre attiva).Schema di collegamento di un LCD 16x2 HD44780 ad Arduino in modalità 4 bit con trimmer di contrasto

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // impostazione lcd

void setup() {
  lcd.begin(16, 2);
  lcd.print("MST-TUTORIAL");   
}

void loop() {
 // ........
}

Esempio 2: retroilluminazione comandata da transistor

Cablaggio di un LCD con regolazione contrasto e controllo attivazione della backlight tramite un transistor BJT NPN pilotato dal pin digitale 8 (vedi Transistor BJT NPN come interruttore). Va bene un NPN di segnale come BC547 o 2N2222, con una resistenza di base di circa 1 kΩ tra il pin di Arduino e la base: la corrente di base, circa 4 mA, è sufficiente a saturare il transistor con la corrente della retroilluminazione e resta ben entro i limiti del pin.

Schema LCD 16x2 con retroilluminazione comandata da transistor NPN sul pin 8 di Arduino

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // impostazione lcd
const int backlight = 8; // pin di gestione retroilluminazione

void setup() {
  pinMode(backlight,OUTPUT);
  lcd.begin(16, 2);
  
  lcd.print("MST-TUTORIAL");   
}

void loop() {
  digitalWrite(backlight,HIGH); // backlight ON
  delay(1000);
  
  digitalWrite(backlight,LOW);  // backlight OFF
  delay(1000);
}

Animazione della retroilluminazione del display LCD che si accende e si spegne ogni secondo

Il pin 8 della UNO non supporta il PWM: per regolare la luminosità invece di accendere e spegnere la retroilluminazione si può collegare la resistenza di base a un pin PWM (ad esempio il 9) e usare analogWrite(9, valore) con valori da 0 a 255.

Funzioni avanzate della libreria

Oltre a print() e setCursor(), LiquidCrystal offre funzioni per creare caratteri personalizzati (fino a 8, memorizzati nella CGRAM), far scorrere il testo e gestire il cursore:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

// carattere personalizzato 5x8: un cuore
byte cuore[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
  0b00000
};

void setup() {
  lcd.begin(16, 2);
  lcd.createChar(0, cuore);   // salva il carattere nella posizione 0 della CGRAM
  lcd.setCursor(0, 0);        // dopo createChar() riposizionare il cursore
  lcd.print("MST-TUTORIAL ");
  lcd.write(byte(0));         // stampa il carattere personalizzato
  lcd.setCursor(0, 1);
  lcd.cursor();               // mostra il cursore (trattino basso)
  lcd.blink();                // cursore lampeggiante a blocco
}

void loop() {
  delay(3000);
  for (int i = 0; i < 16; i++) {
    lcd.scrollDisplayLeft();  // sposta tutto il contenuto di una colonna a sinistra
    delay(300);
  }
  for (int i = 0; i < 16; i++) {
    lcd.scrollDisplayRight(); // e lo riporta nella posizione iniziale
    delay(300);
  }
}

Con noCursor() e noBlink() si nasconde il cursore, con clear() si cancella il display e con noDisplay()/display() si spegne e riaccende il contenuto senza perdere i dati.

LCD con modulo I2C

I moduli adattatori I2C basati sul PCF8574, saldati sul retro del display, riducono i collegamenti a quattro fili (VCC, GND, SDA, SCL) e si gestiscono con la libreria LiquidCrystal_I2C, che include anche il comando della retroilluminazione (attenzione: nel Gestore librerie esistono più librerie con questo nome e con funzioni leggermente diverse, quindi gli esempi vanno adattati a quella installata; in alternativa si può usare la libreria hd44780); l’indirizzo I2C più comune è 0x27 (0x3F per le versioni con PCF8574A). Esempi pratici: ATtiny85 + I2C + LCD e LCD I2C 16×2 20×4 con Raspberry PI.

Admin | MST-Tutorial

Appassionato di elettronica, elettrotecnica e programmazione. Fondatore di MST-Tutorial, condivido con entusiasmo conoscenze, esperienze e progetti legati all’innovazione tecnologica, con l’obiettivo di rendere accessibili concetti tecnici complessi attraverso tutorial chiari e pratici.

Articoli Correlati

Pulsante per tornare all'inizio