Prenderò spunto dal commento che mi è stato lasciato da un mio studente per introdurre l’uso delle istruzioni:
if if...else Switch Case
Lo scopo di questa lezione è quello di realizzare un programma che conta quante volte il pulsante viene premuto, per un ciclo di 4 pressioni, alla quinta pressione il led lampeggia una volta e poi si riavvia il ciclo.
Per questa lezione useremo:
- breadboard
- 4 diodi led
- 1 pulsante
- 1 resistenza da 10KOhm
- Arduino duemilanove
La prima versione del programma è quella che è stata realizzata dal mio studente, realizzazione di uno sketch per effettuare la seguente funzione:
Prima pressione: led lampeggia ogni mezzo secondo
Seconda pressione: led lampeggia ogni secondo
Terza pressione: led lampeggia ogni secondo e mezzo
Quarta pressione: led si spegne
Realizziamo un circuito come indicato nelle immagini che seguono:
La proposta interessante ed elegante dell’allievo, sfrutta l’istruzione “Switch Case” che permette di definire quale porzione di codice eseguire in funzione del valore di una variabile. Ciò consente di evitare lunghe catene di if-else.
Il “break” alla fine di ogni “case” viene usato per interrompere il controllo degli altri “case“.
// Esempio 05: // Primo tocco: led lampeggia ogni mezzo secondo // Secondo tocco: led lampeggia ogni secondo // Terzo tocco: led lampeggia ogni secondo e mezzo // Quarto tocco: led si spegne const int BUTTON = 2; // pin di input a cui è collegato il pulsante const int LED = 13; // LED collegato al pin digitale 13 // Variabili globali (tutti interi) int statoButton = 0; // stato del pulsante (inizialmente non premuto) int lastStatoButton = 0; // ultimo stato del pulsante (per ora non premuto) int countButton = 0; // Conteggio del bottone // Avvio dell'applicazione void setup() { pinMode(LED, OUTPUT); // imposta il pin digitale come output pinMode(BUTTON, INPUT); // imposta il pin digitale come input } // Avvio del loop void loop() { // Verifico se l'utente ha premuto il bottone if(digitalRead(BUTTON)) { // Aspetto 15ms per far alzare il dito all'utente delay(15); // Cambio l'ultimo stato del bottone if(lastStatoButton==0) lastStatoButton=1; else lastStatoButton=0; // Aumento il count del bottone if(countButton<=3) countButton=countButton+1; else countButton=0; } // In base allo stato del bottone scelgo l'azione del led switch (countButton) { // Led lampeggia ogni mezzo secondo case 1: digitalWrite(LED, HIGH); // accende il LED delay(500); // aspetta un secondo digitalWrite(LED, LOW); // spegne il LED delay(500); // aspetta un secondo break; // Led lampeggia ogni secondo case 2: digitalWrite(LED, HIGH); // accende il LED delay(1000); // aspetta un secondo digitalWrite(LED, LOW); // spegne il LED delay(1000); // aspettaun secondo break; // led lampeggia ogni secondo e mezzo case 3: digitalWrite(LED, HIGH); // accende il LED delay(1500); // aspetta un secondo digitalWrite(LED, LOW); // spegne il LED delay(1500); // aspetta un secondo break; // Led si spegne case 0: delay(15); digitalWrite(LED, LOW); delay(5000); // aspetta un secondo break; } }
Il programma come si intuisce dal filmato, presenta alcuni problemi.
Rimbalzo
Il problema dei segnali spuri dovuti al rimbalzo del pulsante non consente di controllare esattamente la selezione.
Attesa
Durante l’attesa, mentre si vede lampeggiare il led, premendo il pulsante non si ha cambiamento di stato fino a quando non termina il tempo in cui lampeggia il led.
Discriminare
Difficoltà di discriminare in quale situazione ci si trova, tempi troppo brevi per percepire la differenza delle 4 condizioni.
Per risolvere i problemi sopra elencati vi propongo 6 varianti all’esempio 1, ciò mi permetterà di introdurre nuove istruzioni del linguaggio di programmazione.
Prima di fornirvi le mie soluzioni ho necessità di introdurre l’uso dell’istruzioni Serial ed utilizzare il programma “StateChangeDetection” che potete trovare in File > Examples > 2.Digitale > StateChangeDetection o direttamente on-line sul sito Arduino che trovate di seguito