import network #Importa el módulo network, que permite controlar la interfaz WiFi del ESP32.
import urequests as requests #Importa el módulo urequests y lo renombra como requests, para hacer peticiones HTTP.
import time #Importa el módulo time, para ejecutar las pausas entre lecturas y reintentos.
from machine import Pin, I2C, #Importa desde el módulo machine las clases Pin para configurar pines GPIO e I2C usado por el MPU6050.
import mpu6050 #Importa la librería mpu6050, que contiene las funciones para comunicarse con el sensor MPU6050 vía I2C.
# Conexión a WiFi
ssid = "Wokwi-GUEST" #Define la variable ssid con el nombre de la red WiFi a la que se conectará.
password = "" #Define la variable password como cadena vacía, ya que la red Wokwi-GUEST no requiere contraseña.
wifi = network.WLAN(network.STA_IF) #Crea un objeto wifi configurado para conectarse a un punto de acceso existente
wifi.active(True) #Activa la interfaz WiFi, enciende el módulo WiFi del ESP32.
wifi.connect(ssid, password) #Inicia el intento de conexión a la red especificada, usando el ssid y password definidos arriba.
while not wifi.isconnected(): #Bucle que se repite mientras la conexión WiFi no se haya establecido, esperando 1 segundo entre cada verificación.
time.sleep(1)
i2c = I2C(scl = Pin(22), sda = Pin(21)) #Crea el objeto i2c, definiendo el pin 22 como línea de reloj y el pin 21 como línea de datos del ESP32.
# Configuración de Adafruit IO
AIO_USERNAME = "Alexonza" #Se establece el nombre de usuario de Adafruit IO.
AIO_KEY = "aio_Cyvk47rY8SePvwcvYkaarxSzZn3x" #Se establece el Key de Adafruit IO.
FEED_NAME = "temp" #Se establece el feed que utilizara para obtener datos Adafruit IO.
# Función genérica: recibe el NOMBRE del feed y el valor a enviar
def enviar_dato(feed_name, valor): #Define la función que envía un valor a un feed específico de Adafruit IO.
#Construye la URL de Adafruit IO para el feed indicado, insertando el usuario y el nombre del feed.
url = f"https://io.adafruit.com/api/v2/{AIO_USERNAME}/feeds/{feed_name}/data"
headers = {"X-AIO-Key": AIO_KEY, "Content-Type": "application/json"} #Define la clave de autenticación (X-AIO-Key) y el tipo de contenido (JSON).
data = {"value": valor} #Crea el cuerpo de la petición con el valor a enviar.
#Intenta hacer la petición con los datos y cabeceras definidos, y cierra la respuesta para liberar recursos de red, si ocurre un error lo captura y lo imprime.
try:
response = requests.post(url, json=data, headers=headers)
response.close()
except Exception as e:
print("Error enviando a", feed_name, ":", e)
#Define un diccionario que relaciona un nombre descriptivo con la clave usada internamente en valores (los datos crudos del MPU6050).
FEEDS = {
"temperatura": "Tmp",
"giroscopio-x": "GyX",
"giroscopio-y": "GyY",
"giroscopio-z": "GyZ",
"aceleracion-x": "AcX",
"aceleracion-y": "AcY",
"aceleracion-z": "AcZ",
}
mpu = mpu6050.accel(i2c) #Crea el objeto mpu, inicializando el sensor MPU6050 sobre el bus I2C configurado antes.
while True: #Inicia un bucle infinito, el programa leerá el sensor y enviará datos continuamente.
valores = mpu.get_values() #Lee los valores crudos del sensor y los guarda en un diccionario.
#Extrae cada valor crudo y lo convierte a unidades reales.
tem = valores["Tmp"]
gyz = valores["GyZ"] / 131.0
gyy = valores["GyY"] / 131.0
gyx = valores["GyX"] / 131.0
acz = valores["AcZ"] / 16384.0
acy = valores["AcY"] / 16384.0
acx = valores["AcX"] / 16384.0
#Imprime en consola los valores leídos y convertidos, con un separador visual, para monitorear el sensor en tiempo real.
print("Temperatura: ", tem, "°C")
print("Giroscopio eje X (°/s): ", gyx)
print("Giroscopio eje Y (°/s): ", gyy)
print("Giroscopio eje Z (°/s): ", gyz)
print("Aceleracion eje X (g): ", acx)
print("Aceleracion eje Y (g): ", acy)
print("Aceleracion eje Z (g): ", acz)
print("-----------------------")
#Arma un diccionario donde cada clave coincide con el nombre del feed en Adafruit IO, para poder iterarlo y enviarlo fácilmente.
valores_convertidos = {
"temperatura": tem,
"giroscopio-x": gyx,
"giroscopio-y": gyy,
"giroscopio-z": gyz,
"aceleracion-x": acx,
"aceleracion-y": acy,
"aceleracion-z": acz,
}
#Recorre el diccionario y llama a enviar_dato por cada par feed/valor, subiendo así los 7 valores a sus respectivos feeds en Adafruit IO.
for feed_name, valor in valores_convertidos.items():
enviar_dato(feed_name, valor)
time.sleep(20) #Pausa 20 segundos antes de repetir el ciclo de medición, para no saturar el servidor Adafruit.