from machine import Pin
import time
# Configurazione dei LED per il semaforo auto
ledRossoAuto = Pin(4, Pin.OUT)
ledGialloAuto = Pin(3, Pin.OUT)
ledVerdeAuto = Pin(2, Pin.OUT)
# Configurazione dei LED per il semaforo pedonale
ledRossoPed = Pin(28, Pin.OUT)
ledVerdePed = Pin(27, Pin.OUT)
# Configurazione del pulsante pedonale (con pull-down: a riposo 0, quando premuto diventa 1)
pulsantePed = Pin(13, Pin.IN, Pin.PULL_UP)
# Tempi delle fasi (in secondi)
T_VERDE_AUTO = 5 # Tempo in cui le auto hanno il verde
T_GIALLO_AUTO = 2 # Tempo del giallo per le auto
T_ROSSO_AUTO = 5 # Tempo di attesa in rosso per le auto
T_VERDE_PEDONE = 5 # Tempo di attraversamento per i pedoni
# Stato iniziale del semaforo per le auto e per i pedoni
stato_auto = "VERDE" # Possibili valori: "VERDE", "GIALLO", "ROSSO"
stato_pedoni = "ROSSO" # Possibili valori: "ROSSO", "VERDE"
# Variabile per gestire la richiesta del pedone
richiestaPedoni = False
def accendiSemaforo(stato):
"""
Aggiorna lo stato dei LED in base alla richiesta:
"VERDE_AUTO": auto in verde, pedoni in rosso.
"GIALLO_AUTO": auto in giallo, pedoni in rosso.
"ROSSO_AUTO": auto in rosso, pedoni in rosso.
"VERDE_PEDONE": auto in rosso, pedoni in verde.
"""
global stato_auto, stato_pedoni
if stato == "VERDE_AUTO":
# Semaforo per le auto
ledVerdeAuto.value(1)
ledGialloAuto.value(0)
ledRossoAuto.value(0)
# Semaforo per i pedoni
ledVerdePed.value(0)
ledRossoPed.value(1)
stato_auto = "VERDE"
stato_pedoni = "ROSSO"
elif stato == "GIALLO_AUTO":
ledVerdeAuto.value(0)
ledGialloAuto.value(1)
ledRossoAuto.value(0)
ledVerdePed.value(0)
ledRossoPed.value(1)
stato_auto = "GIALLO"
stato_pedoni = "ROSSO"
elif stato == "ROSSO_AUTO":
ledVerdeAuto.value(0)
ledGialloAuto.value(0)
ledRossoAuto.value(1)
ledVerdePed.value(0)
ledRossoPed.value(1)
stato_auto = "ROSSO"
stato_pedoni = "ROSSO"
elif stato == "VERDE_PEDONE":
# Auto ferme: rosso, e pedoni possono attraversare (verde)
ledVerdeAuto.value(0)
ledGialloAuto.value(0)
ledRossoAuto.value(1)
ledVerdePed.value(1)
ledRossoPed.value(0)
stato_auto = "ROSSO" # le auto restano in rosso finché i pedoni attraversano
stato_pedoni = "VERDE"
# Imposta lo stato iniziale: auto in verde
accendiSemaforo("VERDE_AUTO")
ultimoCambio = time.time()
while True:
# Controlla il pulsante pedonale: se premuto (value() == 1) si attiva la richiesta
if pulsantePed.value() == 0:
richiestaPedoni = True
# Attesa per il debounce
time.sleep(0.1)
corrente = time.time()
# Se i pedoni hanno il verde e il tempo di attraversamento è scaduto,
# passa allo stato per le auto (verde) e resetta il contatore
if stato_pedoni == "VERDE" and (corrente - ultimoCambio) >= T_VERDE_PEDONE:
accendiSemaforo("VERDE_AUTO")
ultimoCambio = corrente
# Sequenza del semaforo auto se i pedoni non hanno il verde
elif stato_auto == "VERDE" and (corrente - ultimoCambio) >= T_VERDE_AUTO:
accendiSemaforo("GIALLO_AUTO")
ultimoCambio = corrente
elif stato_auto == "GIALLO" and (corrente - ultimoCambio) >= T_GIALLO_AUTO:
accendiSemaforo("ROSSO_AUTO")
ultimoCambio = corrente
elif stato_auto == "ROSSO":
# Se c'è richiesta pedonale, attendi il tempo in rosso e passa al verde pedonale
if richiestaPedoni and (corrente - ultimoCambio) >= T_ROSSO_AUTO:
accendiSemaforo("VERDE_PEDONE")
richiestaPedoni = False
ultimoCambio = corrente
# Se non c'è richiesta, torna al verde per le auto
elif not richiestaPedoni and (corrente - ultimoCambio) >= T_ROSSO_AUTO:
accendiSemaforo("VERDE_AUTO")
ultimoCambio = corrente
# Piccola pausa per evitare un loop troppo serrato
time.sleep(0.1)