from wifi_lib import conecta
import urequests
from umqttsimple import MQTTClient
import time
from machine import Pin, time_pulse_us
from servo import Servo
# Variáveis de configuração MQTT
mqtt_server = "broker.mqttdashboard.com"
mqtt_port = 1883
mqtt_user = ""
mqtt_password = ""
mqtt_client_id = "clientId-O61aeAKmcb-wokwi"
# Definições de pinos e variáveis
TRIGGER_PIN = 14 # Pino de trigger do sensor ultrassônico (GPIO 14 no ESP32)
ECHO_PIN = 27 # Pino de echo do sensor ultrassônico (GPIO 27 no ESP32)
LED_PIN = 5 # Pino do LED
LED = Pin(LED_PIN, Pin.OUT)
# Variável de controle para ativar/desativar o monitoramento
monitoramento_ativo = False
# Configuração do sensor ultrassônico
trigger = Pin(TRIGGER_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
# Tempo máximo de espera para a conexão Wi-Fi (em segundos)
wifi_timeout = 30
# Função para medir a distância usando o sensor ultrassônico
def medir_distancia():
trigger.off()
time.sleep_us(2) # Aguarda 2 microssegundos
trigger.on()
time.sleep_us(10) # Pulso de 10 microssegundos para iniciar a medição
trigger.off()
# Medir o tempo de duração do pulso no pino de echo
duracao = time_pulse_us(echo, 1, 30000) # Espera até 30 ms para receber o pulso
if duracao < 0:
print("Erro ao medir distância. Verifique o sensor.")
return -1 # Retorna -1 em caso de erro na medição
# Converter duração para distância em centímetros
distancia = (duracao / 2) / 29.1 # Distância = (tempo/2) / Velocidade do som (em us/cm)
return distancia
# Função para verificar o status da lixeira com base na distância
def verificar_nivel(distancia):
if distancia < 5: # Menos de 5 cm até o topo, lixeira cheia
LED.on() # LED vermelho indica lixeira cheia
return "Cheia"
elif distancia < 15: # Menos de 15 cm até o topo, lixeira quase cheia
LED.off()
return "Quase cheia"
else: # Lixeira vazia
LED.off()
return "Vazia"
# Função de callback quando uma mensagem é recebida no tópico MQTT
def recebi(topico, msg):
global monitoramento_ativo
mensagem = msg.decode()
print(f"Mensagem recebida no tópico {topico}: {mensagem}")
# Verificar o tópico de controle e definir o monitoramento
if topico == b"pucpr/ioe/lixeira/controle":
if mensagem.lower() == "ligar":
monitoramento_ativo = True
print("Monitoramento da lixeira ATIVADO.")
elif mensagem.lower() == "desligar":
monitoramento_ativo = False
print("Monitoramento da lixeira DESATIVADO.")
# Conectar ao WiFi com timeout personalizado
print("Conectando ao WiFi...")
station = conecta("Wokwi-GUEST", "")
# Implementar um loop para aguardar a conexão Wi-Fi com timeout
wifi_start_time = time.time()
while not station.isconnected():
time.sleep(1)
elapsed_time = time.time() - wifi_start_time
print(f"Aguardando conexão Wi-Fi... ({int(elapsed_time)}s)")
if elapsed_time >= wifi_timeout: # Verificar se o tempo máximo foi atingido
print("Falha ao conectar ao WiFi: Tempo limite excedido.")
break
if station.isconnected():
print("Conectado ao WiFi")
print("Conectando ao Broker MQTT...")
# Configuração do cliente MQTT
client = MQTTClient(mqtt_client_id,
mqtt_server,
mqtt_port,
mqtt_user,
mqtt_password)
client.connect()
client.set_callback(recebi)
# Inscrever nos tópicos de controle e status
client.subscribe("pucpr/ioe/lixeira/nivel")
client.subscribe("pucpr/ioe/lixeira/controle") # Tópico de controle para ativar/desativar o monitoramento
print("Conectado ao Broker MQTT e inscrito nos tópicos pucpr/ioe/lixeira/nivel e pucpr/ioe/lixeira/controle")
print("Aguardando comandos para controle do monitoramento...")
try:
while True:
# Verificar se há mensagens MQTT e processá-las
client.check_msg()
# Executar o monitoramento apenas se o controle estiver ativo
if monitoramento_ativo:
distancia = medir_distancia()
if distancia != -1: # Verificar se a medição foi bem-sucedida
status_lixeira = verificar_nivel(distancia)
print(f"Distância medida: {distancia:.2f} cm - Status: {status_lixeira}")
# Publicar o status da lixeira no tópico MQTT
client.publish("pucpr/ioe/lixeira/status", status_lixeira)
client.publish("pucpr/ioe/lixeira/distancia", str(distancia))
# Aguardar 10 segundos antes de medir novamente
time.sleep(10)
else:
print("Monitoramento está desativado. Aguardando comando para ativar...")
time.sleep(5)
except KeyboardInterrupt:
print("Desconectando...")
client.disconnect()
station.disconnect()
print("Encerrado")
else:
print("Não foi possível conectar ao WiFi. Verifique a configuração e tente novamente.")