Stati con nome usando enum
Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 9 di 18.
Una modalità numerata 0, 1 e 2 funziona, ma if (mode == 2) non dice che cosa significa 2. Un enum assegna un nome a ogni numero:
enum State { READY, RUNNING, DONE };
State state = READY;La prima riga crea un nuovo tipo, State, i cui unici valori sono READY, RUNNING e DONE. Sotto sotto sono ancora 0, 1 e 2, ma i nomi indicano che cosa significa ciascuno. La seconda riga crea una variabile di quel tipo.
Un enum e uno switch si combinano bene: un case per ogni stato.
switch (state) {
case READY:
// cosa fa READY e quando passa allo stato successivo
break;
case RUNNING:
// ...
break;
}Per passare a un nuovo stato, imposta state e ricorda quando è iniziato: state = DONE; stateStart = millis();. Ogni stato misura quindi il proprio tempo con millis() - stateStart. Questo modo di scrivere uno sketch si chiama macchina a stati.
Sfida
MedioUna macchina ha tre stati. READY è già stato scritto per te: il LED verde è acceso e una pressione avvia la macchina. Aggiungi gli altri due casi:
RUNNING: il LED giallo è acceso. Dopo 2000 ms, spegnilo e passa aDONE.DONE: il LED rosso è acceso. Dopo 1000 ms, spegnilo e torna aREADY.
Memorizza stateStart a ogni cambiamento. Premi Run, premi il pulsante, poi Check.
Provalo tu
const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
enum State { READY, RUNNING, DONE };
State state = READY;
unsigned long stateStart = 0; // quando è iniziato lo stato corrente
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
switch (state) {
case READY:
digitalWrite(greenLed, HIGH);
if (digitalRead(buttonPin) == LOW) {
digitalWrite(greenLed, LOW);
state = RUNNING;
stateStart = now;
}
break;
// aggiungi il caso RUNNING: accendi il LED giallo; dopo 2000 ms, spegnilo e passa a DONE
// aggiungi il caso DONE: accendi il LED rosso; dopo 1000 ms, spegnilo e torna a READY
}
}
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