Semáforo con millis()
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 2 de 24.
Durante cada delay(3000), la placa no hace nada más, así que no podría detectar el botón del paso de peatones que se añade en el siguiente paso. La temporización pasa a usar millis().
La luz es una máquina de estados: siempre está en un estado (verde, amarillo o rojo) y pasa al siguiente cuando ha permanecido en ese estado el tiempo suficiente. Un enum nombra los estados, una variable guarda el estado actual y otra guarda cuándo empezó:
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;El primer estado es el verde, así que enciende la luz verde en setup(). En cada pasada de loop(), un switch pregunta si el estado actual ha durado lo suficiente y solo entonces avanza y cambia las luces:
case GREEN:
if (millis() - lightStart >= 3000) {
light = YELLOW;
lightStart = millis();
showLight(yellowPin);
}
break;No hay nada que espere, así que loop() queda libre para otras tareas. Compruébalo con una luz de estado: haz parpadear el LED integrado de la placa, el pin 13, cada 500 ms.
Desafío
IntermedioReescribe la temporización sin delay():
- mantén la luz verde encendida durante 3000 ms, la amarilla durante 1000 ms y la roja durante 3000 ms
- usa un
enumpara los tres estados, unswitchymillis() - enciende la luz verde en
setup()y llama ashowLight()solo cuando cambie el estado - haz parpadear el pin 13 cada 500 ms (500 ms encendido, 500 ms apagado), todo el tiempo
Pulsa Run y después Check.
Pruébalo tú mismo
// Las luces de los coches
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Enciende una luz y apaga las otras dos.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
showLight(greenPin);
delay(3000);
showLight(yellowPin);
delay(1000);
showLight(redPin);
delay(3000);
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
Practica por tu cuenta: Playground de Arduino