Menu
CoddyTech

Estados con nombre usando enum

Parte de la sección Temporización sin delay del Journey de Arduino de Coddy. Lección 9 de 18.

Un modo numerado como 0, 1 y 2 funciona, pero if (mode == 2) no indica qué significa 2. Un enum le da un nombre a cada número:

enum State { READY, RUNNING, DONE };
State state = READY;

La primera línea crea un tipo nuevo, State, cuyos únicos valores son READY, RUNNING y DONE. Por debajo, siguen siendo 0, 1 y 2, pero los nombres indican qué significa cada uno. La segunda línea crea una variable de ese tipo.

Un enum y un switch encajan bien: un case por cada estado.

switch (state) {
  case READY:
    // qué hace READY y cuándo pasa al siguiente estado
    break;
  case RUNNING:
    // ...
    break;
}

Para pasar a un estado nuevo, asigna un valor a state y recuerda cuándo comenzó: state = DONE; stateStart = millis();. Después, cada estado mide su duración con millis() - stateStart. Esta forma de escribir un sketch se llama máquina de estados.

challenge icon

Desafío

Intermedio

Una máquina tiene tres estados. READY está escrito para ti: el LED verde está encendido y al pulsar se inicia la máquina. Añade los otros dos casos:

  • RUNNING: el LED amarillo está encendido. Después de 2000 ms, apágalo y pasa a DONE.
  • DONE: el LED rojo está encendido. Después de 1000 ms, apágalo y vuelve a READY.

Guarda stateStart en cada cambio. Pulsa Run, pulsa el botón y después pulsa Check.

Pruébalo tú mismo

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;   // cuándo comenzó el estado actual

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;

    // añade el caso RUNNING: enciende el LED amarillo; después de 2000 ms, apágalo y pasa a DONE

    // añade el caso DONE: enciende el LED rojo; después de 1000 ms, apágalo y vuelve a READY
  }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Temporización sin delay

Practica por tu cuenta: Playground de Arduino