""""
Tarea 3.
#Envío de datos mediante comunicación IoT.
Objetivo:
Consolidar la conexión inalámbrica del ESP32 y el envío de datos provenientes
de sensores mediante MQTT, cliente IoT o plataforma IoT, permitiendo
comprobar el flujo de información desde el dispositivo hasta un broker
o servicio de recepción de datos.
Pines utilizados: 12, 14, 34 y 27
Explicación del funconamiento:
Sistema IoT para Ahorro Energético en Aula:
Este sistema embebido toma decisiones locales basadas en la lectura de dos
entradas físicas: un sensor de luz LDR y un sensor de movimiento PIR.
Si el aula está oscura (valor menor al umbral de 2000) y además se detecta
movimiento (valor PIR = 1), el ESP32 activa los LEDs de advertencia e
iluminación. Adicionalmente, el sistema se conecta a una red Wi-Fi y
actúa como cliente MQTT.
Cada 3 segundos, publica un paquete de datos en formato JSON hacia el broker
de HiveMQ, lo que permite que el estado energético y de ocupación del aula
sea monitoreado de forma remota desde cualquier parte del mundo.
# Describir problemas encontrados:
Al inicio, el programa marcaba error al intentar conectarse al
servidor MQTT porque la red Wi-Fi aún no había terminado de asignar
una dirección IP.
# Solución aplicada:
Al revisar el ejemplo visto en clase, me di cuenta que había olvidado
implementar el ciclo while not wifi.isconnected():
con un retardo para obligar al ESP32 a esperar a que la conexión
a Internet sea exitosa antes de intentar buscar el Broker MQTT.
# Conclusión:
Durante el desarrollo de la práctica, comprendí el uso del Internet
de las Cosas (IoT), es decir, el cómo a partir de dispositivos físicos
como sensores se puede obtener información a través de internet.
Lo que más me gustó fue aprender que un sistema embebido no tiene
que estar aislado dado que al configurar la conexión Wi-Fi y el
protocolo MQTT se puede hacer que el dispositivo transmita sus
lecturas en tiempo real a una plataforma, lo que me permitió visualizar
cómo la tecnología puede ofrecer soluciones reales y permitir el monitoreo
a distancia para resolver problemas comunes como el desperdicio
energético en las aulas de nuestra escuela.
"""
# Código de Python
# IMPORTAR LIBRERÍAS
# Conectar la ESP32 a WIFI, ontrolar Pines, leer señales Analógicas (ADC) y medir el tiempo
import network # Conexión WIFI
import ujson # Para dar formato a los mensajes
from machine import Pin, ADC
from time import sleep
from umqtt.simple import MQTTClient # Para el protocolo IoT MQTT
# DEFINIR COMPONENTES
# Actudores LED: Configuración de los pines 12 y 14 como Salidas (OUT) para los LEDs
led1 = Pin(12, Pin.OUT)
led2 = Pin(14, Pin.OUT)
# Configuración del pin 34 para leer el sensor de luz
sensor_luz = ADC(Pin(34))
# Se indica a la placa que el sensor usa todo el voltaje (hasta 3.3V)
sensor_luz.atten(ADC.ATTN_11DB)
# Sensor PIR
pir = Pin(27, Pin.IN)
print("¡Sistema ESP32 de Advertencia Iniciado!")
umbral_luz=2000
# CONFIGURACIÓN DE RED Y MQTT
# Definir un identificador único para el dispositivo
ID_CLIENTE = "ESP32_Aula101_Bachillerato"
SERVIDOR_MQTT = "broker.hivemq.com" # Servidor público gratuito para pruebas
# Definir al menos un tópico de publicación
TOPICO_PUBLICACION = b"bachillerato/aula101/sensores"
# CONECTAR A WI-FI
print("Conectando a la red Wi-Fi...")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "") # Red por defecto en Wokwi
while not wifi.isconnected():
sleep(0.5)
print(".", end="")
print("\n¡Wi-Fi conectado con éxito!")
# CONECTAR A MQTT
print("Conectando al servidor MQTT...")
cliente = MQTTClient(ID_CLIENTE, SERVIDOR_MQTT)
cliente.connect()
print("¡Conectado al Broker MQTT!")
print("¡Sistema IoT de Iluminación Inteligente Iniciado!")
contador_mensajes = 0
# CICLO PRINCIPAL
while True:
# Leer sensores
nivel_de_luz = sensor_luz.read()
presencia = pir.value()
estado_lampara = ""
# Evaluar la condición lógica
if nivel_de_luz < umbral_luz and presencia == 1:
# Aula oscura y ocupada: Encendemos luces (parpadeo)
led1.value(1)
led2.value(0)
sleep(0.25)
led1.value(0)
led2.value(1)
sleep(0.25)
estado_lampara = "ENCENDIDA"
else:
# Hay suficiente luz o salón vacío: Apagamos luces
led1.value(0)
led2.value(0)
estado_lampara = "APAGADA"
# ENVIAR DATOS DEL SENSOR MEDIANTE MQTT
# Empaquetamos los datos en formato JSON para mayor claridad
datos = {
"nivel_luz": nivel_de_luz,
"presencia_detectada": presencia,
"estado_focos": estado_lampara
}
# Convertimos el diccionario a texto (string)
mensaje = ujson.dumps(datos)
# Publicamos el mensaje en el tópico definido
cliente.publish(TOPICO_PUBLICACION, mensaje)
# Publicar al menos cinco mensajes de prueba (contamos los envíos)
contador_mensajes += 1
print("--- Datos enviados ---")
print(f"Mensaje #{contador_mensajes}: {mensaje}")
# Esperamos 3 segundos antes del siguiente envío para no saturar el servidor
sleep(3)