import network
import time
import machine
import ubinascii
from umqtt.simple import MQTTClient
from machine import Pin
import dht
# Configurações da rede Wi-Fi
SSID = "Wokwi-GUEST"
PASSWORD = ""
MQTT_SERVER = "test.mosquitto.org"
DHT_PIN = 15
LED_PIN = 13
# Configuração do sensor DHT22 e LED
dht_sensor = dht.DHT22(Pin(DHT_PIN))
led = Pin(LED_PIN, Pin.OUT)
# Inicializa o LED como desligado
led.value(0)
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print('Connecting to WiFi...')
while not wlan.isconnected():
time.sleep(1)
print('.', end='')
print()
print('Connected to WiFi')
print('IP:', wlan.ifconfig()[0])
# Callback para tratar mensagens MQTT
def mqtt_callback(topic, msg):
print(f"Message received: {msg.decode()} on topic: {topic.decode()}")
if topic == b"iot/alarm":
if msg == b'ON':
led.value(1)
print("LED ON")
elif msg == b'OFF':
led.value(0)
print("LED OFF")
# Função para conectar e subscrever ao broker MQTT
def connect_mqtt(client):
print(f"Connecting to MQTT Broker: {MQTT_SERVER}")
while True:
try:
client.connect()
client.subscribe(b"iot/alarm")
print("Connected to MQTT Broker")
return
except OSError as e:
print(f"Failed to connect or subscribe to MQTT broker ({e}). Retrying in 5 seconds...")
time.sleep(5)
# Função principal
def main():
connect_wifi()
client_id = ubinascii.hexlify(machine.unique_id()).decode() # Gera um ID de cliente único
client = MQTTClient(client_id, MQTT_SERVER)
client.set_callback(mqtt_callback)
connect_mqtt(client)
last_msg = 0
while True:
try:
client.check_msg()
now = time.ticks_ms()
if time.ticks_diff(now, last_msg) > 2000:
last_msg = now
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
temp_str = f"{temp:.2f}"
hum_str = f"{hum:.1f}"
print(f'Temperature: {temp_str}, Humidity: {hum_str}')
client.publish(b"iot/temperature", temp_str)
client.publish(b"iot/humidity", hum_str)
time.sleep(0.1)
except OSError as e:
print(f"Connection to MQTT broker lost ({e}). Reconnecting...")
connect_mqtt(client)
# Execução do código principal
if __name__ == "__main__":
main()