Simulador de Semáforo Raspberry Pi Pico (3 LEDs Secuenciales, GP11/GP12/GP13)
Simulamos un semáforo real con LEDs rojo, amarillo y verde. Verde 4 seg "pase", amarillo 1,5 seg "prepárese", rojo 3 seg "detenga" y rojo+amarillo 1 seg "arranque" (patrón europeo). Aprende definición de función, lógica de máquina de estados y sincronización multi-GPIO. Circuito simple: 3 LEDs en GP11/GP12/GP13.

Video
Diagrama del circuito

Código fuente
1# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Simulador de Semáforo Raspberry Pi Pico (3 LEDs Secuenciales, GP11/GP12/GP13)
4# ─────────────────────────────────────────
5# Un ciclo real de semáforo con LED rojo, amarillo y verde: verde 4 s,
6# amarillo 1.5 s, rojo 3 s, luego rojo + amarillo 1 s (inicio al estilo
7# europeo). Una función auxiliar que apaga todos los LED evita repetir
8# código.
9#
10# Pines:
11# GP11 -> LED verde
12# GP12 -> LED amarillo
13# GP13 -> LED rojo (cada LED con 220 ohmios)
14# LED katotlari -> Cátodos de los LED -> GND
15
16from machine import Pin
17from time import sleep
18
19# ============ PIN / PIN ============
20# Pines del semáforo (adyacentes GP11-GP12-GP13)
21green_led = Pin(11, Pin.OUT) # LED verde: paso libre
22yellow_led = Pin(12, Pin.OUT) # LED amarillo: LISTO
23red_led = Pin(13, Pin.OUT) # LED rojo: ALTO
24
25# ============ FUNCIÓN AUXILIAR ============
26def all_off():
27 """
28 TR: Tum LED'leri sondur (DRY prensibi: tekrardan kacinmak icin)
29 EN: Turn off all LEDs (DRY principle: avoid repetition)
30 """
31 green_led.value(0)
32 yellow_led.value(0)
33 red_led.value(0)
34
35print("== BlueGrays · bluegrays.com ==")
36print("Trafik Lambasi / Traffic Light")
37print("Yesil: GP11 | Sari: GP12 | Kirmizi: GP13")
38
39# ============ BUCLE PRINCIPAL ============
40while True:
41 # VERDE: ADELANTE (4 s)
42 all_off()
43 green_led.value(1)
44 print("[TRAFIK/TRAFFIC] YESIL / GREEN — GEC / GO")
45 sleep(4)
46
47 # AMARILLO: LISTO (1.5 s)
48 all_off()
49 yellow_led.value(1)
50 print("[TRAFIK/TRAFFIC] SARI / YELLOW — HAZIRLAN / READY")
51 sleep(1.5)
52
53 # ROJO: ALTO (3 s)
54 all_off()
55 red_led.value(1)
56 print("[TRAFIK/TRAFFIC] KIRMIZI / RED — DUR / STOP")
57 sleep(3)
58
59 # ROJO + AMARILLO: ARRANQUE (1 s), estilo europeo
60 # Fase inicial: el conductor mete la marcha del coche
61 yellow_led.value(1)
62 print("[TRAFIK/TRAFFIC] KIRMIZI+SARI / RED+YELLOW — KALKIS / STARTING")
63 sleep(1)
64Preguntas frecuentes
¿Qué significa que se enciendan juntas las luces roja y amarilla?▾
En algunos semáforos de Europa, antes de pasar de rojo a verde, se encienden a la vez la luz roja y la amarilla; esto sirve para indicar a los conductores que se preparen. En Turquía también se utiliza este sistema.
¿Cuál es la ventaja de definir una función?▾
Una función como «all_off()» te permite llamar a tres líneas repetitivas con un solo nombre. El código se acorta, se vuelve más legible y los cambios se realizan desde un único lugar.
¿Cómo puedo cambiar los plazos?▾
Cambia los valores en segundos dentro de sleep() para cada luz. Si defines los valores como constantes al principio del archivo (p. ej., GREEN_TIME = 4) y los utilizas en llamadas como sleep(GREEN_TIME), resultará mucho más fácil ajustarlos.
¿Puedo añadir un botón para peatones?▾
Sí. Puedes añadir un botón y, al pulsarlo, hacer que el ciclo cambie a rojo. Para que el botón se detecte al instante, hay que utilizar ticks_ms() en lugar de sleep para controlar el tiempo; esto se explica en el siguiente proyecto sobre el selector de modos.
