In questi giorni sto realizzando con alcuni allievi della mia classe 5′ un misuratore di temperatura che utilizza un display LCD 16×2 (16 colonne e 2 righe) compatibile con i driver dell’Hitachi HD44780. Poiché la quantità di collegamenti è elevata ho deciso di realizzare questo post per non dimenticare ed avere traccia per le future realizzazioni in classe, in modo che possa essere di riferimento per gli allievi.
Per qualsiasi dettaglio fate riferimento al tutorial che trovate sul sito Arduino.cc: LiquidCrystal – “Hello World!”
Per poter pilotare il display avete necessità di utilizzare la libreria LiquidCrystal.h che vi permette di comunicare in modalità 4 bit o 8 bit, questo vuol dire che per la trasmissione dati possono essere utilizzate 4 o 8 linee di controllo a queste si aggiungono le due linee di controllo: Register Select (RS) e Enable (E) e alla linea opzionale Read/Write (RW).
In classe ho utilizzato la modalità a 4 bit, la stessa del tutorial sul sito Arduino, ciò comporta l’utilizzo di 6 uscite digitali sulla scheda Arduino.
Disponiamo di una serie di display economici: Xiamen GDM 1602K (seguite il link per prelevare il datasheet).
Dall’immagine tratta dal datasheet, notate che il display è dotato di 16 pin e la numerazione parte da sinistra.
Nella tabella allegata trovate le funzioni di ogni piedino.
Ricordate che la piedinatura di questi display è comune alla maggior parte degli LCD 16 x 2 standard Hitachi HD44780, ma potreste trovare qualche variazione tipicamente accade per i pin 15 e 16 che potrebbero essere al posto dei pin 1 e 2 (non è il caso di questo display).
In ogni caso come potete vedere dalle fotografie (sopra) il display reca sul lato piste, una legenda con il riferimento piedino -> funzione quindi, non potete sbagliarvi.
Funzione dei piedini
- Pin 1: Vss – collegato al GND
- Pin 2: VDD – collegato a +5V
- Pin 3: V0 – controllo del contrasto dei caratteri. In genere viene collegato ad un potenziometro o trimmer in configurazione partitore di tensione in modo che possiate applicare sul Pin 3 una tensione che varia da 0 a +5V e al variare della tensione varia il contrasto.
- Pin 4: RS segnale di selezione registro – per selezionare il registro nel quale registrare ciò che appare sul display oppure selezionare il registro di funzionamento in cui viene memorizzata di volta in volta l’istruzione da eseguire per il funzionamento dell’LCD
- Pin 5: segnale Read/Write – per selezionare la modalità di funzionamento: lettura/scrittura – collegato a GND
- Pin 6: segnale Enable (E) – per abilitare la scrittura nei registri
- Pin 7 al Pin 14: linee dati che si inviano o si ricebono dai registri del display. Un valore HIGH (H) indica scrittura (WRITE) del bit nel registro del display, un valore LOW (L) indica un valore letto (READ) da un registro.
- Pin 15: A (Anodo) – piedino a cui collegare una tensione positiva (nel caso del display descritto +4,2V) che serve per la retroilluminazione del display.
- Pin 16: K (Catodo) – piedino da collegare a GND per consentire la retroilluminazione.
I collegamenti realizzati sono identici a quelli che trovate sul tutorial: LiquidCrystal – “Hello World!” dove al posto del potenziometro abbiamo utilizzato un trimmer:
Codice:
/* uso del display LCD 16x2 standard Hitachi HD44780 Circuito: * pin RS collegato al pin digitale 12 * pin E (Enable) collegato al pin digitale 11 * pin D4 collegato al pin digitale 5 * pin D5 collegato al pin digitale 4 * pin D6 collegato al pin digitale 3 * pin D7 collegato al pin digitale 2 * pin R/W collegato al GND * pin 1 e pin 4 collegati a GND * pin 2 collegato a +Vcc * centrale del potenziometro/trimmer da 10 KOhm collegato al pin 3 del'LCD * pin SX potenziometro/trimmer collegato a +Vcc * pin DX potenziometro/trimmer collegato a GND * i pin SX e DX del potenziometro/trimmer possono essere interscambiati */ // includere la libreria: #include <LiquidCrystal.h> /* Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino */ LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { //impostiamo il numero di colonne ed il numero di righe di lcd lcd.begin(16, 2); // Visualizzo il messaggio sul display lcd.print("Salve mondo!"); } void loop() { // posiziona il cursore in colonna 0 e linea 1 // (nota: la linea 1 e la seconda linea, poichè si conta incominciando da 0): lcd.setCursor(0, 1); // stampa il numero di secondi dall'ultimo reset lcd.print(millis()/1000); }
Nel caso in cui colleghiamo il Pin 15 a +5V e il Pin 16 a GND abbiamo la retroilluminazione:
Bella spiegazione, e dato che ho Luigino con un termistore per leggere la Temperatura mi piacerebbe sapere cosa si deve cambiare nel codice per la visualizzazione dei dati sul display. Grazie. …
ciao!
interessante come applicazione! appena mi arriva il display provo!
una osservazione, compilando e testando sui simulatori ho dovuto modificare le prime due righe come segue, anche nel wiki sembra si faccia così:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
ti torna o è un mio abbaglio?
grazie ancora!
Ciao Alessandro.
Ma non è già così?
L’unica differenza è l’aggiunta del commento:
ho inteso male io?
Fammi sapere.
Saluti.
Ciao!
un probabile refuso della piattaforma che usi per il blog… infatti ho riportato anche io pari pari lo stesso errore…
il richiamo alla libreria è il seguente:
#include (simbolo minore) LiquidCrystal.h (simbolo maggiore)
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
manca infatti la dicitura LiquidCrystal.h all’interno dei simboli minore e maggiore. anche facendo un copia incolla questo pezzo della riga non viene copiato…
probabilmente il blog lo interpreta come un qualche tipo di comando riservato o commento non visualizzabile…
Si hai ragione tu ho verificato adesso è WordPress si ostina a non scrivermi l’argomento dell’include, perdonate cerco di sistemare.
Si ho verificato è il plug-in “Google Syntax Highlighter for WordPress” che mi crea qualche problemino ora dovrebbe vedersi #include <liquidcrystal.h> noto che all’interno delle parentesi angolari non vengono accettate le maiuscole e il testo non compare in questo modo: <LiquidCrystal.h>.
Il problema è legato all’interpretazione dei codici escape delle parentesi angolari.
Scusatemi ancora vedo di trovare nel breve una soluzione.
Grazie per la segnalazione, se trovate altri errori di visualizzazione fatemi sapere che correggo.
Saluti.
SALVE MI STO’ DOCUMENTANDO IN RELAZIONE AL PILOTAGGIO DEI DISPLAY
E MI CHIEDO SE ARDUINO PUO’ PILOTARE UN DISP 4 RIGHE 16 CARATTERI E SE SI, VORREI UN ESEMPIO PER SCRIVERE DEI TESTI DIVERSI NELLE VARIE POSIZIONI UTILIZZANDO COME COMANDO DIVERSI PIN DI INPUT,
GRAZIE IN ANTICIPO
nel codice ci sono problemi…
#include e non #include
da eliminare!
Ora provo!
Ciao Paolo.
Dai uno sguardo ai commenti. Ho notato che in certe occasioni che il plug-in “Google Syntax Highlighter for WordPress” ho qualche problemino.
La sintassi corretta è: #include (simbolo minore) LiquidCrystal.h (simbolo maggiore).
Io sto usando Safari e Google Chrome sotto Mac e vedo tutto ok, fammi sapere cosa stai usando tu così cerco di capire.
Per copiare il codice fai click su: “view plain” e copia.
Fammi sapere.
Grazie per la segnalazione.
Quele è la marca/modello del display lcd? Che tipo di lcd è (Transflessivo)?
Vorrei sapere se quando si spegne la retroilluminazione il display si legge corettamente oppure è necessaria la retroilluminazione?
non mi carica il programma mi da errore : LiquidCrystal lcd (12,…….);
mi dice che lcd non è dichiarato per piacere aiutatemi ok???
Ciao.
L’errore dipende dal fatto che la dichiarazione è stata fatta in questo modo:
Grazie 🙂 mi e’ stato molto utile poiche’ con altri tutotial non capivo perche’ non si vedesse nulla, poi ho letto questo:
Nel caso in cui colleghiamo il Pin 15 a +5V e il Pin 16 a GND abbiamo la retroilluminazione:
GRAZIE!
Ciao Gabriele.
Si è corretto ciò che dici.
Saluti.
salve, volevo sapere da cosa dipende il numero di data bus line utilizzati. nei vari tutorial trovati in giro (compreso questo) ne vengono usati sempre 4. Perché?
Ciao Mario.
Perdona il ritardo con cui ti rispondo.
Negli esempi che trovi on-line, come giustamente hai notato, non trovi collegati i pin che vanno
dal 7 al 10.
Il display può essere collegato usando 4 o 8 pin per il trasferimento dati. Collegando solamente 4 pin lasciamo liberi 4 pin di Arduino per altri scopi. Utilizzando 8 pin le prestazioni migliorano, ma non così tanto da giustificare la perdita di 4 pin in più su Arduino.
Quindi la scelta dell’uso di soli 4 pin è puramente di risparmio.
Ricorda che l’intero dato è costituito da 8 bit e se la modalità che hai scelto è trasferimento a 4 bit, saranno utilizzati solo i pin dal DB7 al DB4 e quindi dovrai effettuare due trasferimenti. Se ad esempio devi inviare il dato 10011101, verrà inviato prima 1001 e poi 1101.
Ciao.
il potenziometro di quanti OHM deve essere??? scusa la domanda ignorante
Ciao Antonio.
Va bene un potenziometro da 10KOhm. Se usi un potenziometro con valore superiore (ad es. da 47KOhm) funziona ugualmente, solo che per arrivare alla piena luminosità non arriverai a piena rotazione del potenziometro.
Saluti.
grazie per l’aiuto… scusi il disturbo
grazie
Ciao michele
Sono nuovo
Ma se uno volesse pilotare 2 lcd con lo stesso atmega328 i punti in comune sono le alimentazioni , la retroilluminazione i vari segnali ad eccezione delpin 4 che dovrebbe abilitare la scrittura sul lcd giusto ?
E poi dichiarare i due lcd
Lcd1.begin….
Lcd.begin….
Potrebbe funzionare?
E corretto
Ottima spiegazione.
Hai esperienza con arduino uno ed il Display Nokia 5110. Io ho uno acquistato un display da SparkFun e non riesco a farlo funzionare in nessun modo.
Ho provato ad seguire le indicazioni sul sito che riporta anche lo schema elettrico
e un programma per farlo funzionare,ma senza risultati.
Molti suggeriscono di usare lo schema sul sito di Adafruit, ma nonostante l’uso delle librerie adafruit , non sono riuscito a concludere niente.
Aggiungo che riesco ad istallare le librerie, che devono essere rinominate per poter esser richiamate da ide di arduino, ma non serve a niente.
Non riesco a capire perché il display non funziona .
Potresti aiutarmi?
Grazie
Paolo
Ciao, voglio farti i complimenti per il blog, il tuo lavoro e la tua bravura nello spiegare i vari argomenti, grazie a te sono riuscito a imparare ad utilizare questa stupenda piattaforma, grazie, voglio chiederti un informazione riguardo il controllo dello schermo lcd, nel mio progetto sullo scermo nella prima linea viene scritto in che menu sono cambiandolo tramite un pulsante e qui si è presentato il problema che un nome del menu è più corto di altri e quindi non viene riscritto tutto lo scermo e rimangono gli ultimi caratterei della scritta prima, ho risolto mettendo degli spazi nella scritta più corta in modo che vanno a riscrivere le lettere degli altri menu, però nella seconda riga ci sono dei valori numerici che cambiano da menu a menu e che aumentano e diminuiscono , tipo in un menu ho 4000 e in quello dopo ho 180, ma essendo che uso una cifra in meno l’ultimo 0 non sparisce e visivamente ho 1800 e non 180, come posso fare ad ovviare al problema? il valore a 4000 può scendere anche sotto 999 quindi andando a perdere un numero che non viene riscritto.
Spero in una tua risposta con una soluzione al mio problema.
Fai così, metti prima della prima scrittura lcd.print(” “);
Io di solito risolvo così
Ciao e grazie per gli utili consigli !
Ho un problema quasi incredibile (almeno per me …)
Mi funziona tutto ma se tento di visualizzare il carattere “O” (maiuscolo o minuscolo) il display va in tilt (visualizza una serie di caratteri strani o addirittura niente) !
Se tento di visualizzare la stringa è “ABCDEFGHIJKLMNPQ” funziona, se invece la stringa è “ABCDEFGHIJKLMNOP” non funziona più niente …
Hai qualche idea in proposito ?
Grazie
Sebastiano
Avviene la stessa cosa anche a me. Qualcuno sa perché la lettera ‘O’ mette in crisi il display?
Ciao a tutti,
io ho eseguito tutti i collegamenti tranne la retroilluminazione. Configurazione a 4 bit.
Con il potenziometro riesco a regolare il contrasto, però ho un problema.
Non riesco a stampare sul LCD. Mi rimangono sempre e solo i rettangoli neri, con contrasto variabile.
Lo stesso codice stampa sia su seriale che su lcd.
Su seriale funziona ma su lcd no.
Il codice è quello standard di questo tutorial solo con l’aggiunta della stampa in seriale.
Cosa sbaglio?
Ho risolto il mio problema. Il pin R/W(5), che la guida consiglia di collegarlo a massa, l’ho collegato ad un pin digitale e lo faccio gestire all’arduino,
LiquidCrystal lcd(12, 10, 11, 7, 6, 5, 4);
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
Ora però ho un problema, i caratteri sono tutti strani, tipo £$|§+(poi quadrato nero) e si ripete.
Da cosa potrebbe dipendere?
ciao!
prima di tutto ti volevo ringraziare molto per i tutorial che fai perchè mi aiutano sempre davvero tanto! vorrei farti una domanda..
io ho avuto qualche problemino a saldare i contatti sul display e forse l’ho pure rovinato perchè ora visualizza solo quadrati neri.. ma nelle tue foto vedevo che hai collegato il display e la breadboard in modo diverso, inserisci i cavi direttamente nel display! mi spieghi per favore cosa usi?
Grazie mille