#150Iniciante

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.

4.0(1)
12 concluído
Raspberry Pi Pico: semáforo (3 LEDs em sequência)
Traga para sua mesa o semáforo que você vê todos os dias na rua. O verde fica aceso por 4 segundos, o amarelo dá um breve aviso e o vermelho faz você esperar por 3 segundos; então, vermelho e amarelo acendem juntos para dizer "prepare-se, o verde vem aí", e o ciclo recomeça. A maneira mais simples de controlar três LEDs em sequência com um Raspberry Pi Pico.

Vídeo

Esquema do circuito

Raspberry Pi Pico: semáforo (3 LEDs em sequência) - Circuit

Código-fonte

MicroPython
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.