Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Reescribe 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 enum para los tres estados, un switch y millis()
  • enciende la luz verde en setup() y llama a showLight() 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);
}
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 Proyectos

Practica por tu cuenta: Playground de Arduino