# CÓDIGO PARA O DESAFIO EXTRA: SEMÁFORO DE PEDESTRE
from machine import Pin
from utime import sleep, time # Usando utime e importando sleep e time explicitamente
# --- Definição dos Pinos ---
# Semáforo da Via 1
LED_V1_VERMELHO = Pin(15, Pin.OUT)
LED_V1_AMARELO = Pin(14, Pin.OUT)
LED_V1_VERDE = Pin(13, Pin.OUT)
# Semáforo da Via 2
LED_V2_VERMELHO = Pin(18, Pin.OUT)
LED_V2_AMARELO = Pin(17, Pin.OUT)
LED_V2_VERDE = Pin(16, Pin.OUT)
# Semáforo de Pedestre
LED_PED_VERMELHO = Pin(22, Pin.OUT)
LED_PED_VERDE = Pin(26, Pin.OUT)
# Botão de Pedestre (com pull-down interno)
BOTAO_PEDESTRE = Pin(20, Pin.IN, Pin.PULL_DOWN)
# --- Duração dos Tempos (em segundos) ---
DURACAO_VERDE_VEICULO = 5
DURACAO_AMARELO_VEICULO = 2
DURACAO_VERDE_PEDESTRE = 7
# --- Variável para controlar o estado atual do semáforo de veículos ---
# 1 = Via 1 Verde, Via 2 Vermelha
# 2 = Via 2 Verde, Via 1 Vermelha
estado_veiculos_atual = 1 # Inicia com a Via 1 Verde
# --- Função para desligar todos os LEDs (para limpeza de estado) ---
def todos_desligados():
LED_V1_VERMELHO.value(0)
LED_V1_AMARELO.value(0)
LED_V1_VERDE.value(0)
LED_V2_VERMELHO.value(0)
LED_V2_AMARELO.value(0)
LED_V2_VERDE.value(0)
LED_PED_VERMELHO.value(0)
LED_PED_VERDE.value(0)
# --- Função para o ciclo de pedestre ---
# Retorna o estado de veículos que DEVE ser ativado APÓS o ciclo de pedestre
def ciclo_pedestre(estado_anterior_veiculos):
print("\nBOTÃO DE PEDESTRE ACIONADO! Iniciando ciclo de pedestre...")
# Garante que os semáforos de veículos fechem corretamente
if LED_V1_VERDE.value() == 1:
# Via 1 está verde, então faz a transição para vermelho
print("Via 1: Verde -> Amarelo...")
LED_V1_VERDE.value(0)
LED_V1_AMARELO.value(1)
sleep(DURACAO_AMARELO_VEICULO)
LED_V1_AMARELO.value(0)
LED_V1_VERMELHO.value(1)
print("Via 1: Amarelo -> Vermelho.")
elif LED_V2_VERDE.value() == 1: # Condição para o caso da Via 2 estar verde
# Via 2 está verde, então faz a transição para vermelho
print("Via 2: Verde -> Amarelo...")
LED_V2_VERDE.value(0)
LED_V2_AMARELO.value(1)
sleep(DURACAO_AMARELO_VEICULO)
LED_V2_AMARELO.value(0)
LED_V2_VERMELHO.value(1)
print("Via 2: Amarelo -> Vermelho.")
# Neste ponto, AMBOS os semáforos de veículos devem estar VERMELHOS.
LED_V1_VERMELHO.value(1) # Garante que a Via 1 está vermelha
LED_V2_VERMELHO.value(1) # Garante que a Via 2 está vermelha
print("Ambos os semáforos de veículos estão VERMELHOS.")
sleep(1) # Pequeno atraso para "assentar"
# Abre o semáforo de pedestre
LED_PED_VERMELHO.value(0)
LED_PED_VERDE.value(1)
print("Semáforo de Pedestre VERDE.")
sleep(DURACAO_VERDE_PEDESTRE)
# Fecha o semáforo de pedestre
LED_PED_VERDE.value(0)
LED_PED_VERMELHO.value(1)
print("Semáforo de Pedestre VERMELHO.")
sleep(1) # Pequeno atraso antes de retomar o tráfego
print("Ciclo de pedestre concluído.")
# Decide qual será o próximo estado do semáforo de veículos
# Se a Via 1 estava verde antes do ciclo de pedestre, a Via 2 deve abrir verde.
# Se a Via 2 estava verde antes do ciclo de pedestre, a Via 1 deve abrir verde.
if estado_anterior_veiculos == 1: # Se a Via 1 estava verde antes
return 2 # Próximo estado: Via 2 Verde
else: # Se a Via 2 estava verde antes
return 1 # Próximo estado: Via 1 Verde
# --- Função para definir o estado dos semáforos de veículos ---
def set_estado_veiculos(estado):
todos_desligados() # Limpa todos os LEDs primeiro
LED_PED_VERMELHO.value(1) # Pedestre sempre vermelho ao iniciar um ciclo de veículos
if estado == 1:
# Via 1 Verde, Via 2 Vermelha
LED_V1_VERDE.value(1)
LED_V2_VERMELHO.value(1)
print(f"Estado: Via 1 Verde, Via 2 Vermelha")
elif estado == 2:
# Via 2 Verde, Via 1 Vermelha
LED_V2_VERDE.value(1)
LED_V1_VERMELHO.value(1)
print(f"Estado: Via 2 Verde, Via 1 Vermelha")
# --- Estado Inicial ---
todos_desligados()
LED_V1_VERDE.value(1)
LED_V2_VERMELHO.value(1)
LED_PED_VERMELHO.value(1)
print("Iniciando Semáforo com Desafio Extra: Via 1 Verde, Via 2 Vermelha, Pedestre Vermelho")
# Variável para controlar o fluxo do loop principal após o ciclo de pedestre
pedestre_ativado = False
while True:
# Reinicia a flag de pedestre ativado
pedestre_ativado = False
# --- Estado 1: Via 1 Verde, Via 2 Vermelha ---
# Só entra neste estado se a condição de estado_veiculos_atual for verdadeira
if estado_veiculos_atual == 1:
set_estado_veiculos(1)
tempo_inicio_estado = time()
while (time() - tempo_inicio_estado) < DURACAO_VERDE_VEICULO:
if BOTAO_PEDESTRE.value() == 1:
estado_veiculos_atual = ciclo_pedestre(estado_veiculos_atual)
pedestre_ativado = True # Define a flag
break # Sai do loop de espera
sleep(0.05)
# Se o ciclo de pedestre foi ativado, pulamos a transição normal e vamos para o próximo ciclo do while True
if pedestre_ativado:
continue # Volta para o início do while True para reavaliar estado_veiculos_atual
# Se não houve ativação de pedestre, faz a transição normal
# Transição 1: Via 1 Verde -> Amarelo -> Vermelho
print("Transição: Via 1 Verde -> Amarelo -> Vermelho")
LED_V1_VERDE.value(0)
LED_V1_AMARELO.value(1)
sleep(DURACAO_AMARELO_VEICULO)
LED_V1_AMARELO.value(0)
LED_V1_VERMELHO.value(1)
LED_V2_VERMELHO.value(0)
LED_V2_VERDE.value(1)
estado_veiculos_atual = 2 # Prepara para o próximo estado
# --- Estado 2: Via 2 Verde, Via 1 Vermelha ---
# Só entra neste estado se a condição de estado_veiculos_atual for verdadeira
if estado_veiculos_atual == 2:
set_estado_veiculos(2)
tempo_inicio_estado = time()
while (time() - tempo_inicio_estado) < DURACAO_VERDE_VEICULO:
if BOTAO_PEDESTRE.value() == 1:
estado_veiculos_atual = ciclo_pedestre(estado_veiculos_atual)
pedestre_ativado = True # Define a flag
break # Sai do loop de espera
sleep(0.05)
# Se o ciclo de pedestre foi ativado, pulamos a transição normal e vamos para o próximo ciclo do while True
if pedestre_ativado:
continue # Volta para o início do while True para reavaliar estado_veiculos_atual
# Se não houve ativação de pedestre, faz a transição normal
# Transição 2: Via 2 Verde -> Amarelo -> Vermelho
print("Transição: Via 2 Verde -> Amarelo -> Vermelho")
LED_V2_VERDE.value(0)
LED_V2_AMARELO.value(1)
sleep(DURACAO_AMARELO_VEICULO)
LED_V2_AMARELO.value(0)
LED_V2_VERMELHO.value(1)
LED_V1_VERMELHO.value(0)
LED_V1_VERDE.value(1)
estado_veiculos_atual = 1 # Prepara para o próximo estado