Cambiare modalità con un pulsante
Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 11 di 18.
Molti gadget hanno un solo pulsante che scorre tra le modalità: la luce di una bicicletta si spegne, si accende, lampeggia, lampeggia velocemente, poi si spegne di nuovo. È una macchina a stati in cui è una pressione, non l'orologio, a passare allo stato successivo.
Metti il passaggio in una funzione dedicata. Uno switch sulla modalità corrente imposta quella successiva, e l'ultima modalità torna alla prima:
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... e così via, finché FAST non torna a OFF
}
}Lo sketch chiama nextMode() una volta per pressione. Il pulsante viene sottoposto ad antirimbalzo nel modo che hai imparato nella sezione Inputs: quando la lettura cambia, agisci di conseguenza, poi attendi 20 ms affinché i contatti si stabilizzino. Un secondo switch su mode imposta il LED.
Sfida
MedioIl pulsante e il LED sono già pronti. Scrivi nextMode() in modo che ogni pressione passi alla modalità successiva e ne stampi il nome: OFF, ON, BLINK, FAST, poi di nuovo OFF.
Premi Run, premi il pulsante alcune volte, poi Check.
Provalo tu
const int ledPin = 13;
const int buttonPin = 2;
enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;
bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// Passa alla modalità successiva e ne stampa il nome.
void nextMode() {
// un case per ogni modalità: imposta la modalità successiva, stampa il suo nome, break
}
// Commuta il LED ogni interval ms.
void blinkEvery(unsigned long interval) {
unsigned long now = millis();
if (now - blinkPrevious >= interval) {
blinkPrevious = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
void loop() {
// 1. una pressione (con antirimbalzo) chiama nextMode()
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // lascia stabilizzare i contatti
}
// 2. la modalità determina cosa fa il LED
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Temporizzazione senza delay
2Macchine a stati
Ricordare la modalitàScegliere con switchStati con nome usando enumMacchina a stati del semaforoCambiare modalità con un pulsanteEsercitati da solo: Playground Arduino