#if defined(ESP32)
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#elif defined(ESP8266)
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#define DEVICE "ESP8266"
#endif
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <time.h>
// ==== WiFi ====
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// ==== InfluxDB Cloud ====
#define INFLUXDB_URL "YOUR_INFLUXDB_URL"
#define INFLUXDB_TOKEN "YOUR_INFLUXDB_TOKEN"
#define INFLUXDB_ORG "YOUR_INFLUXDB_ORG"
#define INFLUXDB_BUCKET "YOUR_INFLUXDB_BUCKET"
// ==== Timezone ====
#define TZ_INFO "UTC-5"
// ==== InfluxDB Client ====
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
// ==== Punto de datos ====
Point sensor("YOUR_MEASURMENT_NAME");
// =============================
// CONFIGURACIÓN DEL MPU6050
// =============================
Adafruit_MPU6050 mpu;
// Pines I2C recomendados para ESP32-S3
#define I2C_SDA 8
#define I2C_SCL 9
// =============================
// CONFIGURACIÓN NTP
// =============================
#define TZ_INFO "UTC-5"
const char* ntpServer = "pool.ntp.org";
// =============================
// ESTADO GLOBAL DE CONEXIÓN
// =============================
bool influxConnected = false;
// =============================
// FUNCIONES
// =============================
// Conexión Wi-Fi
void connectWiFi() {
Serial.print("Conectando a WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi conectada!");
Serial.println(WiFi.localIP());
}
// Configurar hora por NTP
void setupTime() {
configTzTime(TZ_INFO, ntpServer);
Serial.println("⏰ Sincronizando hora con NTP...");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.print(".");
delay(500);
}
Serial.println("\n✅ Hora sincronizada correctamente");
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
// Intentar conexión a InfluxDB
bool connectInflux() {
Serial.print("🔗 Connecting to InfluxDB... ");
if (client.validateConnection()) {
Serial.print("✅ Connected to: ");
Serial.println(client.getServerUrl());
influxConnected = true;
return true;
} else {
Serial.println("❌ InfluxDB connection failed!");
Serial.print("Error message: ");
Serial.println(client.getLastErrorMessage());
Serial.print("HTTP status code: ");
Serial.println(client.getLastStatusCode());
influxConnected = false;
return false;
}
}
// =============================
// SETUP
// =============================
void setup() {
Serial.begin(115200);
delay(1000);
connectWiFi();
setupTime();
Wire.begin(I2C_SDA, I2C_SCL);
if (!mpu.begin(0x68, &Wire)) {
Serial.println("❌ No se pudo encontrar el MPU6050. Verifica conexiones.");
while (1);
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.println("✅ MPU6050 inicializado correctamente.");
sensor.addTag("device", "your-hardware-device");
sensor.addTag("location", "your-custom-location");
// Intentar conexión inicial a InfluxDB
connectInflux();
}
// =============================
// LOOP PRINCIPAL
// =============================
void loop() {
// Si no hay conexión a InfluxDB, intentar reconectar cada 10 segundos
if (!influxConnected) {
Serial.println("⚠️ No hay conexión con InfluxDB. Reintentando en 10 segundos...");
connectInflux();
delay(10000);
return; // Saltar el resto del loop hasta reconectar
}
// Obtener datos del sensor
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Preparar datos
sensor.clearFields();
sensor.addField("accel_x", a.acceleration.x);
sensor.addField("accel_y", a.acceleration.y);
sensor.addField("accel_z", a.acceleration.z);
sensor.addField("gyro_x", g.gyro.x);
sensor.addField("gyro_y", g.gyro.y);
sensor.addField("gyro_z", g.gyro.z);
sensor.addField("temperature", temp.temperature);
// Enviar a InfluxDB
if (!client.writePoint(sensor)) {
Serial.print("❌ Error al escribir en InfluxDB: ");
Serial.println(client.getLastErrorMessage());
influxConnected = false; // marcar conexión como caída
} else {
Serial.println("✅ Datos enviados correctamente a InfluxDB Cloud.");
}
delay(2000);
}