Alcuni giorni fa ho comprato un piccolo display Led a 4 cifre a 7 segmenti (questo per l'esattezza). Solo dopo l'acquisto, leggendo il datasheet, mi sono accorto che era ad anodo comune e quindi non potevo pilotarlo con un MAX7219 che avevo in casa.
Ho deciso perciò di lavorare con il MULTIPLEXING in modo da risolvere la questione "tra me e lui", senza librerie extra né componenti aggiuntivi. Per farmi un piccolo orologio da tavolo a batteria, ho deciso anche di limitare al massimo il numero dei componenti accessori e ne è venuto fuori un piccolo oggetto, che usa il minimo di componenti elettronici:
- 1 Atmega168 (dovevo riciclarlo dal precedente test dell'Avr-cdc)
- 1 quarzo da 4 MHz con 2 C da 22pF
- 2 C da 0.1uF
- 5 R da 82 ohm
-1 pulsantino
Il display è pilotato interamente tramite l'Atmega, nessun componente attivo extra, solo le 5 R da 82 ohm per limitare la corrente di alimentazione dei segmenti (ogni segmento è un Led da 3,2V/20mA).
Il problema dell'anodo comune l'ho risolto multiplexando al massimo il display. Ho deciso non solo di pilotare 1 singola cifra per volta (per evitare di cuocere l'Atmega) ma ho deciso anche, vista l'alimentazione a batteria, di accendere anche 1 solo segmento alla volta. In questo modo la massima corrente che l'Atmega168 eroga in ogni istante è di soli 20 mA! In pratica, l'Atmega costruisce la 1a cifra accendendo/spengendo i vari segmenti interessati, poi passa alla 2a e ripete l'operazione, poi alla 3a ed infine alla 4a. E di nuovo da capo.
Dopo 5 secondi, il display viene spento.
Per limitare i componenti ho inserito 1 solo pulsantino. Premendolo 1 sola volta, compare l'ora, ripremendolo si passa alla visualizzazione (in ordine) della data, dell'anno e dei secondi. Dopo 5 secondi si spenge.
Se si preme il pulsantino per più di 1 secondo e mezzo, si entra in modalità programmazione, ed è possibile impostare orario, data e anno dell'orologio.
Ovviamente ho usato la mia swRTC (leggermente modificata per supportare i 4 MHz) per evitare l'uso di un RTC aggiuntivo. Grazie al quarzo esterno, la libreria dovrebbe essere abbastanza precisa, sicuramente precisa quanto un comune orologio da parete.
In allegato la foto del prototipo realizzato su 1000fori (noterete 2 connettori per l'alimentazione, uno a DX ed uno in alto, perché inizialmente provavo il circuito con un pacco batterie che ha uno spinottino autocostruito). Il circuito (minimalista) e lo sketch sono in allegato. Aggiungo anche un video per far vedere come funziona il tutto. Ho notato che il multiplexing permette di risparmiare corrente ma riduce sensibilmente la luminosità apparente dei segmenti. Io ho usato un display con cifre bianche, forse con quelli a cifre rosse o bu, di colore più "forte", forse la situazione è migliore. Lo sketch può essere modificato per attivare un multiplexing differente, ad esempio si può pensare di pilotare tutti i segmenti di una cifra alla volta, ma per far ciò è bene usare un transistor pilotato dai pin dell'Arduino perché "aprendo" l'output ed ipotizzando di accendere tutti i 7 segmenti di una cifra, si arriva a "succhiare" dal pin ben 140 mA, e tutti sappiamo che più di 20 mA non possono uscire da un singolo GPIO.
Video della versione definitiva (vedi post più avanti):
EDIT:
messo nello zip il file .sch per Eagle dello schema del circuito. Attenzione: è stato creato con Eagle 6.2, Eagle 5.x non lo apre.
Micrologio.zip (960 KB)
micrologio2.pde (13.3 KB)