#include "iot.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
unsigned long ultimaVezIoT = 0;
const unsigned long intervaloIoT = 5000; // 20 seg (Estándar ThingSpeak)
// --- CONFIGURACIÓN DE PINES ---
const int PIN_TEMP = 4;
const int PIN_TRIG = 5;
const int PIN_ECHO = 18;
// ACTUADORES (Relés)
const int PIN_RELE_CALENTADOR = 16; // Relé 1 PIN 16 , CALENTADOR (SI ESTA ACTIVO , LED ROJO )
const int PIN_RELE_ENFRIADOR = 17; // Relé 2 PIN 17 , ENFRIADOR (SI ESTA ACTIVO , LED AZUL )
// LED RGB (Lógica Ánodo Común: LOW = Encendido)
const int PIN_LED_ROJO = 13; //LED ROJO
const int PIN_LED_AZUL = 14; //LED AZUL
const int PIN_LED_VERDE = 27; // LED VERDE
//SENSORES
OneWire oneWire(PIN_TEMP); //
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Configuración de salidas
pinMode(PIN_RELE_CALENTADOR, OUTPUT);
pinMode(PIN_RELE_ENFRIADOR, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
pinMode(PIN_LED_AZUL, OUTPUT);
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// Inicialización de periféricos
sensors.begin();
lcd.init();
lcd.backlight();
// Apagar todo al inicio (HIGH apaga en Ánodo Común)
digitalWrite(PIN_LED_ROJO, LOW);
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_AZUL, LOW);
digitalWrite(PIN_RELE_CALENTADOR, LOW);
digitalWrite(PIN_RELE_ENFRIADOR, LOW);
lcd.setCursor(0, 0);
lcd.print("SISTEMA ACUARIO");
lcd.setCursor(0, 1);
lcd.print(" CONFIGURADO OK ");
delay(2000);
lcd.clear();
iniciarWiFi();
Serial.println("[SISTEMA] Control de Acuario Iniciado.");
}
void loop() {
// 1. LECTURA DE SENSORES
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// Lectura Ultrasonido
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duracion = pulseIn(PIN_ECHO, HIGH);
float distancia = duracion * 0.034 / 2;
// 2. RESET DE LEDS (Apagar todo antes de decidir)
digitalWrite(PIN_LED_ROJO, LOW);
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_AZUL, LOW);
// 3. VISUALIZACIÓN LCD
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(tempC, 1); lcd.print("C ");
lcd.print("L:"); lcd.print((int)distancia); lcd.print("cm ");
// 4. LÓGICA DE CONTROL CON PRIORIDAD DE NIVEL
lcd.setCursor(0, 1);
if (distancia > 20.0) {
// ERROR DE NIVEL (Prioridad máxima)
lcd.print("ERROR: NIVEL BAJO");
Serial.println("[CRÍTICO] Nivel bajo detectado. Bloqueando actuadores por seguridad.");
digitalWrite(PIN_LED_ROJO, HIGH);
digitalWrite(PIN_RELE_CALENTADOR, LOW); //NO ENCENDER
digitalWrite(PIN_RELE_ENFRIADOR, LOW); //NO ENCENDER
}
else {
// CONTROL DE TEMPERATURA
if (tempC < 19.0) {
lcd.print("ALERTA: BAJA T! ");
Serial.printf("[ALERTA] Temp: %.1f C. CALENTADOR ACTIVADO.\n", tempC);
digitalWrite(PIN_LED_AZUL, HIGH); // ENCIENDE LED AZUL [FRIO]
digitalWrite(PIN_RELE_CALENTADOR, HIGH); //ENCIENDE CALENTADOR
digitalWrite(PIN_RELE_ENFRIADOR, LOW); // APAGA ENFRIADOR
}
else if (tempC > 31.0) {
lcd.print("ALERTA: ALTA T! ");
Serial.printf("[ALERTA] Temp: %.1f C. ENFRIADOR ACTIVADO.\n", tempC);
digitalWrite(PIN_LED_ROJO, HIGH); // ENCIENDE LED ROJO [CALOR]
digitalWrite(PIN_RELE_ENFRIADOR, HIGH); // ENCIENDE ENFRIADOR
digitalWrite(PIN_RELE_CALENTADOR, LOW); // APAGA CALENTADOR
}
else {
lcd.print("ESTADO: OPTIMO ");
digitalWrite(PIN_LED_VERDE, HIGH); // ENCIENDE VERDE CONDICION OPTIMA
digitalWrite(PIN_RELE_CALENTADOR, LOW);
digitalWrite(PIN_RELE_ENFRIADOR, LOW);
}
}
unsigned long tiempoActual = millis(); // Capturamos el tiempo del sistema
if (tiempoActual - ultimaVezIoT >= intervaloIoT) {
Serial.println(">>> ENVIANDO REPORTE A THINGSPEAK...");
enviarDatos(tempC, distancia); // Llamada a iot.h
// ESTA LÍNEA ES LA CLAVE: actualiza el marcador para los próximos 20 seg
ultimaVezIoT = tiempoActual;
Serial.println(">>> REPORTE ENVIADO. PRÓXIMO EN 5 SEG.");
}
delay(1000); // Frecuencia de escaneo local
}