2.2 Semáforo

1. Qué vamos a hacer
Vamos a realizar un semáforo en el que el LED verde se enciende durante 5 segundos, luego se enciende el LED naranja durante 2 segundos y finalmente el LED rojo durante 5 segundos. El ciclo se repite continuamente.

1.1 Qué vamos a aprender
- A diseñar secuencias temporizadas (eventos que ocurren en un orden y tiempo exactos).
- A controlar múltiples componentes digitales (LED) de forma coordinada.
- A estructurar un ciclo de estados infinito (programación cíclica).
1.2 Qué vamos a usar
Componentes
- LED verde (pin 11): Fase de paso.
- LED naranja (pin 12): Fase de precaución.
- LED rojo (pin 13): Fase de detención.

Programación
Para encender y apagar los LED ya conoces digitalWrite y para esperar, delay. Antes de usar un pin hay que decirle a la placa cómo lo vamos a usar con la función pinMode(pin, modo):
- pin: el número del pin que queremos configurar.
- modo:
OUTPUTsi es una salida (la placa envía señales por él, como a un LED) oINPUTsi es una entrada (la placa lee señales por él, como de un pulsador; lo veremos en el próximo proyecto).
2. Programamos
La programación se basa en una secuencia cíclica donde cada LED permanece encendido durante un tiempo específico y luego pasa al siguiente estado de forma automática.
Escribe el siguiente código en Arduino IDE y cárgalo en la placa:
// Semáforo: verde 5 s, naranja 2 s y rojo 5 s
const int ledVerde = 11; // LED verde conectado al pin 11
const int ledNaranja = 12; // LED naranja conectado al pin 12
const int ledRojo = 13; // LED rojo conectado al pin 13
void setup() {
// los pines de los tres LED son salidas
pinMode(ledVerde, OUTPUT);
pinMode(ledNaranja, OUTPUT);
pinMode(ledRojo, OUTPUT);
}
void loop() {
// fase verde: 5 segundos
digitalWrite(ledVerde, HIGH);
delay(5000);
digitalWrite(ledVerde, LOW);
// fase naranja: 2 segundos
digitalWrite(ledNaranja, HIGH);
delay(2000);
digitalWrite(ledNaranja, LOW);
// fase roja: 5 segundos
digitalWrite(ledRojo, HIGH);
delay(5000);
digitalWrite(ledRojo, LOW);
}
Cómo funciona:
Las constantes (líneas 3 a 5): guardan el pin de cada LED, para usar en el programa nombres como ledVerde en lugar de números.
La función setup() (líneas 7 a 12): con pinMode indicamos que los pines de los tres LED son salidas. Cada pin que usemos necesita su propio pinMode.
La función loop() (líneas 14 a 29): repite para siempre las tres fases del semáforo:
- El LED verde se enciende durante 5 segundos (
delay(5000)). Al finalizar este tiempo, se apaga. - El LED naranja se enciende durante 2 segundos, y luego se apaga.
- El LED rojo se enciende durante 5 segundos. Transcurrido este tiempo, se apaga.
Luego, el ciclo vuelve a comenzar con la luz verde y se repite de forma indefinida.
3. Mejóralo
Prueba a perfeccionar tu semáforo con algunas de estas tres mejoras que te proponemos:
-
Naranja intermitente: Modifica la fase intermedia para que el LED naranja no se quede fijo, sino que parpadee 3 veces rápidas (encendido
0.3segundos / apagado0.3segundos) antes de pasar al rojo.Pista: puedes copiar tres veces el encendido y el apagado del LED naranja o, mejor, usar un bucle
for, que repite las instrucciones de su interior el número de veces que le indiquemos:for (int i = 0; i < 3; i++) { ... }las repite 3 veces. -
Semáforo de peatones: Usa el LED RGB de la placa como semáforo de peatones: debe estar en rojo mientras los coches tienen el verde o el naranja, y en verde cuando los coches tienen el rojo.
Pista: el LED RGB tiene un LED rojo (pin
9) y uno verde (pin5) que se encienden y se apagan condigitalWrite, como los demás. Declara una constante para cada uno y configúralos como salidas. -
Semáforo sonoro adaptado: Añade el zumbador de la placa para avisar a personas con discapacidad visual:
- Fase verde: Sonido intermitente lento.
- Fase roja: Silencio.
Pista: el zumbador está en el pin
10.analogWrite(zumbador, 125)lo hace sonar yanalogWrite(zumbador, 0)lo apaga. Para el sonido intermitente, usa un bucleforque repita 5 veces: sonar 0,5 segundos y callar 0,5 segundos (5 × 1 s = los 5 segundos de la fase verde).