Un modulo molto versatile e poco costoso (si trova a qualche euro sulla rete) utile per visualizzare numeri e scritte, dotato di 8 led e di 8 pulsanti è quello basato sull’integrato TM1638.
Tale integrato, a fronte di sole 3 linee di comando, è in grado di pilotare 8 display a 7 segmenti, 8 led (in alcuni casi a doppio colore) e ricevere l’input da 8 pulsanti, questo nella versione classica del modulo.
Usarlo è piuttosto semplice, basta importare l’apposita libreria con un bel
#include <TM1638.h>
A questo punto si deve definire il nome del modulo da utilizzare nello sketch ed indicare su quali linee si attestano i controlli. Con questa linea identifichiamo con la classe TM1638 la variabile “module” indicando i pin di controllo
TM1638 module(4, 3, 2);
Il primo valore indica la linea DIO (DATA/IO) il CLK (CLOCK) ed il terzo la linea STR (STROBE). Il modulo necessita ovviamente di una alimentazione 5V e una massa.
E’ necessario inizializzare poi tale modulo indicando anche a che luminosità falo funzionare
module.setupDisplay(true,5);
con true accendiamo il modulo, con 5 indichiamo il 5° livello di luminosità (tra 0 e 7).
Ed ora i comandi principali
module.setLED(TM1638_COLOR_RED, x);
module.setLED(TM1638_COLOR_NONE, x);
La prima istruzione accende il led numero x (con x da 0 a 7) di colore rosso, la seconda lo spegne. Nel caso avessimo a disposizione un modulo con i led bicolore potremo utilizzare anche le istruzioni
module.setLED(TM1638_COLOR_GREEN, x);
module.setLED(TM1638_COLOR_GREEN + TM1638_COLOR_RED, x);
Per controllare tutti i led contemporaneamente in una sola istruzione
module.setLEDs(x);
dove x è una word con il byte meno significativo (più a destra) che controlla lo stato del rosso ed il secondo byte quello del verde. un 1 in un bit accende il led, uno 0 lo spegne.
Per cancellare tutti i display a 7 segmenti viene utile il comando
module.clearDisplay();
Per scrivere sui display ci vengono in aiuto alcuni comandi come
module.setDisplayToString(Stringa, 0b01010000);
In Stringa metteremo il testo da visualizzare mentre nel secondo parametro metteremo in quale posizione accendere (o non accendere) il punto decimale.
Per i numeri viene utile
module.setDisplayToDecNumber(Numero,PuntoDecimale,false);
In Numero ovviamente il numero da visualizzare, in PuntoDecimale la posizione dell’eventuale punto decimale e nell’ultimo parametro true se vogliamo visualizzare gli 0 prima del numero o false se non lo vogliamo.
Possiamo anche decidere di visualizzare in esadecimale con
module.setDisplayToHexNumber(Numero,PuntoDecimale,false);
o in binario
module.setDisplayToBinNumber(Numero,PuntoDecimale);
E’ addirittura possibile accendere singoli segmenti di ogni display, tenendo a mente di passare un array di byte alla funzione “setDisplay”. Ogni byte (dal primo all’ultimo) rappresenta un display ed ogni segmento un bit (compreso il punto decimale). Quindi un comando come questo
byte values[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
module.setDisplay(values);
Darà come risultato questo
Per leggere invece lo stato dei pulsanti si userà
module.getButtons();
Il risultato (byte) è l’insieme dei bit corrispondenti a ciascun tasto, da sinistra verso destra 1, 2, 4, 8, 16, 32, 64, 128
I tasti possono anche essere premuti contemporaneamente dando come risultato la somma dei singoli tasti.
La lettura di un pulsante è immediata, velocissima, quindi dobbiamo predisporre nel nostro sketch anche un controllo di “fine pressione” dei tasti prima di poter leggere un altro pulsante. Ad esempio
void WaitNoButtons() { while (module.getButtons() != 0) { } }
Libreria: TMxxxx