#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
  }
}
$abcdeabcde151015202530354045505560fghijfghij