Durante le scorse settimane ho svolto una serie di esercitazioni di laboratorio che avevano l’obiettivo di insegnare l’uso dell’istruzione switch…case e la modalità di ricezione dati seriali in Arduino.
La prima lezione è introdotta nel post:
Appunti di programmazione su Arduino: controllo di flusso – istruzione switch..case
Nell’articolo trovate due link che fanno riferimento a due guide sul sito Arduino in cui viene mostrato come utilizzando l’istruzione switch…case:
- per inviare un output specifico sulla Serial monitor in funzione del valore letto dal sensore;
- usare la Serial input per accendere uno specifico LED.
La seconda lezione è basata sul tutorial:
Arduino – lezione 08: display a 7 segmenti e creazione di librerie
In cui viene mostrato come pilotare un display a 7 segmenti realizzando un contatore da 0 a 9, e cicli di visualizzazione di numeri pari e numeri dispari. Nella parte finale del tutorial viene mostrato come realizzare una libreria dedicata alla gestione del display a 7 segmenti.
La terza lezione mostra come ricevere dati dalla seriale in Arduino.
Per questa parte è indispensabile svolgere le esercitazioni che trovate nelle slide:
Alfabeto di Arduino – Lezione 3 da pagina 53 a pagina 62
Successivamente aggiungo gli esercizi che di seguito condivido, in cui riprendendo la gestione del display a 7 segmenti, però questa volta inviamo dati dal computer mediante la tastiera al display comandato da Arduino.
Per lo svolgimento di questa parte è necessario effettuare una piccola variazione rispetto al circuito mostrato in: Arduino – lezione 08: display a 7 segmenti e creazione di librerie in questa lezione volutamente utilizzo tra tutti i pin il piedino 1 di Arduino che viene utilizzato normalmente come pin TX e ciò provoca un comportamento anomalo di accensione del LED e del display, ciò mi permette di spiegare l’utilizzo dei pin 0 e 1 di Arduino.
Il circuito da realizzare per la terza lezione è il seguente (i pin di controllo di Arduino sono presi in maniera sequenziale dal pin 6 al pin 12)
Esercitazione 1
- Realizzare un contasecondi da 0 a 9 utilizzando un display 7 segmenti a catodo comune
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Conteggio 9 secondi con display 7 segmenti a catodo comune // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a=12; const int b=11; const int c=10; const int d=9; const int e=8; const int f=7; const int g=6; // variabile che definisce la velocità con cui appaiono i numeri const int pausa = 1000; void setup() { // inizializzazione dei pin ad OUTPUT for (int i=6; i<13; i++) { pinMode(i, OUTPUT); } } void loop () { for (int i=0;i<10;i++) { LedAcceso(i); delay (pausa); } } void LedAcceso(int n) { switch(n) { case 0: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case 1: digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case 2: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case 3: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case 4: digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case 5: digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case 6: digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case 7: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case 8: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case 9: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; } }
Esercitazione 2
- Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
- La scrittura avviene quando viene premuto l’invio della tastiera.
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviene quando si preme invio. // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } } void loop() { if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } } void LedAcceso(int n) { switch (n) { case '0': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; } }
Esercitazione 3
- Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
- La scrittura avviene quando viene premuto l’invio della tastiera.
- All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviena quando si preme invio. // All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } roll(); } void loop() { if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } } void roll() { for (int i = 0; i < 6; i++) { digitalWrite(a, HIGH); delay(intervallo); digitalWrite(a, LOW); delay(intervallo); digitalWrite(b, HIGH); delay(intervallo); digitalWrite(b, LOW); delay(intervallo); digitalWrite(c, HIGH); delay(intervallo); digitalWrite(c, LOW); delay(intervallo); digitalWrite(d, HIGH); delay(intervallo); digitalWrite(d, LOW); delay(intervallo); digitalWrite(e, HIGH); delay(intervallo); digitalWrite(e, LOW); delay(intervallo); digitalWrite(f, HIGH); delay(intervallo); digitalWrite(f, LOW); delay(intervallo); } } void LedAcceso(int n) { switch (n) { case '0': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; } }
Esercitazione 4
- Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
- La scrittura avviene quando viene premuto l’invio della tastiera.
- All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display
- Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviena quando si preme invio. // All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f // Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display. // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } roll(); } void loop() { if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } } void roll() { for (int i = 0; i < 6; i++) { digitalWrite(a, HIGH); delay(intervallo); digitalWrite(a, LOW); delay(intervallo); digitalWrite(b, HIGH); delay(intervallo); digitalWrite(b, LOW); delay(intervallo); digitalWrite(c, HIGH); delay(intervallo); digitalWrite(c, LOW); delay(intervallo); digitalWrite(d, HIGH); delay(intervallo); digitalWrite(d, LOW); delay(intervallo); digitalWrite(e, HIGH); delay(intervallo); digitalWrite(e, LOW); delay(intervallo); digitalWrite(f, HIGH); delay(intervallo); digitalWrite(f, LOW); delay(intervallo); } } void LedAcceso(int n) { switch (n) { case '0': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; default: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); roll(); } }
Esercitazione 5
- Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9.
- La scrittura avviene quando viene premuto l’invio della tastiera.
- All’avvio del programma deve essere mostrato un gioco di luci con accensione e spegnimento veloce in sequenza dei led: a, b, c, d, e, f del display.
- Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display.
- Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci.
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviena quando si preme invio. // All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f // Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display. // Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci. // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } roll(); } void loop() { if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } } void roll() { // spegnimento di tutti i led del display digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f for (int i = 0; i < 6; i++) { digitalWrite(a, HIGH); delay(intervallo); digitalWrite(a, LOW); delay(intervallo); digitalWrite(b, HIGH); delay(intervallo); digitalWrite(b, LOW); delay(intervallo); digitalWrite(c, HIGH); delay(intervallo); digitalWrite(c, LOW); delay(intervallo); digitalWrite(d, HIGH); delay(intervallo); digitalWrite(d, LOW); delay(intervallo); digitalWrite(e, HIGH); delay(intervallo); digitalWrite(e, LOW); delay(intervallo); digitalWrite(f, HIGH); delay(intervallo); digitalWrite(f, LOW); delay(intervallo); } } void LedAcceso(int n) { switch (n) { case '0': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; default: roll(); } }
Esercitazione 6
Realizzare le stesse funzionalità dell’esercizio 5 ma ottimizzare la funzione roll() in modo che lo spegnimento iniziale dei LED sia costituito da un ciclo for e l’accensione e lo spegnimento sequenziale sia realizzato da due cicli for annidati.
Soluzione
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviena quando si preme invio. // All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f // Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display. // Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci // Versione in cui la funzione roll() è stata ottimizzata // Lo spegnimento iniziale dei LED è costituito da un ciclo for e l'accensione e lo spegnimento sequenziale // è realizzato da due cicli for annidati. // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } roll(); } void loop() { if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } } // funzione per gioco di luci void roll() { // spegnimento di tutti i led del display for (int i = 6; i < 13; i++) { digitalWrite(i, LOW); } // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f for (int m = 0; m < 6; m++) { for (int p = 12; p > 6; p--) { digitalWrite(p, HIGH); delay(intervallo); digitalWrite(p, LOW); delay(intervallo); } } } // la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display // prima che venga stampato il numero viene eseguita la funzione roll() void LedAcceso(int n) { switch (n) { case '0': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; default: roll(); } }
Esercitazione 7
Realizzare le stesse funzionalità dell’esercizio 6 realizzando una libreria di gestione “LedAcceso.h” richiamata dallo sketch principale. Per l’esecuzione di questo esercizio seguire le indicazioni fornite al fondo del tutorial: Arduino – lezione 08: display a 7 segmenti e creazione di librerie
Soluzione
LedAcceso.cpp
/* display_sette_segmenti.cpp libreria che consente il controllo di un display a 7 segmenti a catodo comune del tipo HDSP 5503 */ #include "Arduino.h" const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; // funzione per gioco di luci void roll() { // spegnimento di tutti i led del display for (int i = 6; i < 13; i++) { digitalWrite(i, LOW); } // ciclo di sei accensioni e spegnimenti dei led a, b, c, d, e, f for (int i = 0; i < 6; i++) { for (int j = 12; j > 6; j--) { digitalWrite(j, HIGH); delay(intervallo); digitalWrite(j, LOW); delay(intervallo); } } } // la funzione LedAcceso prende come input il carattere numerico che deve essere mostrato su display // prima che venga stampato il numero viene eseguita la funzione roll() void LedAcceso(int n) { switch (n) { case '0': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); break; case '1': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '2': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '3': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; case '4': roll(); digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '5': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '6': roll(); digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '7': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case '8': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; case '9': roll(); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); break; default: roll(); } }
LedAcceso.h
/* LedAcceso.h header file della libreria LedAcceso */ #include "Arduino.h" void LedAcceso(int n); // prototipo della funzione void roll(); // prototipo della funzione
sketch
// Prof. Michele Maffucci // 14.04.2019 // Scrittura mediante tastiera (su serial monitor) di un numero da 0 a 9 // La scrittura avviena quando si preme invio. // All'avvio del programma gioco di luci con accensione veloce dei led: a, b, c, d, e, f // Alla pressione di un tasto diverso dai numeri da 0 a 9, gioco di luci e spegnimento del display. // Alla pressione di un numero da 0 a 9 prima della comparsa del numero mostrare gioco di luci // Versione con inclusione della libreria di gestione dell'accensione del display // definizione delle variabili a cui collegare ogni segmento del display // la lettera rappresenta il segmento del display il numero il pin // digitale di Arduino a cui è collegato il corrispondente pin del display #include "LedAcceso.h" const int a = 12; const int b = 11; const int c = 10; const int d = 9; const int e = 8; const int f = 7; const int g = 6; const int intervallo = 10; void setup() { // inizializzazione della seriale Serial.begin(9600); // inizializzazione dei pin ad OUTPUT for (int i = 6; i < 13; i++) { pinMode(i, OUTPUT); } roll(); } void loop() { // verifica se sulla serial monitor è presente un carattere, // se la condizione è vera viene letto il carattere presente sulla serial monitor if (Serial.available()) { int selettore = Serial.read(); LedAcceso(selettore); } }
Buon Coding a tutti 🙂