Buongiorno a tutti, in questi giorni mi sono dedicato alla realizzazione di un timer countdown (ma non solo) digitale,necessario per una giocata notturna che abbiamo in programma a fine mese.

In questi mesi, nel poco tempo libero ho smanettato con Arduino, una piccola piattaforma di prototipazione digitale open source, dal costo irrisorio, circa una trentina di euro, ma con vaste applicazioni.

Tralascio la descrizione di Arduino e di come funziona, chi volesse avere maggiori info può visitare www.arduino.cc e, oltre a scaricare il software di complilazione; aggiungo solo che non è necessaria una immensa conoscenza di programmazione in C, bastano le basi, poi sul sito ci sono decine e decine di tutorial per imparare passo passo.

Allora iniziamo con una bella foto di Arduino:
Clicca sull'immagine per ingrandirla

Nome:   IMG_2702.JPG 
Visite: 10 
Dimensione:   51.1 KB 
ID: 161709
E con una carrellata del dispositivo:
Clicca sull'immagine per ingrandirla

Nome:   IMG_3072.JPG 
Visite: 4263 
Dimensione:   53.4 KB 
ID: 161710
Qui possiamo vedere un display a sette segmenti e anodo comune, un piccolo buzzer (sulla sinistra), una morsettiera per il finto (per ora non usato) detonatore, e un po di cavetteria; il tutto è montato su una basetta millefori.
Clicca sull'immagine per ingrandirla

Nome:   IMG_3071.JPG 
Visite: 4152 
Dimensione:   47.1 KB 
ID: 161711
Qui si vede l'elettronica assemblata, per i collegamenti ho riciclato delle vecchie piattine di un Pc, in questo momento Arduino è alimentato tramite USB ma può essere alimentato anche da una pila 9V oppure da uno stabilizzatore a 5V; si nota anche il finto detonatore e un blocchetto di stucco da fonderia, che ha il vantaggio di non indurire mai, se non quando è esposto ad altissime temperature (viene usato per correggere difetti negli stampi in terra).
Clicca sull'immagine per ingrandirla

Nome:   IMG_3073.JPG 
Visite: 49 
Dimensione:   43.8 KB 
ID: 161712

Particolare del detonatore e del "plastico".
Clicca sull'immagine per ingrandirla

Nome:   IMG_3079.JPG 
Visite: 7 
Dimensione:   32.4 KB 
ID: 161713

Qui si vede l'aspetto finale del dispositivo, devo solo dargli una bella mano di colore, ma aspetto eventuali feddback dalla sede in modo da verniciare solo a lavoro concluso.
Clicca sull'immagine per ingrandirla

Nome:   IMG_3077.JPG 
Visite: 5 
Dimensione:   43.2 KB 
ID: 161714
Disposizione dei componenti interni.
Clicca sull'immagine per ingrandirla

Nome:   IMG_3078.JPG 
Visite: 7 
Dimensione:   25.9 KB 
ID: 161715

Ecco cosa si vede dalla finestrella.
Clicca sull'immagine per ingrandirla

Nome:   IMG_3075.JPG 
Visite: 6 
Dimensione:   33.6 KB 
ID: 161716

Lente di ingrandimento, incastrata e incollata nella finestrella.

Bene avete visto com'è fatta, ma vi chiederete, come cavolo funziona?

Ecco lo schema dei collegamenti, questo schema vale per display a CATODO comune, mente io ho usato un display ad anodo comune, se doveste fare come me, il cavo nero, va collegato ai +5V di Arduino, e nel listato i valori HIGH e LOW vanno invertiti.

Clicca sull'immagine per ingrandirla

Nome:   7segmenti-e1345310126529.jpg 
Visite: 1266 
Dimensione:   51.5 KB 
ID: 161717

Il Buzzer è collegato tra i pin 13 e la terra (GND).

Veniamo ora al codice.
int G=2; //Definisco come interi i pin da 2 a 9
int F=3; // le lettere si riferiscono ai singoli segmenti
int A=4;
int B=5;
int DP=6; // Punto decimale
int C=7;
int D=8;
int E=9;
int buzz=13; // Definisco il pin 13
int time= 1000; // Definisco il tempo 1000 millisecondi, se superate i 30 secondi sostituire int con long

void setup(){
pinMode(G, OUTPUT); // Dico al micro che i seguenti pin sono emettitori
pinMode(F, OUTPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(E, OUTPUT);
pinMode(D, OUTPUT);
pinMode(C, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(buzz, OUTPUT);
}

void zero(){ // Definisco come insiemi le varie cifre numeriche, se usate
digitalWrite(G, HIGH); // un display a CATODO comune invertite HIGH con LOW e viceversa
digitalWrite(F, LOW );
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void uno(){
digitalWrite(G, HIGH);
digitalWrite(F, HIGH);
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void due(){
digitalWrite(G, LOW);
digitalWrite(F, HIGH);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, HIGH);
digitalWrite(DP, HIGH);
}
void tre(){
digitalWrite(G, LOW);
digitalWrite(F, HIGH);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void quattro(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void cinque(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void six(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void sette(){
digitalWrite(G, HIGH);
digitalWrite(F, HIGH);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void otto(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
}
void nove(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A,LOW);
digitalWrite(B, LOW);
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(DP, HIGH);
} // Inizia il countdown

void loop() {
digitalWrite(buzz, HIGH); // Do corrente al buzzer
delay(100); // Aspetto 1 decimo di secondo
digitalWrite(buzz, LOW); // Tolgo corrente al buzzer
delay(100); // Aspetto 1 decimo di secondo
nove(); // VIsualizzo sul display il 9.
digitalWrite(buzz, HIGH); // Do corrente al buzzer
delay(100); // Aspetto 1 decimo di secondo
digitalWrite(buzz, LOW); // Tolgo corrente al buzzer
delay(100); // Aspetto 1 decimo di secondo
delay(time); // Aspetto il tempo impostato
otto();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100); // Ora tutto va avanti uguale fino allo zero.
delay(time);
sette();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
six();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
cinque();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
quattro();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
tre();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
due();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
uno();
digitalWrite(buzz, HIGH);
delay(100);
digitalWrite(buzz, LOW);
delay(100);
delay(time);
zero();
digitalWrite(buzz, HIGH);
delay(3000); // Suona per 3 secondi, poi il ciclo riparte
}


Questo è un esempio di codice, visualizza i numeri da 9 a 0 emettendo un bip ad ogni cambio cifra, arrivato a zero suona per 3 secondi e poi il ciclo riparte.

Impostando il valore di time avete la possibilità di gestire tempi fino a 50 giorni, prima di un overflow del clock.
Potete anche dividere il tempo in: decine di minuti,ad esempio 6-5-4-3-2-1 per un ora, poi fare 9-8-7-6-5-4-3-2-1 per gli ultimi 10 minuti
poi 6-5-4-3-2-1 per gli ultimi 60 secondi, e poi 9-8-7-6-5-4-3-2-1-0 per gli ultimi 10 secondi.

Se vi stesse chiedendo perchè non ho usato un display più grande con più cifre, è perchè non ho dei registri di scorrimento (shift register) che permettono di risparmiare pin di arduino, in quanto con un solo shift register si possono controllare 8 pin (quindi un intero display) usando solo 3 pin di arduino.

PS: Costo totale escludendo Arduino circa 5 euro.