#define FLOTADOR_PIN 25 //pin de señal del sensor flotador
#define BOMBA_PIN 26 //pin de señal del relé de la bomba de agua
#define SOLENOIDE_PIN 27 //pin de señal del relé de la válvula solenoide
#define CAUDALIMETRO_PIN 14 //pin de señal del sensor de flujo
const float factor_conversion = 7.5; //Factor de conversión de frecuencia a caudal del sensor de flujo
const int tiempoLimite = 5000; //Tiempo (ms) establecido para asentamiento del flotador
bool activarMuestreo = false;
bool volumenCompleto = true;
bool habilitarBomba = false;
bool habilitarSolenoide = false;
int primerMuestreo = 0;
int estadoFlotador = 0;
int cont;
volatile int Pulsos = 0;
float Volumen = 0; //Volumen cargado en el muestreador
unsigned long dt = 0; //variación de tiempo por cada bucle de interrupción
unsigned long t0 = 0; //millis() del bucle anterior
unsigned long tiempoInicial = 0;
unsigned long tiempoActivo = 0;
void setup() {
Serial.begin(115200); //Inicialización del Monitor Serie
while (!Serial);
pinMode(FLOTADOR_PIN, INPUT_PULLDOWN);
pinMode(BOMBA_PIN, OUTPUT);
pinMode(SOLENOIDE_PIN, OUTPUT);
pinMode(CAUDALIMETRO_PIN, INPUT_PULLDOWN);
attachInterrupt(CAUDALIMETRO_PIN, ConteoPulsos, RISING); //Interrupción por Hardware del pin 14 por flanco ascendente
digitalWrite(SOLENOIDE_PIN, HIGH);
digitalWrite(BOMBA_PIN, HIGH);
}
void loop() {
estadoFlotador = digitalRead(FLOTADOR_PIN);
estadoMuestreo (); //Se activan las condicionantes del muestreo después de que el flotador haya estado activo por el tiempo establecido
if ((activarMuestreo == true) && (habilitarBomba == true) && (primerMuestreo < 4)) {
digitalWrite(BOMBA_PIN, LOW); //Si se activan las condicionantes del muestreo, se activa la bomba de agua
t0 = millis();
habilitarSolenoide = false;
}
float caudal = ObtenerVolumen(); //Se obtiene la porción de volumen en un segundo
Volumen = Volumen + caudal; //volumen(L)=caudal(L/s)*tiempo(s)
Serial.println(Volumen);
if (Volumen >= 0.1) {
digitalWrite(BOMBA_PIN, HIGH); //Si el volumen alcanza 1,7 litros, se desactiva la bomba de agua
habilitarBomba = false;
habilitarSolenoide = true;
}
if ((habilitarSolenoide == true) && (primerMuestreo < 3)) {
digitalWrite(SOLENOIDE_PIN, LOW); //Al llenarse el muestreador, se activa la válvula solenoide de salida
Volumen = 0;
cont++;
Serial.println(cont);
if (cont>5) {
digitalWrite(SOLENOIDE_PIN, HIGH); //Transcurrido un tiempo determinado, se desactiva la valvula solenoide
habilitarBomba = true;
primerMuestreo++;
cont = 0;
}
}
}
//----------Función que cuenta el tiempo activo del sensor flotador----------
void estadoMuestreo () {
if ((estadoFlotador == LOW) && (primerMuestreo == 0)) {
if (tiempoInicial == 0) {
tiempoInicial = millis();
}
tiempoActivo = millis() - tiempoInicial;
if (tiempoActivo >= tiempoLimite) {
activarMuestreo = true;
habilitarBomba = true;
primerMuestreo++;
}
}
else tiempoInicial = 0;
}
//----------Función que se ejecuta en interrupción----------
void ConteoPulsos() {
Pulsos++;
Serial.println(Pulsos);
}
//----------Función para obtener volumen por segundo----------
float ObtenerVolumen() {
float Frecuencia;
Pulsos = 0; //Se pone a 0 el número de pulsos
interrupts(); //Se habilitan las interrupciones
delay(1000); //Muestra de 1 segundo
noInterrupts(); //Se deshabilitan las interrupciones
Frecuencia = Pulsos; //Hz(pulsos por segundo)
float caudal_L_m = Frecuencia / factor_conversion; //Se calcula el caudal en L/m
dt = millis() - t0; //calculamos la variación de tiempo
t0 = millis();
float Volumen_seg = (caudal_L_m/60)*(dt/1000);
return Volumen_seg;
}