/* Esperimento con Display a sette segmenti.
Vengono mostrate le due cifre con frequenza di multiplexing crescente
Le cifre mostrano un conteggio lento.
Sono usati due moduli ad Anodo comune. I catodi a..g sono connessi a 0..6
Gli anodi comuni delle due cifre sono connessi a 8 e 9.
*/
int seg, pin, lev; // Indice, Segmento, Pin, Livello
unsigned long t1; // Sveglia per cambio cifra
int d=0; // Cifra mostrata
// Questo array segment definisce i pin di Arduino verso i sette segmenti
int segment[7] = {12,11,7,6,5,4,3};
// Questo array digit definisce quali segmenti da accendere per ogni cifra da ottenere
// Per accendere un segmento occorre il valore 0, mentre l'anodo dovrà essere attivo.
int digit[10] =
{0b1111110, /* Cifra 0 : segmenti A, B, C, D, E, F */
0b0110000, /* Cifra 1 : segmenti B, C */
0b1101101, /* Cifra 2 : segmenti A, B, D, E, G */
0b1111001, /* Cifra 3 : segmenti A, B, C, D, G */
0b0110011, /* Cifra 4 : segmenti B, C, F, G */
0b1011011, /* Cifra 5 : segmenti A, C, D, F, G */
0b1011111, /* Cifra 6 : segmenti A, C, D, E, F, G */
0b1110000, /* Cifra 7 : segmenti A, B, C */
0b1111111, /* Cifra 8 : segmenti A, B, C, D, E, F, G */
0b1111011}; /* Cifra 9 : segmenti A, B, C, D, F, G */
void SetSegments(int n) {
// Questa funzione accende i segmenti per ottenere la cifra specificata
Serial.print("Mostra n=");
Serial.println(n);
for (seg=1; seg<=7; seg++) { // Loop sui sette segmenti
pin = segment[seg-1]; // Pin che va al segmento seg
lev = 1-bitRead(digit[n], 7-seg); // Livello per il Pin
digitalWrite(pin, lev);
}
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("--- inizio ---");
// Definisci tutti i pin dei segmenti come Output
for (seg=1; seg<=7; seg++) {
pin = segment[seg-1];
pinMode(pin, OUTPUT);
}
// Definisci come output i pin delle cifre
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
t1 = millis() + 1000; // Imposta la sveglia per il primo cambio cifra
}
void loop() {
digitalWrite(8, HIGH); // Prima cifra abilitata
digitalWrite(9, HIGH); // Seconda cifra abilitata
SetSegments(d);
Serial.print(millis());
Serial.print(" vs ");
Serial.println(t1);
if (millis() > t1) {
d++;
t1 = millis() + 1000; // Prossima "sveglia" per cambio cifra
if (d>9) d=0;
}
}