# Importar librerías necesarias para conectividad, tiempo, hardware y MQTT
import network # Para conectar el ESP32 a una red Wi-Fi
import time # Para manejar retardos de tiempo
import machine # Para acceder a funciones específicas del hardware del ESP32
from machine import I2C, Pin # Para usar el bus I2C y pines del ESP32
import ubinascii # Para generar un identificador único del dispositivo
from umqtt.simple import MQTTClient # Cliente MQTT para MicroPython
import mpu6050 # Librería personalizada para leer el sensor MPU6050
# Configuración del bus I2C y creación del objeto del sensor MPU6050
i2c = I2C(scl=Pin(22), sda=Pin(21)) # Inicializa I2C con SCL en GPIO 22 y SDA en GPIO 21
mpu = mpu6050.accel(i2c) # Crea un objeto del sensor MPU6050 usando la interfaz I2C
# Credenciales de red Wi-Fi (Wokwi usa red abierta simulada)
SSID = 'Wokwi-GUEST' # Nombre de la red Wi-Fi
PASSWORD = '' # Contraseña (vacía en Wokwi)
# Configuración del usuario y clave de Adafruit IO
AIO_USERNAME = 'cbasay' # Tu nombre de usuario en Adafruit IO
AIO_KEY = 'aio_xVWi31sRwWxZaVqVYWhnpyxS5WUH' # Tu clave AIO para autenticarte
# Definición de los temas (feeds) MQTT de Adafruit IO
TOPIC_TEMP = AIO_USERNAME + '/feeds/temperatura' # Tema para datos de temperatura
TOPIC_AX = AIO_USERNAME + '/feeds/acelerometro_x' # Tema para aceleración en eje X
TOPIC_AY = AIO_USERNAME + '/feeds/acelerometro_y' # Tema para aceleración en eje Y
TOPIC_AZ = AIO_USERNAME + '/feeds/acelerometro_z' # Tema para aceleración en eje Z
# Función para conectar el ESP32 a Wi-Fi
def conectar_wifi():
wlan = network.WLAN(network.STA_IF) # Crea una interfaz Wi-Fi en modo estación
wlan.active(True) # Activa la interfaz Wi-Fi
wlan.connect(SSID, PASSWORD) # Inicia la conexión a la red Wi-Fi
print("Conectando a WiFi", end="") # Mensaje de conexión
while not wlan.isconnected(): # Espera hasta que se conecte
print(".", end="") # Imprime puntos mientras espera
time.sleep(0.5) # Espera medio segundo entre intentos
print(" Conectado!") # Mensaje cuando ya está conectado
# Función para conectar al broker MQTT de Adafruit IO
def conectar_mqtt():
client_id = ubinascii.hexlify(machine.unique_id()) # Genera un ID único para el cliente
client = MQTTClient(client_id, 'io.adafruit.com', user=AIO_USERNAME, password=AIO_KEY) # Crea cliente MQTT con credenciales
client.connect() # Conecta al broker de Adafruit IO
print("Conectado a Adafruit IO MQTT") # Mensaje de confirmación
return client # Retorna el objeto cliente MQTT
# Inicio del programa principal
conectar_wifi() # Llama a la función para conectarse a Wi-Fi
cliente = conectar_mqtt() # Conecta al servidor MQTT y guarda el cliente
while True:
# Lectura de datos del sensor MPU6050
datos = (mpu.get_values()) #Obtiene los datos de temperatura y aceleraciones
temp = datos["Tmp"] # Extrae la temperatura
ax = datos["AcX"] # Extrae aceleración eje X
ay = datos["AcY"] # Extrae aceleración eje Y
az = datos["AcZ"] # Extrae aceleración eje Z
# Conversión de datos a unidades legibles
temperatura = round(temp, 2) # Redondea la temperatura a 2 decimales
acelerometro_x = round(ax * 2 / 32767, 2) # Escala aceleración X a valores entre -2g y 2g
acelerometro_y = round(ay * 2 / 32767, 2) # Escala aceleración Y
acelerometro_z = round(az * 2 / 32767, 2) # Escala aceleración Z
# Imprime los datos por consola para monitoreo
print("Temperatura:", temperatura, " - ",
"Aceleración X:", acelerometro_x, " - ",
"Aceleración Y:", acelerometro_y, " - ",
"Aceleración Z:", acelerometro_z)
# Publicación de datos en los temas de Adafruit IO vía MQTT
cliente.publish(TOPIC_TEMP, str(temperatura)) # Publica la temperatura
cliente.publish(TOPIC_AX, str(acelerometro_x)) # Publica aceleración X
cliente.publish(TOPIC_AY, str(acelerometro_y)) # Publica aceleración Y
cliente.publish(TOPIC_AZ, str(acelerometro_z)) # Publica aceleración Z
time.sleep(5) # Espera 5 segundos antes de volver a leer y publicar