Dispense Arduino
Materiale tratto dal nostro corso di base Arduino, con esempi ed esercizi
Display numerici e alfanumerici
In questa lezione andiamo a scoprire come mostrare informazioni con Arduino, senza passare dallo schermo del computer. Esistono molti tipi diversi di display in commercio, alcuni formati da semplici LED disposti a formare cifre e caratteri, altri dotati di una complessa circuiteria interna che permette di visualizzare frasi o semplici immagini, con poche righe di codice.Storia


I primi modelli di display, noti come
nixie, erano vere e proprie
valvole termoioniche, formate da una serie di elettrodi sovrapposti
a formare le 10 cifre: attivati dal passaggio di corrente
questi si illuminavano delineando il numero.
Col passare del tempo i metodi di visualizzazione hanno subìto molte trasformazioni,
ma il concetto di fondo è rimasto invariato fino ad oggi.

Display a 7 segmenti
Come suggerisce il nome, un display a 7 segmenti è formato da 7 LED disposti in linee a formare la cifra 8, più un LED per il punto (dot point). Per evitare uno spreco sulle connessioni, i LED hanno o l'anodo o il catodo a comune, come si vede nell'immagine a lato che riporta le piedinature di entrambi i modelli. Gli schemi di connessione sono complementari per cui possiamo, con poche modifiche, facilmente adattarci all'uno o all'altro tipo.
Connessioni manuali
Il modo più semplice per accendere un 7 segmenti è collegarlo
direttamente ai pin di Arduino, utilizzando
digitalWrite
per illuminare i singoli segmenti.
Questo sarà il primo esempio illustrativo, che ci servirà a
capirne meglio il funzionamento. Naturalmente questo è un
metodo altamente sconsigliato per un qualsiasi progetto,
poiché fa uso di un numero spropositato di pin, ed è inapplicabile
per display più grandi che richiedono più corrente.


#include <SevSeg.h> SevSeg display = SevSeg(2,3,4,5,6,7,8, COMMON_ANODE); void setup(){ /*vuoto*/ } void loop() { for (byte i=0; i<=9; i++) { display.print(i); //visualizza le cifre da 0 a 9 delay(1000); } }
Per semplificare la programmazione si fa uso della nostra libreria
SevSeg che potete scaricare
qui. In questo modo basta creare un oggetto display
assegnando i pin utilizzati, e specificando se questo è ad anodo
comune (COMMON_ANODE
) o catodo comune (COMMON_CATHODE
).
In automatico verrà eseguita tutta la procedura
di set up dei pin.
Durante l'esecuzione del programma basta chiamare la funzione
print(i)
riferita all'oggetto display
per visualizzare sul display la cifra richiesta. È interessante
leggere i files della libreria per capire come viene
effettuata la conversione...
Lo shift register
Con l'esempio precedente abbiamo utilizzano ben 7 pin su 20, solo per mostrare una singola cifra sul display. Naturalmente ci sono altri modi che ci consentono di usare meno I/O. Adesso ne vediamo uno che utilizza un componente integrato detto shift register. In questo caso si inviano a questo componente, tramite un canale seriale, dei pacchetti di informazione contenenti gli stati dei led e sarà lui a smistarli sui singoli canali del display. Un integrato che svolge questo compito è il 74HC595, facilmente reperibile online.


#include <SevSeg.h> const byte clockPIN = 9; const byte latchPIN = 10; const byte dataPIN = 11; SevSeg display = SevSeg(clockPIN, latchPIN, dataPIN, COMMON_ANODE); void setup(){ // non c'è niente qui... } void loop() { for (byte i=0; i <= 9; i++){ display.print(i); // visualizza le cifre da 0 a 9 delay(1000); } }
L'aggiunta del chip non ha modificato il programma, poiché la nostra libreria SevSeg è progettata per adattarsi ad una circuiteria di questo tipo: in fase di inizializzazione non si passano più i 7 pin del display, ma i 3 pin (clock, latch e data) dello shift register;

Qui potete scaricare la nostra libreria SevSeg.
Il funzionamento di massima è il seguente: ogni volta che è
chiamata la funzione display.print(cifra)
vengono eseguite le seguenti operazioni:
- Il pin di latch è portato basso: serve per disattivare le uscite dello shift register;
- Viene generato un segnale di clock (un'onda periodica) sul pin di clock;
- Ad ogni colpo di clock vengono presentati sul pin di data gli 8 stati delle uscite dello shift register, ovvero gli stati dei sette segmenti (Nota: un'uscita è scollegata);
- Inviati gli 8 bit, il pin di latch viene nuovamente portato alto, aggiornando le uscite con i nuovi valori inviati.
Il funzionamento interno
Sezione in scrittura
Ci scusiamo per l'attesa...
Esercizi
- dado elettronico: fare un circuito che, premendo un pulsante, visualizzi su un display un numero random da 1 a 6
- contapunti: fare un circuito che, tramite tre pulsanti, consenta di incrementare, decrementare e azzerare il numero scritto su un display.
Display LCD alfanumerici


I 7 segmenti sono un ottimo metodo per visualizzare piccoli numeri
(temperatura e umidità abientale, velocità della bicicletta...),
ma sono pressoché inutilizzabili se si deve mostrare anche un
breve messaggio.
Passiamo quindi ai display LCD alfanumerici: più avanzati e dotati
di una propria circuiteria che va a gestire le uscite in parallelo
ad Arduino. Questi non sono gli unici, ma sicuramente si tratta dei
più economici.
L'immagine seguente ci mostra come si collega un display LCD ad Arduino

L'utilizzo di un display LCD con Arduino è semplificato da una libreria standard che si chiama LiquidCrystal. Di seguito possiamo vedere come utilizzare questa libreria con un semplice esempio.
// inserisce la libreria #include <LiquidCrystal.h> // crea un oggetto lcd inizializzandolo con i pin relativi LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // imposta righe e colonne del display lcd.begin(16, 2); // stampa un messaggio lcd.print("hello, world!"); } void loop() { // sposta il cursore alla linea 1, colonna 0 lcd.setCursor(0, 1); // stampa il numero di secondi dall'accensione lcd.print(millis()/1000); // aspetto un secondo delay(1000); }
Esercizi
- termometro: fare un circuito che misura una temperatura e la visualizza sul display lcd
