#include <Adafruit_MPU6050.h> // Incluye la librería para el sensor MPU6050
#include <Adafruit_Sensor.h> // Incluye la librería base para sensores Adafruit
#include <Wire.h> // Incluye la librería para la comunicación I2C
#include <WiFi.h> // Incluye la librería para manejar la conectividad WiFi
#include <PubSubClient.h> // Incluye la librería para manejar la conectividad MQTT
// MPU6050
Adafruit_MPU6050 mpu; // Crea una instancia del objeto MPU6050
// WiFi
const char* ssid = "Wokwi-GUEST"; // SSID de la red WiFi a la que se conectará
const char* password = ""; // Contraseña de la red WiFi (vacía en este caso)
// MQTT
const char* mqtt_server = "io.adafruit.com"; // Dirección del servidor MQTT
const char* mqtt_username = "japs1989"; // Nombre de usuario para la autenticación en MQTT
const char* mqtt_password = "aio_vGTT60mOTFAVGqwX5S1wjVJt2Uyw"; // Contraseña para la autenticación en MQTT
// MQTT Topics
const char* TOPIC_ACCEL_X = "japs1989/f/Accel_X"; // Tópico MQTT para el eje X del acelerómetro
const char* TOPIC_ACCEL_Y = "japs1989/f/Accel_Y"; // Tópico MQTT para el eje Y del acelerómetro
const char* TOPIC_ACCEL_Z = "japs1989/f/Accel_Z"; // Tópico MQTT para el eje Z del acelerómetro
const char* TOPIC_TEMP = "japs1989/f/Temp"; // Tópico MQTT para la temperatura
WiFiClient espClient; // Crea un objeto cliente para manejar la conexión WiFi
PubSubClient client(espClient); // Crea un objeto cliente para manejar la conexión MQTT utilizando el cliente WiFi
void setup_wifi() {
delay(10); // Espera 10 ms
Serial.print("Conectando a ");
Serial.println(ssid); // Imprime el SSID de la red a la que se intenta conectar
WiFi.mode(WIFI_STA); // Configura el modo WiFi como estación (cliente)
WiFi.begin(ssid, password); // Inicia la conexión a la red WiFi
while (WiFi.status() != WL_CONNECTED) { // Espera a que se establezca la conexión WiFi
delay(500); // Espera 500 ms
Serial.print("."); // Imprime un punto para indicar que está intentando conectar
}
Serial.println("");
Serial.println("WiFi conectado"); // Indica que la conexión WiFi se ha establecido
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // Imprime la dirección IP asignada
}
void reconnect() {
while (!client.connected()) { // Mientras el cliente MQTT no esté conectado
Serial.println("Intentando conexión MQTT ..."); // Imprime que se está intentando conectar a MQTT
String clientId = "esp32-mpu6050-clientId-"; // Crea un ID de cliente único
clientId += String(random(0xffff), HEX); // Añade un número aleatorio al ID del cliente
if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) { // Intenta conectar al servidor MQTT
Serial.println("Conectado"); // Indica que se ha conectado exitosamente
} else {
Serial.print("Conexión fallida: ");
Serial.print(client.state()); // Imprime el estado de la conexión fallida
Serial.println(" Intente en 5 segundos"); // Indica que intentará de nuevo en 5 segundos
delay(5000); // Espera 5 segundos antes de intentar de nuevo
}
}
}
void setup() {
Serial.begin(115200); // Inicia la comunicación serial a 115200 baudios
if (!mpu.begin()) { // Intenta iniciar el sensor MPU6050
Serial.println("No se pudo encontrar un sensor MPU6050, revise las conexiones"); // Indica que no se encontró el sensor
while (1) {
delay(10); // Espera indefinidamente
}
}
setup_wifi(); // Llama a la función para configurar la conexión WiFi
client.setServer(mqtt_server, 1883); // Configura el servidor MQTT y el puerto (1883 por defecto)
}
void loop() {
if (!client.connected()) { // Si el cliente MQTT no está conectado
reconnect(); // Llama a la función para reconectar
}
client.loop(); // Mantiene la conexión MQTT
sensors_event_t acc, gyro, temp; // Declara variables para almacenar eventos de sensor
mpu.getEvent(&acc, &gyro, &temp); // Obtiene datos del sensor MPU6050
client.publish(TOPIC_ACCEL_X, String(acc.acceleration.x, 2).c_str()); // Publica el valor del eje X del acelerómetro en el tópico correspondiente
client.publish(TOPIC_ACCEL_Y, String(acc.acceleration.y, 2).c_str()); // Publica el valor del eje Y del acelerómetro en el tópico correspondiente
client.publish(TOPIC_ACCEL_Z, String(acc.acceleration.z, 2).c_str()); // Publica el valor del eje Z del acelerómetro en el tópico correspondiente
client.publish(TOPIC_TEMP, String(temp.temperature, 2).c_str()); // Publica el valor de la temperatura en el tópico correspondiente
delay(10000); // Espera 10 segundos antes de la próxima iteración del loop
}