from machine import Pin, ADC
import network
import time
import dht
from umqtt.simple import MQTTClient
# ==================================================
# 1. CONFIGURACION WIFI
# ==================================================
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# ==================================================
# 2. CONFIGURACION THINGSPEAK MQTT
# Reemplazar por las credenciales propias
# ==================================================
MQTT_BROKER = "mqtt3.thingspeak.com"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "NzkDFg4dCBIFEzM1LywjCy4"
MQTT_USERNAME = "NzkDFg4dCBIFEzM1LywjCy4"
MQTT_PASSWORD = "z7v699gTAg+gmQwu9Z4t4Oyl"
CHANNEL_ID = "3549446"
MQTT_TOPIC = "channels/{}/publish".format(CHANNEL_ID)
KEEPALIVE = 60
PUBLISH_INTERVAL = 15
# ==================================================
# 3. CONFIGURACION DE SENSORES
# Wokwi: DHT22
# Fisico: cambiar a dht.DHT11(Pin(4))
# ==================================================
sensor = dht.DHT22(Pin(15))
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB)
# ==================================================
# 4. CONFIGURACION LED RGB
# Pines: 25 = Red, 26 = Green, 27 = Blue
# Este codigo supone un RGB de catodo comun
# ==================================================
rgb_red = Pin(25, Pin.OUT)
rgb_green = Pin(26, Pin.OUT)
rgb_blue = Pin(27, Pin.OUT)
def rgb_off():
rgb_red.off()
rgb_green.off()
rgb_blue.off()
def rgb_ok():
# Verde: publicacion correcta
rgb_red.off()
rgb_green.on()
rgb_blue.off()
def rgb_error():
# Rojo: error de conexion o publicacion
rgb_red.on()
rgb_green.off()
rgb_blue.off()
def rgb_connecting():
# Amarillo: intento de conexion
rgb_red.on()
rgb_green.on()
rgb_blue.off()
def rgb_ready():
# Azul: conectado, esperando publicacion
rgb_red.off()
rgb_green.off()
rgb_blue.on()
# ==================================================
# 5. OBJETOS DE CONECTIVIDAD
# ==================================================
wifi = network.WLAN(network.STA_IF)
mqtt_client = None
# ==================================================
# 6. CONEXION WIFI
# ==================================================
def connect_wifi():
wifi.active(True)
if wifi.isconnected():
return True
rgb_connecting()
print("Conectando a Wi-Fi...")
try:
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
for _ in range(20):
if wifi.isconnected():
print("Wi-Fi conectado")
print("Direccion IP:", wifi.ifconfig()[0])
rgb_ready()
return True
time.sleep(1)
except Exception as error:
print("Error Wi-Fi:", error)
print("No se pudo conectar a Wi-Fi")
rgb_error()
return False
# ==================================================
# 7. CONEXION BROKER MQTT
# ==================================================
def connect_mqtt():
global mqtt_client
rgb_connecting()
print("Conectando al broker MQTT...")
try:
client = MQTTClient(
client_id=MQTT_CLIENT_ID,
server=MQTT_BROKER,
port=MQTT_PORT,
user=MQTT_USERNAME,
password=MQTT_PASSWORD,
keepalive=KEEPALIVE
)
client.connect()
mqtt_client = client
print("Conexion MQTT establecida")
rgb_ready()
return True
except Exception as error:
print("Error MQTT:", error)
mqtt_client = None
rgb_error()
return False
# ==================================================
# 8. LECTURA DHT
# ==================================================
def read_dht():
try:
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
return temperatura, humedad
except Exception as error:
print("Error leyendo sensor DHT:", error)
return None, None
# ==================================================
# 9. LECTURA POTENCIOMETRO
# ==================================================
def read_potentiometer():
try:
raw = pot.read()
porcentaje = round(raw * 100 / 4095)
porcentaje = max(0, min(100, porcentaje))
return raw, porcentaje
except Exception as error:
print("Error leyendo potenciometro:", error)
return None, None
# ==================================================
# 10. CONSTRUCCION MENSAJE THINGSPEAK
# ==================================================
def build_payload(temperatura, humedad, nivel):
return "field1={:.1f}&field2={:.1f}&field3={}".format(
temperatura,
humedad,
nivel
)
# ==================================================
# 11. PUBLICACION MQTT
# ==================================================
def publish_data(payload):
try:
if mqtt_client is None:
return False
mqtt_client.publish(MQTT_TOPIC, payload)
print("Datos publicados:", payload)
return True
except Exception as error:
print("Error publicando datos:", error)
return False
# ==================================================
# 12. CIERRE DE SESION MQTT
# ==================================================
def disconnect_mqtt():
global mqtt_client
if mqtt_client is not None:
try:
mqtt_client.disconnect()
except Exception:
pass
mqtt_client = None
# ==================================================
# 13. CICLO PRINCIPAL
# ==================================================
def main():
global mqtt_client
print("Iniciando nodo sensor IoT...")
rgb_off()
while True:
try:
# Verificar Wi-Fi
if not wifi.isconnected():
disconnect_mqtt()
if not connect_wifi():
time.sleep(5)
continue
# Verificar conexion MQTT
if mqtt_client is None:
if not connect_mqtt():
time.sleep(5)
continue
# Leer sensores
temperatura, humedad = read_dht()
raw, nivel = read_potentiometer()
# Comprobar lecturas validas
if (temperatura is None or humedad is None
or raw is None or nivel is None):
print("Lectura invalida; se omite publicacion")
rgb_error()
time.sleep(5)
continue
print("------------------------------")
print("Temperatura:", temperatura, "C")
print("Humedad:", humedad, "%")
print("ADC:", raw)
print("Nivel analogico:", nivel, "%")
# Crear y publicar mensaje
payload = build_payload(
temperatura,
humedad,
nivel
)
if publish_data(payload):
rgb_ok()
else:
rgb_error()
disconnect_mqtt()
# Esperar antes de la siguiente publicacion
print("Proxima lectura en",
PUBLISH_INTERVAL, "segundos")
time.sleep(PUBLISH_INTERVAL)
except Exception as error:
print("Error general del sistema:", error)
disconnect_mqtt()
rgb_error()
time.sleep(5)
# ==================================================
# 14. EJECUCION
# ==================================================
main()Loading
esp32-devkit-c-v4
esp32-devkit-c-v4