Estados Nomeados com enum
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 9 de 18.
Um modo numerado como 0, 1 e 2 funciona, mas if (mode == 2) não diz o que significa 2. Um enum dá um nome a cada número:
enum State { READY, RUNNING, DONE };
State state = READY;A primeira linha cria um novo tipo, State, cujos únicos valores são READY, RUNNING e DONE. Por baixo, eles ainda são 0, 1 e 2, mas os nomes dizem o que cada um significa. A segunda linha cria uma variável desse tipo.
Um enum e um switch combinam bem: um case para cada estado.
switch (state) {
case READY:
// o que READY faz e quando passa para o próximo estado
break;
case RUNNING:
// ...
break;
}Para mudar para um novo estado, defina state e lembre-se de quando ele começou: state = DONE; stateStart = millis();. Cada estado então mede seu próprio tempo com millis() - stateStart. Essa forma de escrever um sketch é chamada de máquina de estados.
Desafio
MédioA máquina tem três estados. READY já está escrito para você: o LED verde fica aceso, e um pressionamento inicia a máquina. Adicione os outros dois casos:
RUNNING: o LED amarelo fica aceso. Após 2000 ms, apague-o e vá paraDONE.DONE: o LED vermelho fica aceso. Após 1000 ms, apague-o e volte paraREADY.
Armazene stateStart a cada mudança. Pressione Run, pressione o botão e, em seguida, Check.
Experimente você mesmo
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 o estado atual começou
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;
// adicione o case RUNNING: acenda o LED amarelo; após 2000 ms, apague o LED amarelo e vá para DONE
// adicione o case DONE: acenda o LED vermelho; após 1000 ms, apague o LED vermelho e volte para READY
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Temporização sem delay
Pratique por conta própria: Playground de Arduino