import network
import time
from machine import SoftI2C
import ssd1306
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
#Parametrizar el servidor MQTT.
MQTT_CLIENT_ID = "micropython-weather-demo_chaux"
#MQTT_BROKER = "66.29.142.107"
MQTT_BROKER = "broker.emqx.io"
MQTT_PORT = 1883 #Puerto por defecto sin SSL
MQTT_USER = ""
MQTT_PASSWORD = ""
# Configurar SoftI2C (SDA en GPIO21, SCL en GPIO22)
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))
# Inicializar la pantalla OLED (128x64)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Limpiar la pantalla antes de comenzar
oled.fill(0)
#Configuración del sensor DHT22.
sensor = dht.DHT22(Pin(19))
# Configurar el pin GPIO 2 como salida
led = Pin(32, Pin.OUT)
# Tópicos MQTT
MQTT_TOPIC_SUB = "var1234/rele"
MQTT_TOPIC_PUB = "var1234/temphum"
# Conectar a la red Wi-Fi
estado_rele=0
def connect_wifi():
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect("Wokwi-GUEST", '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Función de callback para cuando recibimos un mensaje
def mqtt_callback(topic, msg):
global estado_rele
topic_str = topic.decode('utf-8')
msg_str = msg.decode('utf-8')
print(f'Recibido mensaje en {topic_str}: {msg_str}')
if msg_str == 'on':
# Encender el LED
led.on()
estado_rele=1
if msg_str == 'off':
# Apagar el LED
led.off()
estado_rele=0
publish_message(client, message)
# Configuración y conexión al broker MQTT
def connect_mqtt():
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, port=MQTT_PORT, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
print('Conectado al broker MQTT')
return client
# Publicar un mensaje
def publish_message(client, message):
client.publish(MQTT_TOPIC_PUB, message)
# Suscribirse a un tema
def subscribe_topic(client):
client.subscribe(MQTT_TOPIC_SUB)
print(f'Suscrito al tema {MQTT_TOPIC_SUB}')
#Bucle Principal.
prev_weather = ""
try:
connect_wifi()
client = connect_mqtt()
subscribe_topic(client)
while True:
client.check_msg() # Verifica si hay mensajes sin bloquear el loop
sensor.measure()
temp_mensaje="Temp: " + str(sensor.temperature()) + " C"
hum_mensaje="Humedad: " + str(sensor.humidity()) + " %"
rele_mensaje="Rele2: " + str(estado_rele)
oled.text(temp_mensaje, 0, 0)
oled.text(hum_mensaje, 0, 20)
oled.text(rele_mensaje, 0, 40)
oled.show()
message = ujson.dumps({
"temperatura": sensor.temperature(),
"humedad": sensor.humidity(),
"rele": estado_rele,
})
if message != prev_weather: #Solo publica cuando el dato a cambiado
publish_message(client, message)
print(message)
prev_weather = message
time.sleep(1)
oled.fill(0)
except OSError as e:
print('Error de conexión', e)