#include <WiFi.h>
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#include <LiquidCrystal_I2C.h>
// ── Configuración WiFi ──────────────────────────────────
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// ── Configuración InfluxDB Cloud ────────────────────────
#define INFLUXDB_URL "https://us-east-1-1.aws.cloud2.influxdata.com"
#define INFLUXDB_TOKEN "QJgnqE02YGaxl2-Q6LiFWTicJf2BaTARj0mo4PusUD2WYkramdo7-piZ6Lfm55fTF2Hw4z-MzgrF1k1y0NDwhw=="
#define INFLUXDB_ORG "9ea3a21a2b21ef6e"
#define INFLUXDB_BUCKET "trabajoiot"
// Zona horaria (Colombia UTC-5)
#define TZ_INFO "CST-5"
// ── Pines ────────────────────────────────────────────────
#define PIN_POTE 35 // Potenciómetro
#define PIN_LDR 34 // Fotorresistor (LDR)
// ── Cliente InfluxDB ─────────────────────────────────────
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG,
INFLUXDB_BUCKET, INFLUXDB_TOKEN,
InfluxDbCloud2CACert);
// Punto de dato (measurement)
Point sensor("lecturas");
// ── Pantalla LCD ─────────────────────────────────────────
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección típica 0x27, 16x2
// ────────────────────────────────────────────────────────
void conectarWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Conectando a WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado. IP: " + WiFi.localIP().toString());
}
// ────────────────────────────────────────────────────────
void setup() {
Serial.begin(115200);
// Conectar WiFi
conectarWiFi();
// Sincronizar hora NTP (necesario para InfluxDB)
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
// Agregar etiquetas al punto de dato
sensor.addTag("dispositivo", "ESP32-Wokwi");
sensor.addTag("realizadoPor", "Juan Diego Bohorquez Orduz - IoT");
// Verificar conexión con InfluxDB
if (client.validateConnection()) {
Serial.println("Conectado a InfluxDB: " + client.getServerUrl());
} else {
Serial.println("Error InfluxDB: " + client.getLastErrorMessage());
}
// Inicializar LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema IoT listo");
}
// ────────────────────────────────────────────────────────
void loop() {
// Leer potenciómetro
int valorPote = analogRead(PIN_POTE);
float voltaje = (valorPote / 4095.0) * 3.3;
// Leer fotorresistor (LDR)
int valorLDR = analogRead(PIN_LDR);
float intensidadLuz = (valorLDR / 4095.0) * 100.0; // Escalado a %
// Enviar a InfluxDB
sensor.clearFields();
sensor.addField("voltaje", voltaje);
sensor.addField("pote_raw", valorPote);
sensor.addField("ldr_raw", valorLDR);
sensor.addField("luz_pct", intensidadLuz);
if (!client.writePoint(sensor)) {
Serial.println("Error escritura InfluxDB: " + client.getLastErrorMessage());
} else {
Serial.println("Dato enviado a InfluxDB correctamente.");
Serial.println(sensor.toLineProtocol()); // Para depuración
}
// Mostrar en LCD (sin limpiar toda la pantalla para evitar parpadeo)
lcd.setCursor(0,0);
lcd.print("Pote: ");
lcd.print(voltaje, 2);
lcd.print(" V "); // espacios para borrar restos
lcd.setCursor(0,1);
lcd.print("Luz: ");
lcd.print(intensidadLuz, 1);
lcd.print(" % ");
delay(2000); // Enviar cada 5 segundos
}