# ============================================================
# Publicación de temperatura y humedad a ThingSpeak mediante MQTT
# Plataforma: ThinkSpeak + ESP32 + MicroPython + sensor DHT22
# ============================================================
# Librería para manejar la conexión WiFi del ESP32
import network
# Librería para pausas de tiempo dentro del programa
import time
# Pin permite indicar en qué GPIO está conectado el sensor
from machine import Pin
# Librería para utilizar sensores DHT11/DHT22
import dht
# Cliente MQTT ligero compatible con MicroPython
from umqtt.simple import MQTTClient
# ------------------------------------------------------------
# Parámetros de conexión ThingSpeak MQTT
# ------------------------------------------------------------
# Sustituye estos 3 valores con las credenciales MQTT de tu dispositivo en ThingSpeak
THINGSPEAK_CLIENT_ID = "MRAACzY6LzkbJCsBMwwvLTg"
THINGSPEAK_USERNAME = "MRAACzY6LzkbJCsBMwwvLTg"
THINGSPEAK_PASSWORD = "BzjKv/dSjDYDc4BBflLVXc+F"
# Sustituye estos 2 valores con los datos de tu canal de ThingSpeak
THINGSPEAK_CHANNEL_ID = "3508204"
THINGSPEAK_WRITE_API_KEY = "NACH3RY8QOFCMPEN"
# Servidor MQTT oficial de ThingSpeak
MQTT_BROKER = "mqtt3.thingspeak.com"
# Construcción del tópico MQTT para publicar en ThingSpeak
MQTT_TOPIC = "channels/{}/publish".format(THINGSPEAK_CHANNEL_ID)
# ------------------------------------------------------------
# Configuración del sensor DHT22
# ------------------------------------------------------------
# El sensor DHT22 se conecta al pin GPIO 15 del ESP32.
sensor = dht.DHT22(Pin(15))
# ------------------------------------------------------------
# Configuración del fotoresistor
# ------------------------------------------------------------
# El sensor DHT22 se conecta al pin GPIO 15 del ESP32.
sensor_1 = dht.DHT22(Pin(16))
# ------------------------------------------------------------
# Conexión a la red WiFi simulada de Wokwi
# ------------------------------------------------------------
print("Conectando a WiFi", end="")
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(" Conectado!")
# ------------------------------------------------------------
# Conexión al bróker MQTT de ThingSpeak
# ------------------------------------------------------------
print("Conectando al servidor MQTT de ThingSpeak... ", end="")
# Creación del cliente MQTT con autenticación
client = MQTTClient(
client_id=THINGSPEAK_CLIENT_ID,
server=MQTT_BROKER,
user=THINGSPEAK_USERNAME,
password=THINGSPEAK_PASSWORD,
port=1883
)
client.connect()
print("Conectado!")
# ------------------------------------------------------------
# Ciclo principal de medición y publicación
# ------------------------------------------------------------
while True:
try:
print("\nMidiendo condiciones del ambiente... ", end="")
# El sensor realiza la medición actual
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print("Temp: {}°C, Humedad: {}%".format(temp, hum))
# Formato de payload requerido por ThingSpeak: field1=VALOR&field2=VALOR&api_key=LLAVE
payload = "field1={}&field2={}&api_key={}".format(
temp,
hum,
THINGSPEAK_WRITE_API_KEY
)
print("Reportando a ThingSpeak (Tópico: {}): {}".format(MQTT_TOPIC, payload))
# Publicación del mensaje en el tópico de ThingSpeak
client.publish(MQTT_TOPIC, payload)
print("¡Datos enviados correctamente!")
except Exception as e:
print("Error en el ciclo de envío:", e)
# Pausa estricta de 20 segundos para cumplir la tasa máxima de ThingSpeak
print("Esperando 20 segundos para la siguiente publicación...")
time.sleep(20)