Menu
CoddyTech

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.

challenge icon

Desafio

Médio

A 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á para DONE.
  • DONE: o LED vermelho fica aceso. Após 1000 ms, apague-o e volte para READY.

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
  }
}
quiz iconTeste seus conhecimentos

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