import machine
import time
from machine import Pin
from blynk import Blynk
# Configuração dos Pinos
led_vermelho = Pin(19, Pin.OUT)
led_amarelo = Pin(18, Pin.OUT)
led_verde = Pin(5, Pin.OUT)
trig = Pin(13, Pin.OUT)
echo = Pin(12, Pin.IN)
# Variável para guardar o estado do acionamento remoto pelo Blynk
acionar_remoto = False
# função com a lógica dos LEDs vermelho, verde e amarelo
def set_luzes(vermelho=False, amarelo=False, verde=False):
led_vermelho.value(1 if vermelho else 0)
led_amarelo.value(1 if amarelo else 0)
led_verde.value(1 if verde else 0)
# função para medição do sensor de presença
def medir_distancia():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
duracao = machine.time_pulse_us(echo, 1, 30000)
if duracao < 0:
return 999
return (duracao * 0.0343) / 2
# Função que define a lógica de recebimento de msg do Blynk, deixando acionar_remoto = True
def mensagem_recebida(topic, value):
global acionar_remoto
if topic in ["ds/Botao", "ds/V1", "ds/Acionar Sinal Verde"]:
if value == "1":
acionar_remoto = True
# Conexão Blynk usando o AUTH TOKEN
client = Blynk(
"7AU5xBcsxh6RQX0RKuBiOnBM-xmqdiyt",
wifi_ssid="Wokwi-GUEST",
wifi_password="",
callback_func=mensagem_recebida,
verbose=True
)
# inscrição np canal de recebimento de mensagem do blynk pro ESP32
client.subscribe("downlink/ds/#")
# Iniciando o Sistema
set_luzes(vermelho=True)
# Força o botão no Blynk a iniciar DESLIGADO
client.publish("ds/Botao", "0")
client.publish("ds/V1", "0")
# Envia o status inicial para o Blynk
client.publish("ds/Status", "VERMELHO")
inicio_presenca = 0
ultimo_envio_blynk = 0
# Loop principal do sinaleiro
while True:
distancia = medir_distancia()
tempo_atual = time.time()
# Envia a distância ao Blynk a cada 2 segundos
if tempo_atual - ultimo_envio_blynk >= 2:
if distancia > 100.0 or distancia == 999:
texto_distancia = "> 1m"
else:
texto_distancia = f"{int(distancia)}cm"
# Envia ao blynk as leituras do sensor
client.publish("ds/Distancia", texto_distancia)
ultimo_envio_blynk = tempo_atual
# CONDIÇÃO 1: Quando o botão do Blynk "Acionar Sinal Verde" for pressionado
if acionar_remoto:
set_luzes(verde=True)
client.publish("ds/Status", "VERDE (REMOTO)")
time.sleep(5)
set_luzes(amarelo=True)
client.publish("ds/Status", "AMARELO")
time.sleep(2)
set_luzes(vermelho=True)
client.publish("ds/Status", "VERMELHO")
# Reseta o botão no Blynk após o ciclo
client.publish("ds/Botao", "0")
client.publish("ds/V1", "0")
acionar_remoto = False
inicio_presenca = 0
# CONDIÇÃO 2: Presença física de automóvel detectada pelo sensor (< 100 cm por 3s)
elif distancia <= 100.0:
if inicio_presenca == 0:
inicio_presenca = time.time()
# se houver presença por mais de 3 segundos, entra nesse elif
elif time.time() - inicio_presenca >= 3:
set_luzes(verde=True)
client.publish("ds/Status", "VERDE")
time.sleep(5)
set_luzes(amarelo=True)
client.publish("ds/Status", "AMARELO")
time.sleep(2)
set_luzes(vermelho=True)
client.publish("ds/Status", "VERMELHO")
inicio_presenca = 0
else:
inicio_presenca = 0
time.sleep(0.1)