Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Una 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 a DONE.
  • DONE: il LED rosso è acceso. Dopo 1000 ms, spegnilo e torna a READY.

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
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Temporizzazione senza delay

Esercitati da solo: Playground Arduino