#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición de pines para las bombas
const int bombaTanqueMachinePin = 2;
const int bombaFiltrosPin = 3;
// Definición de pines para el sensor de conductividad y nivel de agua
const int sensorConductividadPin = A0;
const int echoPin = 7; // Pin Echo del sensor ultrasónico HC-SR04
const int trigPin = 8; // Pin Trig del sensor ultrasónico HC-SR04
// Rangos de conductividad
const int conductividadMinima = 15;
const int conductividadMaxima = 25;
// Umbral de nivel máximo en mm desde el fondo del tanque de sedimentación
const int nivelMaximoSedimentacion = 190;
// Pines para el interruptor de encendido/apagado del sistema y el zumbador
const int interruptorEncendidoPin = 10;
const int zumbadorPin = 9;
// Dirección I2C de la pantalla LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección, columnas, filas
bool alarmaActiva = false;
bool sistemaEncendido = false;
void setup() {
// Configuración de pines para las bombas
pinMode(bombaTanqueMachinePin, OUTPUT);
pinMode(bombaFiltrosPin, OUTPUT);
// Configuración de pines para el sensor de conductividad y nivel de agua
pinMode(sensorConductividadPin, INPUT);
// Configuración de pines para el sensor ultrasónico HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configuración de pines para el interruptor de encendido/apagado del sistema y el zumbador
pinMode(interruptorEncendidoPin, INPUT_PULLUP);
pinMode(zumbadorPin, OUTPUT);
// Inicialización de la pantalla LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistema de Filtrado");
lcd.setCursor(0, 1);
lcd.print("Inicializando...");
delay(2000);
}
void loop() {
// Verificar el estado del sistema (encendido/apagado)
if (digitalRead(interruptorEncendidoPin) == LOW) {
sistemaEncendido = !sistemaEncendido;
delay(500); // Debounce
}
if (!sistemaEncendido) {
apagarBombas();
desactivarAlarma();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema Apagado");
lcd.setCursor(0, 1);
lcd.print("Bomba Reserv: OFF");
lcd.setCursor(0, 2);
lcd.print("Bomba Filtro: OFF");
lcd.setCursor(0, 3);
lcd.print("CONDUCT: OFF");
lcd.setCursor(0, 4);
lcd.print("TANQUE 2: OFF");
return;
}
// Lectura de distancia utilizando el sensor ultrasónico HC-SR04
long distancia;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
distancia = pulseIn(echoPin, HIGH) / 58; // Dividir por 58 para obtener la distancia en cm
// Lecturas de los sensores
int conductividad = analogRead(sensorConductividadPin);
// Convierte la lectura de conductividad a microSiemens
float conductividadMicroSiemens = map(conductividad, 0, 1023, 0, 50);
// Verifica si el nivel del agua en el tanque de sedimentación supera el máximo
if (distancia > nivelMaximoSedimentacion) {
apagarBombas();
activarAlarma();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bomba Reserv: OFF");
lcd.setCursor(0, 1);
lcd.print("Bomba Filtro: OFF");
lcd.setCursor(0, 2);
lcd.print("CONDUCT: OFF");
lcd.setCursor(0, 3);
lcd.print("TANQUE 2: > MAX");
} else {
// Desactiva la alarma y muestra los estados de las bombas y la conductividad
if (alarmaActiva) {
desactivarAlarma();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bomba Reserv: OFF");
lcd.setCursor(0, 1);
lcd.print("Bomba Filtro: OFF");
lcd.setCursor(0, 2);
lcd.print("CONDUCT: ");
lcd.print(conductividadMicroSiemens >= conductividadMinima && conductividadMicroSiemens <= conductividadMaxima ? "NORMAL" : "OUT RANGE");
lcd.setCursor(0, 3);
lcd.print("TANQUE 2: ");
lcd.print(distancia <= nivelMaximoSedimentacion ? "NORMAL" : "> MAX");
}
}
// Verifica la conductividad del agua
if (conductividadMicroSiemens < conductividadMinima || conductividadMicroSiemens > conductividadMaxima) {
apagarBombas();
activarAlarma();
lcd.setCursor(0, 2);
lcd.print("CONDUCT: OUT RANGE");
} else {
// Desactiva la alarma y muestra el estado de la conductividad
if (alarmaActiva) {
desactivarAlarma();
lcd.setCursor(0, 2);
lcd.print("CONDUCT: NORMAL");
}
}
// Retraso para actualizar la pantalla cada cierto tiempo (por ejemplo, cada 2 segundos)
delay(2000);
}
void apagarBombas() {
digitalWrite(bombaTanqueMachinePin, LOW);
digitalWrite(bombaFiltrosPin, LOW);
}
void activarAlarma() {
digitalWrite(zumbadorPin, HIGH);
alarmaActiva = true;
}
void desactivarAlarma() {
digitalWrite(zumbadorPin, LOW);
alarmaActiva = false;
}