#include <WiFi.h>
#include <WiFiMulti.h>
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_MPU6050.h>
#include <DHT.h>
#include <math.h>
// ----------- DEFINICIONES DE PINES Y SENSORES -----------
#define DHTPIN 13 // Pin de datos del DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT
#define MPU6050_SDA 21 // Pin SDA del MPU6050
#define MPU6050_SCL 22 // Pin SCL del MPU6050
#define LED_PIN 23 // Pin del LED indicador
// ----------- CONFIGURACIÓN WIFI E INFLUXDB -----------
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define INFLUXDB_URL "https://us-east-1-1.aws.cloud2.influxdata.com"
#define INFLUXDB_TOKEN "0oybpUZ4iFosKxNK16BmTIT3QmuItMmdE8GXYArZYliUDCCKJqF2F0aUkVIAK7oXOmBYKeqjCHEWFx4wmBBuTg=="
#define INFLUXDB_ORG "a154d1ab183036d8"
#define INFLUXDB_BUCKET "Sara"
#define TZ_INFO "UTC-5"
// ----------- OBJETOS GLOBALES -----------
WiFiMulti wifiMulti;
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
Point sensor("ST"); // Punto de medición con nombre de serie temporal
DHT dht(DHTPIN, DHTTYPE);
Adafruit_MPU6050 mpu;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// Conexión WiFi
WiFi.mode(WIFI_STA);
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Conectando a WiFi");
while (wifiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println("\nConectado a WiFi");
// Sincronización horaria
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
// Validar conexión a InfluxDB
if (client.validateConnection()) {
Serial.print("Conectado a InfluxDB: ");
Serial.println(client.getServerUrl());
} else {
Serial.print("Fallo de conexión a InfluxDB: ");
Serial.println(client.getLastErrorMessage());
}
// Inicializar sensores
dht.begin();
if (!mpu.begin()) {
Serial.println("ERROR: No se encontró el MPU6050");
while (1) delay(10);
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
delay(2000); // Tiempo para estabilizar sensores
}
void loop() {
// Lectura de temperatura y humedad
float h = dht.readHumidity();
float t = dht.readTemperature();
// Verificar si las lecturas son válidas
if (isnan(h) || isnan(t)) {
Serial.println("Error al leer del sensor DHT22");
delay(2000);
return;
}
// Lectura del MPU6050
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Calcular magnitud de aceleración
float magnitude = sqrt(
a.acceleration.x * a.acceleration.x +
a.acceleration.y * a.acceleration.y +
a.acceleration.z * a.acceleration.z
);
// Control del LED basado en temperatura
digitalWrite(LED_PIN, t > 25 ? HIGH : LOW);
// Preparar datos para InfluxDB
sensor.clearFields();
sensor.addField("Temperatura", t);
sensor.addField("Humedad", h);
sensor.addField("AcceX", a.acceleration.x);
sensor.addField("AcceY", a.acceleration.y);
sensor.addField("AcceZ", a.acceleration.z);
sensor.addField("Aceleracion_total", magnitude);
sensor.addTag("device", "ESP32"); // Etiqueta opcional para identificar origen
// Enviar datos
if (client.writePoint(sensor)) {
Serial.println("Datos enviados a InfluxDB:");
Serial.printf("Temperatura: %.2f °C\n", t);
Serial.printf("Humedad: %.2f %%\n", h);
Serial.printf("Aceleración total: %.2f m/s²\n\n", magnitude);
} else {
Serial.print("Error al escribir en InfluxDB: ");
Serial.println(client.getLastErrorMessage());
}
delay(2000); // Espera entre lecturas
}