GLG Programs fa uso di cookie per migliorare l'esperienza di navigazione degli utenti, ma non per tracciarne un profilo. Proseguendo nella navigazione, si accetta implicitamente l'utilizzo dei cookie.
[OK]Note legaliNon mi importa
Logo GLGPrograms Logo GLGPrograms

Dispense Arduino

[Icona della Guida] 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

Display 7-segmenti nixie Display 7-segmenti moderno Una ampolla nixie e un display 7-segment doppio

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.

Funzionamento 7 segmenti

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.

Display 7-segmenti con Arduino su breadboard Circuito display 7-segmenti con Arduino Circuito per display ad anodo comune
#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.

Display 7-segmenti con Arduino su breadboard Circuito display 7-segmenti con Arduino Circuito per display a 7 segmenti ad anodo comune, con l'uso di shift register
#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;

Grafico di funzionamento 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 funzionamento interno

Sezione in scrittura

[Icona della Guida] Ci scusiamo per l'attesa...

Esercizi

Display LCD alfanumerici

Display LCD fronte Display LCD retro

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

Display LCD alfanumerico su 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

Pagina scritta da GiulioGiulio

Hai una domanda? Scrivici!
Questa pagina ti è piaciuta? Condividila!
Share on Facebook Share on Google+ Share on linkedin