Raspberry Pi Pico: semáforo (3 LEDs em sequência)
Simulamos um semáforo real com LEDs vermelho, amarelo e verde — o primeiro projeto com 3 LEDs da série Pico! Verde por 4 segundos: "siga"; amarelo por 1,5 segundo: "prepare-se"; vermelho por 3 segundos: "pare"; e vermelho+amarelo por 1 segundo: "saída" (padrão de semáforo europeu). Aprenda definição de funções (def all_off()), lógica de máquina de estados (sequência) e sincronização de vários GPIOs.

Vídeo
Esquema do circuito

Código-fonte
1# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Raspberry Pi Pico: semáforo (3 LEDs em sequência)
4# ─────────────────────────────────────────
5# Um ciclo de semáforo real com LEDs vermelho, amarelo e verde: verde 4 s,
6# amarelo 1.5 s, vermelho 3 s e depois vermelho + amarelo 1 s (partida no
7# estilo europeu). Uma função auxiliar que apaga todos os LEDs evita
8# código repetido.
9#
10# Pinos:
11# GP11 -> LED verde
12# GP12 -> LED amarelo
13# GP13 -> LED vermelho (cada LED com 220 ohm)
14# Catodos dos LEDs -> GND
15
16from machine import Pin
17from time import sleep
18
19# ============ PINOS ============
20# Pinos do semáforo (vizinhos GP11-GP12-GP13)
21green_led = Pin(11, Pin.OUT) # LED verde: GO (siga)
22yellow_led = Pin(12, Pin.OUT) # LED amarelo: READY (prepare-se)
23red_led = Pin(13, Pin.OUT) # LED vermelho: STOP (pare)
24
25# ============ FUNÇÃO 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# ============ LOOP PRINCIPAL ============
40while True:
41 # VERDE: GO (siga) (4 s)
42 all_off()
43 green_led.value(1)
44 print("[TRAFIK/TRAFFIC] YESIL / GREEN — GEC / GO")
45 sleep(4)
46
47 # AMARELO: READY (prepare-se) (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 # VERMELHO: STOP (pare) (3 s)
54 all_off()
55 red_led.value(1)
56 print("[TRAFIK/TRAFFIC] KIRMIZI / RED — DUR / STOP")
57 sleep(3)
58
59 # VERMELHO + AMARELO: STARTING (partida) (1 s), estilo europeu
60 # Fase de partida: o motorista engata a marcha
61 yellow_led.value(1)
62 print("[TRAFIK/TRAFFIC] KIRMIZI+SARI / RED+YELLOW — KALKIS / STARTING")
63 sleep(1)
64
Perguntas frequentes
O que significa quando as luzes vermelha e amarela acendem juntas?
Em alguns semáforos da Europa, as luzes vermelha e amarela acendem juntas antes da mudança do vermelho para o verde; isso avisa os motoristas para se prepararem. Esse padrão também é usado na Turquia.
Qual é a vantagem de definir uma função?
Uma função como `all_off()` permite chamar três linhas repetitivas de código usando um único nome. O código fica mais curto e legível, e as alterações são feitas em um só lugar.
Como alterar os tempos?
Altere os valores em segundos dentro de `sleep()` para cada luz. Se você definir os valores como constantes no início do arquivo (por exemplo, GREEN_TIME = 4) e usá-los em chamadas como `sleep(GREEN_TIME)`, fica muito mais fácil ajustá-los.
Posso adicionar um botão para pedestres?
Sim. Você pode adicionar um botão que, ao ser pressionado, muda o ciclo para o vermelho. Para que o botão seja detectado imediatamente, é preciso usar `ticks_ms()` para controlar o tempo em vez de `sleep`; isso será explicado no próximo projeto de seletor de modos.
