# main.py - Aplicacao MQTT no microcontrolador
# https://www.hivemq.com/demos/websocket-client/ ##########
import network
from umqtt.simple import MQTTClient
from machine import Pin, PWM ##########
import time
import json
import dht ##########
# ==== CONFIGURACOES - ALTERE AQUI ====
SSID = "Wokwi-GUEST" # Wi-Fi do Wokwi ########## MUDAR PARA NOME DA REDE (Adrian PocoX7 Pro)
SENHA = "" ############## <-- Wi-Fi: senha (adriansalvador)
BROKER = "broker.hivemq.com" ##########
PORTA = 1883
CLIENT_ID = "esp32-grupo6-zxcvbnm" ##############
TOPICO_ASSINAR = "pucpr/+/Comandos" ##############
# ESP32: pino 2
led = Pin(2, Pin.OUT, value = 0) ##########
led_estado = False
buzzer = PWM(Pin(21, Pin.OUT)) ##########
buzzer.duty(0) # Inicia desligado ##########
# ==== SENSORES ====
#DHT
sensor_dht = dht.DHT22(Pin(4)) ######## NO FISICO PRECISA TROCAR PRA DHT11 -> dht.DHT11(Pin(4))
def ler_dht(): ##########
sensor_dht.measure() ##########
return sensor_dht.temperature(), sensor_dht.humidity() ##########
trigger = Pin(5, Pin.OUT) ##########
echo = Pin(18, Pin.IN) ##########
#Ultrassônico
def medir_distancia(): ##########
trigger.value(0) ##########
time.sleep_us(2) ##########
trigger.value(1) ##########
time.sleep_us(10) ##########
trigger.value(0) ##########
pulse_start = time.ticks_us() ##########
pulse_end = time.ticks_us() ##########
while echo.value() == 0: ##########
pulse_start = time.ticks_us() ##########
while echo.value() == 1: ##########
pulse_end = time.ticks_us() ##########
pulse_duration = time.ticks_diff(pulse_end, pulse_start) ##########
distancia = (pulse_duration / 2) * 0.0343 ##########
return round(distancia, 2) ##########
# ---- Conexao Wi-Fi ----
def conectar_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("Conectando ao Wi-Fi...")
wlan.connect(SSID, SENHA)
tentativas = 0
while not wlan.isconnected() and tentativas < 20:
time.sleep(1)
tentativas += 1
print(f"Tentativa {tentativas}/20...")
if wlan.isconnected():
print(f"Wi-Fi conectado! IP: {wlan.ifconfig()[0]}")
return True
else:
print("ERRO: Nao foi possivel conectar ao Wi-Fi")
return False
# ---- Callback de mensagens recebidas ----
def callback_mensagem(topico, mensagem):
global led_estado
topico = topico.decode("utf-8")
payload = mensagem.decode("utf-8")
print(f"[MICRO] Recebido em '{topico}': {payload}")
try:
dados = json.loads(payload)
comando = dados.get("comando", "")
if comando == "led_on":
led.value(1) ##########
led_estado = True
print("[MICRO] LED ligado!")
publicar_estado_dht() ##########
publicar_estado_ultra() ##########
elif comando == "led_off": ##########
led.value(0) ##########
led_estado = False
print("[MICRO] LED desligado!") ##########
publicar_estado_dht() ##########
publicar_estado_ultra() ##########
elif comando == "buzzer_on":##########
buzzer.freq(300) ##########
buzzer.duty(300) ##########
print("[MICRO] Buzzer ligado!") ##########
publicar_estado_dht() ##########
publicar_estado_ultra() ##########
elif comando == "buzzer_off": ##########
buzzer.duty(0) ##########
print("[MICRO] Buzzer desligado!") ##########
publicar_estado_dht() ##########
publicar_estado_ultra() ##########
elif comando == "status":
publicar_dados_dht() ##########
publicar_dados_ultra() ##########
else:
print(f"[MICRO] Comando desconhecido: {comando}")
except Exception as e:
print(f"[MICRO] Erro ao processar: {e}")
# ---- Funcoes de publicacao ----
def publicar_estado_dht(): ##########
TOPICO_PUBLICAR = "pucpr/grupo_6_dht/dados" ##########
estado_l = "ligado" if led_estado else "desligado" ##########
msg = json.dumps({"led": estado_l}) ##########
client.publish(TOPICO_PUBLICAR, msg) ##########
print(f"[MICRO] Publicado: {msg}") ##########
def publicar_estado_ultra(): ##########
TOPICO_PUBLICAR = "pucpr/grupo_6_ultra/dados" ##########
estado_b = "ligado" if buzzer.duty() > 0 else "desligado" ##########
msg = json.dumps({"buzzer": estado_b}) ##########
client.publish(TOPICO_PUBLICAR, msg) ##########
print(f"[MICRO] Publicado: {msg}") ##########
# Leitura real em vez de random
def publicar_dados_dht(): ##########
TOPICO_PUBLICAR = "pucpr/grupo_6_dht/dados" ##########
temperatura, umidade = ler_dht() ##########
dados = { ##########
"temperatura": temperatura, ##########
"umidade": umidade, ##########
"led": "ligado" if led_estado else "desligado" ##########
} ##########
msg = json.dumps(dados) ##########
client.publish(TOPICO_PUBLICAR, msg) ##########
print(f"[MICRO] Dados publicados: {msg}") ##########
def publicar_dados_ultra(): ##########
TOPICO_PUBLICAR = "pucpr/grupo_6_ultra/dados" ##########
distancia = medir_distancia() ##########
dados = { ##########
"distancia": distancia, ##########
"buzzer": "ligado" if buzzer.duty() > 0 else "desligado" ##########
} ##########
msg = json.dumps(dados)
client.publish(TOPICO_PUBLICAR, msg)
print(f"[MICRO] Dados publicados: {msg}")
# ---- Conexao e loop principal ----
if not conectar_wifi():
print("Abortando: sem Wi-Fi.")
raise SystemExit
print("[MICRO] Conectando ao broker MQTT...")
client = MQTTClient(CLIENT_ID, BROKER, port=PORTA)
client.set_callback(callback_mensagem)
client.connect()
print(f"[MICRO] Conectado a {BROKER}")
client.subscribe(TOPICO_ASSINAR)
print(f"[MICRO] Inscrito em: {TOPICO_ASSINAR}")
print("[MICRO] Aguardando comandos...\n")
# Loop principal
contador = 0
try:
while True:
client.check_msg()
# A cada 30 segundos, publica dados automaticamente
contador += 1
if contador >= 30:
publicar_dados_dht() ##########
publicar_dados_ultra() ##########
contador = 0
time.sleep(1)
except KeyboardInterrupt:
print("\n[MICRO] Interrompido pelo usuario.")
finally:
client.disconnect()
print("[MICRO] Desconectado do broker.")