Arduino – Pilotare uno o più display in I2C

Agosto 2015

L’impiego di un display con Arduino rende sicuramente un progetto più professionale e “user friendly”. E’ bene notare però che l’impiego di un classico display 16×2 basato su HD44780 ci porta via ben 6 ingressi/uscite digitali, quindi se stiamo utilizzando il classico Arduino UNO, che è dotato di soli 12 pin digitali, capite bene che rimarranno da spartire i restanti 6 a qualche pulsante o sensore, se escludiamo gli altri 6 analogici.

Fortunatamente è possibile pilotare lo stesso display con soli 2 fili (escludendo l’alimentazione 5V e gnd). La soluzione risiede nell’integrato PCF8574 che si occupa di pilotare il display mediante il protocollo I2C, comunicando con Arduino mediante la linea seriale, impiegando i pin SDA (Serial Data) e SCL (Serial Clock). Questi pin solitamente non vengono indicati esplicitamente sulla scheda, ma possono sostituire determinati pin classici in base al modello (vedi tabella).

SchedaPin I2C
Uno, Ethernet, Pro mini, NanoA4 (SDA), A5 (SCL)
Mega256020 (SDA), 21 (SCL)
Due20 (SDA), 21 (SCL), SDA1, SCL1
Leonardo, Micro, Yun2 (SDA), 3 (SCL)
Pro4 (SDA), 5 (SCL)
GemmaD0 (SDA), D1 (SCL)

Nulla di complicato, grazie alla libreria dedicata “LiquidCrystal_I2C”. È sufficiente collegare il display secondo lo schema, poi per pilotarlo i comandi sono gli stessi che si impiegavano per pilotarlo normalmente mediante la classica libreria “LiquidCrystal” integrata nell’ide di Arduino.

ATTENZIONE: si sono riscontrati problemi di compatibilità della libreria con versioni dell’IDE superiori alla 1.6.5, che si manifestano mostrando a display solo il primo carattere di una stringa stampata.

L’unica eccezione sta nell’inizializzazione del display (in questo caso viene associato alla variabile “lcd”), in cui invece di indicare i vari pin di Arduino a cui è collegato, ci si limita ad indicarne l’indirizzo I2C, il numero di colonne e righe, mediante l’istruzione:

LiquidCrystal_I2C lcd(indirizzo, colonne, righe);

Determinare l’indirizzo I2C del display

Nel mio caso era 0x20, ma l’indirizzo dipende dalla configurazione dei pin (1,2,3) sull’integrato, questo perché è possibile collegare più dispositivi I2C contemporaneamente, l’importante è che abbiano indirizzi diversi. Infatti configurando diversamente 2 o più integrati è possibile gestire contemporaneamente più display impiegando sempre e solo 2 fili.
Per la versione PCF8574 e PCF8574A si può ricorrere alla tabella per determinare l’indirizzo:

Altrimenti si può fare ricorso all’apposito sketch I2CScanner che, caricato sulla scheda Arduino a cui è stato collegato il tutto, si occupa di stampare sul monitor seriale gli indirizzi di tutti i dispositivi I2C collegati alla linea seriale di Arduino.

Gestire l’illuminazione del display

Se in un progetto volessimo introdurre una modalità di stand-by, per cui l’illuminazione del display si spegne dopo un certo tempo di inutilizzo, è possibile gestire tale via software, senza richiedere un ulteriore uscita a cui collegare il led integrato. Per fare ciò è sufficiente collegare il led del display con un transistor PNP (es. BC557) come indicato nello schema e richiamare le istruzioni:

lcd.setBacklight(1); → per accendere l’illuminazione
lcd.setBacklight(0); → per spegnerla

Notare bene che “lcd” va sostituito con la variabile associata al vostro display nel momento dell’inizializzazione.

Esempio

Il seguente listato determina un ciclo continuo in cui viene accesa l’illuminazione del display, stampata la stringa “Hello World”, cancellata e spenta l’illuminazione.

7,623 total views, 2 views today