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.
Desafío
IntermedioUna 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 aDONE.DONE: el LED rojo está encendido. Después de 1000 ms, apágalo y vuelve aREADY.
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
}
}
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
2Máquinas de estados
Recordar el modoElegir con switchEstados con nombre usando enumMáquina de estados del semáforoCambiar de modo con un botónPractica por tu cuenta: Playground de Arduino