#include <TimerOne.h>
// Variables de entrada (SWITCHES)
int A = 2;
int B = 3;
int C = 4;
// Variables de salida (BOMBAS)
int M1 = 8;
int M2 = 9;
int salida = 7; // LED que simula la bomba de salida
// Variables de salida (INDICADORES DE NIVEL DE LLENADO)
int M3 = 10;
int M4 = 11;
int M5 = 12;
//Otras Variables
int A_1;
int B_1;
int C_1;
int Y1;
int Y2 = 0;
int Y3 = 0;
int Y4 = 0;
int Y5 = 0;
// Variables para el sistema de salida
bool tanque_lleno = false;
bool tanque_media = false;
bool tanque_bajo = false;
unsigned long previousMillis = 0; // milisegundos previos en cada evaluacion
const long interval_lleno = 5000; // 5 segundos
const long interval_media = 10000; // 10 segundos
const long interval_bajo = 20000; // 20 segundos
const int duracion_activacion = 1000; // 1 segundo
void setup() {
pinMode(A, INPUT);
pinMode(B, INPUT);
pinMode(C, INPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(M5, OUTPUT);
pinMode(salida, OUTPUT);
// Configurar el temporizador para generar interrupciones cada 1 segundo
Timer1.initialize(1000000); // 1 segundo
Timer1.attachInterrupt(timerIsr); // Asociar la función de interrupción al temporizador
}
void loop() {
// Implementación Descriptiva bomba M1
A_1 = digitalRead(A);
B_1 = digitalRead(B);
C_1 = digitalRead(C);
Y1 = (!B_1 & !C_1) | (!A_1 & !C_1);
digitalWrite(M1, Y1);
// Implementación Comportamental bomba M2
Y2 = 0;
if (B_1 == 0 && C_1 == 0)
{
Y2 = 1;
}
else if (A_1 == 1 && C_1 == 0)
{
Y2 = 1;
}
digitalWrite(M2, Y2);
//implementacion comportamental - indicadores de llenado
Y3 = 0;
Y4 = 0;
Y5 = 0;
if (C_1 == 1) { // Si C ESTA ENCENDIDO EL TANQUE ESTA LLENO
Y5 = 1;
}
else if (B_1 == 1 && C_1 == 0) { // SI B ESTA ENCENDIDO Y C APAGADO EL TANQUE ESTÁ MEDIO
Y4 = 1;
}
else if (A_1 == 1 && B_1 == 0 && C_1 == 0) { // SI SOLO A ESTA ENCENDIDO EL TANQUE ESTA BAJO
Y3 = 1;
}
else { // CASO CONTRARIO EL TANQUE ESTA VACIO
Y3 = 0;
Y4 = 0;
Y5 = 0;
}
digitalWrite(M3, Y3);
digitalWrite(M4, Y4);
digitalWrite(M5, Y5);
}
// Función de interrupción del temporizador
void timerIsr() {
unsigned long currentMillis = millis();
// Verificar el estado del tanque y activar la bomba de salida según corresponda
if (Y5) {
if (currentMillis - previousMillis >= interval_lleno) { //verifica si han pasado los 5 segundos desde la ultima vez
previousMillis = currentMillis;
digitalWrite(salida, HIGH);
delay(duracion_activacion);
digitalWrite(salida, LOW);
}
} else if (Y4) {
if (currentMillis - previousMillis >= interval_media) { //verifica si han pasado los 10 segundos desde la ultima vez
previousMillis = currentMillis;
digitalWrite(salida, HIGH);
delay(duracion_activacion);
digitalWrite(salida, LOW);
}
} else if (Y3) {
if (currentMillis - previousMillis >= interval_bajo) { //verifica si han pasado los 20 segundos desde la ultima vez
previousMillis = currentMillis;
digitalWrite(salida, HIGH);
delay(duracion_activacion);
digitalWrite(salida, LOW);
}
} else {
digitalWrite(salida, LOW); // Si el tanque está vacío, desactivar la bomba de salida
}
}