Con questo post rispondo ad alcuni miei studenti su quesiti posti sull’uso di Arduino durante il ripasso condotto in questi giorni sulla modalità di stampa di messaggi sulla Serial Monitor.
L’esercizio assegnato consisteva nella tipica accensione e spegnimento di un LED mediante un pulsante con antirimbalzo software, nella seconda parte bisognava aggiungere un secondo pulsante che permetteva di accendere e spegnere un secondo LED e nella terza fase segnalare l’accensione e lo spegnimento sulla Serial Monitor mediante i messaggi:
“LED Rosso ON”
“LED Rosso OFF”
“LED Verde ON”
“LED Verde OFF”
Qundi per ciascun LED, alla prima pressione del pulsante accensione del LED e segnalazione ON sulla Serial, alla seconda pressione del pulsante segnalazione OFF sulla Serial e spegnimento del LED, ovviamente senza alcun limite sul numero di pressioni sui pulsanti.
Gli studenti sono riusciti a realizzare lo sketch ma con il solito problema di ripetizione in loop del testo di segnalazione sulla Serial.
Il problema può essere superato utilizzando un codice simile al seguente:
int stampaMessaggio = 0; void setup() { Serial.begin(9600); } void loop() { if(!stampaMessaggio) { Serial.println(“Qualsiasi testo da stampare una sola volta…“); stampaMessaggio = 1; } }
Nel primo ciclo di loop la condizione dell’if risulterà vera e ciò permetterà l’esecuzione della stampa del testo, successivamente impostata la variabile “stampaMessaggio” ad 1 non sarà più possibile stampare il testo al ciclo di loop successivo in quanto “!stampaMessaggio” risulterà uguale a 0.
Di seguito le due soluzioni, la prima con testo in loop sulla Serial, mentre la seconda con testo NON in loop.
Al fondo del post un esercizio aggiuntivo per i miei studenti.
All’interno del codice la spiegazione del funzionamento.
Soluzione con testo di output in loop
/* Prof. Michele Maffucci Accensione e spegnimento 23.09.19 Accensione e spegnimento di LED mediante pulsanti con antirimbalzo e messaggio ripetuto dello stato del LED sulla Serial Monitor Pulsante Rosso: accensione e spegnimento LED Rosso (prima pressione accende, seconda pressione spegne) Pulsante Verde: accensione e spegnimento LED Verde (prima pressione accende, seconda pressione spegne) */ // ledRosso variabile di tipo intero a cui viene assegnato // il valore intero 5 che sarà associato al pin digitale 5 int ledRosso = 5; // ledVerde variabile di tipo intero a cui viene assegnato // il valore intero 4 che sarà associato al pin digitale 4 int ledVerde = 4; // pulsanteRosso variabile di tipo intero a cui viene assegnato // il valore intero 7 che sarà associato al pin digitale 7 // a cui sarà collegato il pulsante che comanda il LED Rosso int pulsanteRosso = 7; // pulsanteVerde variabile di tipo intero a cui viene assegnato // il valore intero 6 che sarà associato al pin digitale 6 // a cui sarà collegato il pulsante che comanda il LED Verde int pulsanteVerde = 6; // inizializzazione della variabili in cui verrà memorizzato il valore della // digitalRead: 0 non premuto, 1 premuto int valRosso = 0; int valVerde = 0; // inizializzazione della variabili in cui verrà memorizzato lo stato del pulsante // All'avvio dello sketch i pulsanti non sono premuti int statoRosso = 0; int statoVerde = 0; // inizializzazione della variabili in cui verrà memorizzato lo stato precedente del pulsante // All'avvio dello sketch i pulsanti non sono premuti int valRossoOld = 0; int valVerdeOld = 0; void setup() { pinMode(ledRosso, OUTPUT); // imposta il pin digitale come output pinMode(ledVerde, OUTPUT); // imposta il pin digitale come output pinMode(pulsanteRosso, INPUT); // imposta il pin digitale come input pinMode(pulsanteVerde, INPUT); // imposta il pin digitale come input Serial.begin(9600); // imposta la velocità di scrittura della serial monitor } void loop() { valRosso = digitalRead(pulsanteRosso); // lettura dell'input (pulsante) e memorizzazione in valRosso valVerde = digitalRead(pulsanteVerde); // lettura dell'input (pulsante) e memorizzazione in valVerde // ---------- Controllo pulsante LED Rosso ---------- if ((valRosso == HIGH) && (valRossoOld == LOW)) { statoRosso = 1 - statoRosso; // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi delay(15); } // memorizzazione del valore precedente restituito dalla digitalRead valRossoOld = valRosso; // ---------- Controllo pulsante LED Verde ---------- // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED if ((valVerde == HIGH) && (valVerdeOld == LOW)) { statoVerde = 1 - statoVerde; // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi delay(15); // memorizzazione del valore precedente restituito dalla digitalRead } valVerdeOld = valVerde; // ---------- Stampa sulla Serial Monitor dello stato del LED Rosso ---------- // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Rosso si accende if (statoRosso == 1) { digitalWrite(ledRosso, HIGH); Serial.println("LED Rosso ON"); } // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Rosso OFF" else { digitalWrite(ledRosso, LOW); Serial.println("LED Rosso OFF"); } // ---------- Stampa sulla Serial Monitor dello stato del LED Verde ---------- // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende if (statoVerde == 1) { digitalWrite(ledVerde, HIGH); Serial.println("LED Verde ON"); } // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Verde OFF" else { digitalWrite(ledVerde, LOW); Serial.println("LED Verde OFF"); } }
Soluzione con testo di output NON in loop
/* Prof. Michele Maffucci Data: 23.09.19 Accensione e spegnimento di LED mediante pulsanti con antirimbalzo e messaggio NON ripetuto dello stato del LED sulla Serial Monitor Stampa 1 sola volta il messaggio dello stato del LED sulla Serial Monitor (non va in loop la stampa dello stato del LED) Pulsante Rosso: accensione e spegnimento LED Rosso (prima pressione accende, seconda pressione spegne) Pulsante Verde: accensione e spegnimento LED Verde (prima pressione accende, seconda pressione spegne) */ // ledRosso variabile di tipo intero a cui viene assegnato // il valore intero 5 che sarà associato al pin digitale 5 int ledRosso = 5; // ledVerde variabile di tipo intero a cui viene assegnato // il valore intero 4 che sarà associato al pin digitale 4 int ledVerde = 4; // pulsanteRosso variabile di tipo intero a cui viene assegnato // il valore intero 7 che sarà associato al pin digitale 7 // a cui sarà collegato il pulsante che comanda il LED Rosso int pulsanteRosso = 7; // pulsanteVerde variabile di tipo intero a cui viene assegnato // il valore intero 6 che sarà associato al pin digitale 6 // a cui sarà collegato il pulsante che comanda il LED Verde int pulsanteVerde = 6; // inizializzazione della variabili in cui verrà memorizzato il valore della // digitalRead: 0 non premuto, 1 premuto int valRosso = 0; int valVerde = 0; // inizializzazione della variabili in cui verrà memorizzato lo stato del pulsante // All'avvio dello sketch i pulsanti non sono premuti int statoRosso = 0; int statoVerde = 0; // inizializzazione della variabili in cui verrà memorizzato lo stato precedente del pulsante // All'avvio dello sketch i pulsanti non sono premuti int valRossoOld = 0; int valVerdeOld = 0; // inizializzazione delle variabili che consentono la stampa dello stato del LED int stampoRossoON = 0; int stampoRossoOFF = 0; int stampoVerdeON = 0; int stampoVerdeOFF = 0; void setup() { pinMode(ledRosso, OUTPUT); // imposta il pin digitale come output pinMode(ledVerde, OUTPUT); // imposta il pin digitale come output pinMode(pulsanteRosso, INPUT); // imposta il pin digitale come input pinMode(pulsanteVerde, INPUT); // imposta il pin digitale come input Serial.begin(9600); // imposta la velocità di scrittura della serial monitor Serial.println("Avvio programma"); // stampa la stringa tra le " e va a campo Serial.println("---------------"); // stampa la stringa tra le " e va a campo } void loop() { valRosso = digitalRead(pulsanteRosso); // lettura dell'input (pulsante) e memorizzazione in valRosso valVerde = digitalRead(pulsanteVerde); // lettura dell'input (pulsante) e memorizzazione in valVerde // ---------- Controllo pulsante LED Rosso ---------- // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED if ((valRosso == HIGH) && (valRossoOld == LOW)) { statoRosso = 1 - statoRosso; // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi delay(15); // poichè il pulsante è stato premuto la variabile stampoRossoON viene posta a 0 // per consentire la stampa del messaggio "LED Rosso ON" stampoRossoON = 0; } // memorizzazione del valore precedente restituito dalla digitalRead valRossoOld = valRosso; // ---------- Controllo pulsante LED Verde ---------- // viene controllato che l'input sia HIGH (pulsante premuto) e cambia lo stato del LED if ((valVerde == HIGH) && (valVerdeOld == LOW)) { statoVerde = 1 - statoVerde; // antirimbalzo software - attesa di 15 ms per attendere che l'input si stabilizzi delay(15); // poichè il pulsante è stato premuto la variabile stampoVerdeON viene posta a 0 // per consentire la stampa del messaggio "LED Verde ON" stampoVerdeON = 0; } // memorizzazione del valore precedente restituito dalla digitalRead valVerdeOld = valVerde; // ---------- Stampa sulla Serial Monitor dello stato del LED Rosso ---------- // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Rosso si accende if (statoRosso == 1) { digitalWrite(ledRosso, HIGH); // Se la variabile stampoRossoON è 0 allora !stampoRossoON vale 1 // ciò consente la stampa del messaggio "LED Rosso ON" if (!stampoRossoON) { Serial.println("LED Rosso ON"); // Per evitare una stampa continua del messaggio viene posto ad 1 stampoRossoON // in modo che nel ciclo di loop successivo non venga più stampato il messaggio // "LED Rosso ON". Viene posto a 0 stampoRossoOFF per consentire la stampa "LED Rosso OFF" // nel caso si prema nuovamente il pulsante che controlla il LED Rosso. stampoRossoON = 1; stampoRossoOFF = 0; } } // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Rosso OFF" else { digitalWrite(ledRosso, LOW); if (!stampoRossoOFF) { Serial.println("LED Rosso OFF"); // Per evitare una stampa continua del messaggio viene posto ad 0 stampoRossoON // in modo che nel ciclo di loop successivo non venga più stampato il messaggio // "LED Rosso OFF". Viene posto a 1 stampoRossoOFF per consentire la stampa "LED Rosso OFF" // nel caso si prema nuovamente il pulsante che controlla il LED Rosso. stampoRossoON = 0; stampoRossoOFF = 1; } } // ---------- Stampa sulla Serial Monitor dello stato del LED Verde ---------- // Se il pulsante è stato premuto la condizione dell'if risulta vera ed il LED Verde si accende if (statoVerde == 1) { digitalWrite(ledVerde, HIGH); // Se la variabile stampoVerdeON è 0 allora !stampoVerdeoON vale 1 // ciò consente la stampa del messaggio "LED verde ON" if (!stampoVerdeON) { Serial.println("LED Verde ON"); // Per evitare una stampa continua del messaggio viene posto ad 1 stampoVerdeON // in modo che nel ciclo di loop successivo non venga più stampato il messaggio // "LED Verde ON". Viene posto a 0 stampoVerdeOFF per consentire la stampa "LED Verde OFF" // nel caso si prema nuovamente il pulsante che controlla il LED Rosso. stampoVerdeON = 1; stampoVerdeOFF = 0; } } // nel caso in cui il pulsante non sia premuto o nello stato precedente era stato premuto // allora il LED dovrà essere spento ed il messaggio sulla seriale dovrà essere "LED Verde OFF" else { digitalWrite(ledVerde, LOW); if (!stampoVerdeOFF) { Serial.println("LED Verde OFF"); // Per evitare una stampa continua del messaggio viene posto ad 0 stampoVerdeON // in modo che nel ciclo di loop successivo non venga più stampato il messaggio // "LED Verde OFF". Viene posto a 1 stampoVerdeOFF per consentire la stampa "LED Verde OFF" // nel caso si prema nuovamente il pulsante che controlla il LED Verde. stampoVerdeON = 0; stampoVerdeOFF = 1; } } }
Esercizio: implementare il controllo della marci e dell’arresto di un motore
Realizzare un circuito in cui con tre pulsanti vengono identificate le tre situazioni:
- Marcia
- Arresto
- Anomalia
Associare ad ogni situazione il colore del LED:
- Rosso: marcia
- Verde: arresto
- Giallo: anomalia
Alla pressione del corrispondente pulsante mostrare sulla Serial Monitor :
- Motore in marcia
- Motore fermo
- Anomalia motore
Buon lavoro 🙂