#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <ThingerESP32.h>
// Credenciales de WiFi simuladas para el entorno de Wokwi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Definiciones de Thinger.io
#define USERNAME "luis2002"
#define DEVICE_ID "sensores"
#define DEVICE_CREDENTIAL "123456789"
ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
// Constantes para sensores
#define TEMPSENSORPIN 32 // Pin analógico para sensor de temperatura (simulación)
#define PHSENSORPIN 34 // Pin analógico para sensor de pH (simulación)
#define TURBIDITYPIN 35 // Pin analógico para sensor de turbidez (simulación)
#define LEDPIN 13 // Pin digital para LED
#define LCD_ADDR 0x27 // Dirección del LCD
// Límites seguros
const float SAFE_TEMP_MIN = 25; // Límite seguro mínimo para la temperatura de la piscina (25°C)
const float SAFE_TEMP_MAX = 28; // Límite seguro máximo para la temperatura de la piscina (28°C)
const float SAFE_PH_MIN = 6.5; // Límite seguro mínimo para el pH (6.5)
const float SAFE_PH_MAX = 8.5; // Límite seguro máximo para el pH (8.5)
const float SAFE_TURBIDITY_MAX = 5; // Límite seguro máximo para la turbidez (5 NTU)
// Inicializar la pantalla LCD (esto es lo que faltaba)
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);
void setup() {
Serial.begin(115200); // Configurar la velocidad de transmisión
// Conectar a WiFi (simulado)
WiFi.begin(ssid, password);
Serial.print("Conectando a WiFi...");
// Esperar conexión
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("Conectado a WiFi");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
// Configuración de sensores y componentes de alerta
pinMode(TEMPSENSORPIN, INPUT);
pinMode(PHSENSORPIN, INPUT);
pinMode(TURBIDITYPIN, INPUT);
pinMode(LEDPIN, OUTPUT);
// Inicializar la pantalla LCD
lcd.init(); // Inicializa la pantalla LCD
lcd.backlight(); // Enciende la luz de fondo del LCD
lcd.print("Sistema iniciado");
delay(2000);
lcd.clear();
Serial.println("Sistema de Monitoreo Inteligente de Calidad del Agua Iniciado");
// Configuración de Thinger.io
thing.add_wifi("Wokwi-GUEST", "");
}
void checkLimits(float temperature, float pH, float turbidity) {
bool alert = false;
lcd.clear();
lcd.setCursor(0, 0);
// Verificar si la temperatura está fuera del rango de la piscina
if (temperature < SAFE_TEMP_MIN) {
Serial.println("Alerta: ¡Temperatura del agua baja!");
lcd.print("Alarma: Temp Baja");
lcd.setCursor(0, 1);
lcd.print("Revise la piscina");
alert = true;
// Enviar alerta de temperatura a través de endpoint "Mensajes"
pson data;
data["alert"] = "Alerta: ¡Temperatura fuera de límites seguros!";
data["temperature"] = temperature; // Agregar el valor de la temperatura
data["pH"] = pH; // Agregar el valor de pH
thing.call_endpoint("Mensajes", data);
}
else if (temperature >= SAFE_TEMP_MIN && temperature <= SAFE_TEMP_MAX) {
Serial.println("Temperatura normal para piscina.");
lcd.print("Temp Normal");
lcd.setCursor(0, 1);
lcd.print("25-35°C Ideal");
}
// Verificar si el pH está fuera de límites
if (pH < SAFE_PH_MIN || pH > SAFE_PH_MAX) {
Serial.println("Alerta: ¡pH fuera de límites seguros!");
lcd.print("Alerta pH!");
alert = true;
}
// Verificar si la turbidez está fuera de límites
if (turbidity > SAFE_TURBIDITY_MAX) {
Serial.println("Alerta: ¡Turbidez fuera de límites seguros!");
lcd.print("Alerta Turb!");
alert = true;
}
if (alert) {
digitalWrite(LEDPIN, HIGH); // Encender LED
lcd.setCursor(0, 1);
lcd.print("¡Revise sistema!");
} else {
digitalWrite(LEDPIN, LOW); // Apagar LED
lcd.setCursor(0, 0);
lcd.print("Todo OK!");
}
}
void loop() {
// Simular lectura de temperatura en el rango 20°C a 30°C (para simular piscina)
float temperature = random(200, 300) / 10.0; // Generar valores entre 20 y 30°C
// Simular lectura de pH en el rango 6.5 a 8.5
float pHValue = random(65, 86) / 10.0; // Generar valores entre 6.5 y 8.5
// Simular lectura de turbidez en el rango 0 a 5 NTU
float turbidity = random(0, 51) / 10.0; // Generar valores entre 0 y 5 NTU
// Imprimir valores en el monitor serial
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.print(" °C, Valor pH: ");
Serial.print(pHValue);
Serial.print(", Valor de turbidez: ");
Serial.println(turbidity);
// Verificar si los valores están dentro de los límites seguros
checkLimits(temperature, pHValue, turbidity);
// Enviar datos a Thinger.io
thing["Mensajes"] >> [temperature, pHValue, turbidity](pson& out) { // Capturamos las variables dentro de la lambda
out["Temp"] = temperature;
out["pH"] = pHValue;
out["Turb"] = turbidity;
};
thing.handle();
delay(2000); // Esperar 2 segundos antes de la siguiente lectura
}