import network
import json
import dht
import time
from machine import Pin
from umqtt.simple import MQTTClient
# --- Configurações Wi-Fi e MQTT ---
SSID, PASS = "Wokwi-GUEST", ""
BROKER = "broker.emqx.io"
PORT = 1883
TOPIC_DADOS = b"pucpr/iot"
TOPIC_CMD = b"pucpr/led"
# --- Conexão Wi-Fi ---
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASS)
print("Conectando ao Wi-Fi...")
for i in range(10):
if wlan.isconnected():
break
time.sleep(1)
print(".", end="")
if not wlan.isconnected():
print("\nFalha na conexão Wi-Fi")
else:
print("\nConectado ao Wi-Fi! IP:", wlan.ifconfig()[0])
# --- Hardware ---
sensor = dht.DHT22(Pin(2))
led = Pin(4, Pin.OUT)
LIMIAR = 28.0
manual_override = None # Nenhum comando manual ativo inicialmente
# --- Função para publicar dados ---
def publicar_dados(t, u, estado_led):
if client is None:
print("MQTT não disponível - Simulando publicação")
return
payload = {
"t": round(t, 1),
"u": round(u, 1),
"led": estado_led,
"timestamp": time.time()
}
try:
client.publish(TOPIC_DADOS, json.dumps(payload))
print("✓ Dados publicados:", payload)
except Exception as e:
print("Erro ao publicar:", e)
# --- Função para processar comandos MQTT ---
def sub_callback(topic, msg):
global manual_override
comando = msg.decode().lower()
print(f"Recebido comando -> {topic}: {comando}")
if comando == "on":
manual_override = 1
led.value(1)
print("LED ligado manualmente")
elif comando == "off":
manual_override = 0
led.value(0)
print("LED desligado manualmente")
elif comando == "auto":
manual_override = None
print("Controle automático do LED reativado")
else:
print("Comando inválido! Use 'on', 'off' ou 'auto'.")
# --- Conexão MQTT ---
client_id = b"esp32_wokwi"
try:
client = MQTTClient(client_id, BROKER, port=PORT, keepalive=30)
client.set_callback(sub_callback)
client.connect()
client.subscribe(TOPIC_CMD)
print("Conectado ao broker e inscrito no tópico de comando!")
except Exception as e:
print("Erro MQTT:", e)
client = None
# --- Loop principal ---
while True:
try:
# Processa mensagens recebidas
if client:
client.check_msg()
# Leitura do sensor
sensor.measure()
temperatura = sensor.temperature()
umidade = sensor.humidity()
# Controle automático do LED só se não houver comando manual
if manual_override is None:
estado_led = 1 if temperatura >= LIMIAR else 0
led.value(estado_led)
else:
estado_led = manual_override
# Exibe no console
print(f"Temp: {temperatura:.1f}°C, Umidade: {umidade:.1f}%, LED: {estado_led}")
# Publica dados sempre
publicar_dados(temperatura, umidade, estado_led)
except Exception as e:
print("Erro:", e)
time.sleep(2)