Simulatore Semaforo Raspberry Pi Pico (3 LED Sequenziali, GP11/GP12/GP13)
Simuliamo un vero semaforo con LED rosso, giallo e verde. Verde 4 sec "vai", giallo 1,5 sec "preparati", rosso 3 sec "fermati" e rosso+giallo 1 sec "partenza" (pattern europeo). Impara la definizione di funzione, la logica della macchina a stati e la sincronizzazione multi-GPIO. Circuito semplice: 3 LED su GP11/GP12/GP13.

Video
Schema circuito

Codice sorgente
1# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Simulatore Semaforo Raspberry Pi Pico (3 LED Sequenziali, GP11/GP12/GP13)
4# ─────────────────────────────────────────
5# Un vero ciclo di semaforo con LED rosso, giallo e verde: verde 4 s,
6# giallo 1.5 s, rosso 3 s, poi rosso + giallo 1 s (partenza in stile
7# europeo). Una funzione di supporto che spegne tutti i LED evita codice
8# ripetuto.
9#
10# Pin:
11# GP11 -> LED verde
12# GP12 -> LED giallo
13# GP13 -> LED rosso (ogni LED con 220 ohm)
14# LED katotlari -> Catodi dei LED -> GND
15
16from machine import Pin
17from time import sleep
18
19# ============ PIN / PIN ============
20# Pin del semaforo (adiacenti GP11-GP12-GP13)
21green_led = Pin(11, Pin.OUT) # LED verde: VIA
22yellow_led = Pin(12, Pin.OUT) # LED giallo: PRONTI
23red_led = Pin(13, Pin.OUT) # LED rosso: STOP
24
25# ============ FUNZIONE DI SUPPORTO ============
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# ============ CICLO PRINCIPALE ============
40while True:
41 # VERDE: VIA (4 s)
42 all_off()
43 green_led.value(1)
44 print("[TRAFIK/TRAFFIC] YESIL / GREEN — GEC / GO")
45 sleep(4)
46
47 # GIALLO: PRONTI (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 # ROSSO: STOP (3 s)
54 all_off()
55 red_led.value(1)
56 print("[TRAFIK/TRAFFIC] KIRMIZI / RED — DUR / STOP")
57 sleep(3)
58
59 # ROSSO + GIALLO: PARTENZA (1 s), stile europeo
60 # Fase iniziale: il pilota mette l'auto in marcia
61 yellow_led.value(1)
62 print("[TRAFIK/TRAFFIC] KIRMIZI+SARI / RED+YELLOW — KALKIS / STARTING")
63 sleep(1)
64FAQ
Cosa significa quando la spia rossa e quella gialla si accendono contemporaneamente?▾
In alcuni semafori europei, prima che il semaforo passi dal rosso al verde, si accendono contemporaneamente la luce rossa e quella gialla; questo segnala agli automobilisti di "prepararsi". Anche in Turchia viene utilizzato questo schema.
Qual è l'utilità della definizione di una funzione?▾
Una funzione come `all_off()` ti permette di richiamare tre righe ripetitive con un unico nome. Il codice diventa più breve e leggibile, e le modifiche vengono apportate in un unico punto.
Come posso modificare le durate?▾
Modifica i valori in secondi all'interno di `sleep()` per ciascuna luce. Se definisci i valori come costanti all'inizio del file (ad es. GREEN_TIME = 4) e li utilizzi in chiamate come `sleep(GREEN_TIME)`, la configurazione diventa molto più semplice.
Posso aggiungere un pulsante per i pedoni?▾
Sì. Puoi aggiungere un pulsante e, quando viene premuto, far passare il ciclo al rosso. Affinché il pulsante venga rilevato immediatamente, è necessario utilizzare `ticks_ms()` al posto di `sleep` per la temporizzazione; questo verrà spiegato nel prossimo progetto sul selettore di modalità.
