import network
import time
import ssl
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
# ── Parámetros HiveMQ Cloud ──────────────────────────────────────
MQTT_CLIENT_ID = "clientId-55atsYJHoT"
MQTT_BROKER = "62b7cc7c5261406d911e4bac1969850d.s1.eu.hivemq.cloud"
MQTT_PORT = 8883
MQTT_USER = "WeskerAlex"
MQTT_PASSWORD = "9268aB#!"
MQTT_TOPIC = "clima/alex"
MQTT_KEEPALIVE = 60
sensor = dht.DHT22(Pin(15))
# ── WiFi ─────────────────────────────────────────────────────────
def conectar_wifi():
sta_if = network.WLAN(network.STA_IF)
if sta_if.isconnected():
return sta_if
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
print("Conectando al WiFi", end="")
intentos = 0
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
intentos += 1
if intentos > 40:
print("\n[ERROR] Sin WiFi")
return None
print(" Conectado! IP:", sta_if.ifconfig()[0])
return sta_if
# ── MQTT con SSL en formato dict (compatible con MicroPython v1.22 Wokwi) ──
def conectar_mqtt():
print("Conectando a HiveMQ Cloud...", end="")
cliente = MQTTClient(
client_id=MQTT_CLIENT_ID,
server=MQTT_BROKER,
port=MQTT_PORT,
user=MQTT_USER,
password=MQTT_PASSWORD,
keepalive=MQTT_KEEPALIVE,
ssl=True, # <-- dict en lugar de SSLContext
ssl_params={"server_hostname": MQTT_BROKER}
)
try:
cliente.connect()
print(" Conectado!")
return cliente
except Exception as e:
codigos = {
1: "Version de protocolo no soportada",
2: "ClientID rechazado",
3: "Broker no disponible",
4: "Usuario o ClientID invalido",
5: "No autorizado — verifica user/password en HiveMQ Access Management"
}
codigo = e.args[0] if e.args else "?"
print("\n[MQTT Error {}]: {}".format(codigo, codigos.get(codigo, str(e))))
raise
# ── Inicio ───────────────────────────────────────────────────────
conectar_wifi()
client = conectar_mqtt()
prev_weather = ""
ultimo_ping = time.time()
# ── Loop principal ───────────────────────────────────────────────
while True:
try:
ahora = time.time()
if ahora - ultimo_ping >= 30:
client.ping()
ultimo_ping = ahora
print("[PING enviado]")
print("Midiendo... ", end="")
sensor.measure()
time.sleep(2)
temp = sensor.temperature()
hum = sensor.humidity()
if temp is None or hum is None:
print("Lectura invalida")
continue
if not (-40 <= temp <= 80) or not (0 <= hum <= 100):
print("Fuera de rango: temp={} hum={}".format(temp, hum))
continue
message = ujson.dumps({
"temperatura": round(temp, 1),
"humedad": round(hum, 1)
})
if message != prev_weather:
print("Enviando:", message)
client.publish(MQTT_TOPIC, message)
prev_weather = message
else:
print("Sin cambios")
except OSError as e:
print("\n[Error red]: {}".format(e))
time.sleep(3)
if conectar_wifi() is None:
time.sleep(10)
continue
try:
client = conectar_mqtt()
ultimo_ping = time.time()
except Exception as e2:
print("[Error reconexion]: {}".format(e2))
time.sleep(5)
time.sleep(3)