Estoy intentando crear un dispositivo capaz de cortar el agua en caso de que quede un grifo abierto o se sufra una rotura de tubería. La idea es evitar sorpresas en la factura del agua porque se rompió una tubería de riego enterrada y me llego una factura brutal.
-
El Concepto
En ciclos de 24 horas un contador de caudal mide el consumo de agua. Se establece una limitación de x metros cúbicos, si no se superan a las 24 horas se resetea y vuelve a empezar a contar.
En caso de superarse el caudal se bloquea el paso de agua y queda en este estado hasta que manualmente hasta que se reinicia.
Los metros cúbicos para considerar fuga serán a calcular con facturas y ajustes en función del gasto de agua de cada uno. -
Material que considero necesario
Arduino - para la programación
Sensor de flujo para - Medir de caudal y el volumen
Electroválvula - Para cortar el agua
Relé 5v / 220V - Para activar la electroválvula -
El código lo que tengo muy verde... no tengo muy claro si lo que estoy haciendo es correcto pero os pongo con lo que he empezado.
const int sensorPin = 2; // Pin digital para el sensor de flujo
const int measureInterval = 10000; // Tiempo entre muestreo
volatile int pulseConter;
const float factorK = 7.5; // YF-S201
float volume = 0;
float volumenMaximo = 2000; //caudal máximo 2000 litros 2 metros cúbicos
unsigned long start = 100000;//Variable para el tiempo del relé
unsigned long time;
long t0 = 0;
int rele = 8;// Asignamos enl pin
byte estado = 0;
void ISRCountPulse()
{
pulseConter++;
}
float GetFrequency()
{
pulseConter = 0;
interrupts();
delay(measureInterval);
noInterrupts();
return (float)pulseConter * 1000 / measureInterval;
}
void SumVolume(float dV)
{
volume += dV / 60 * (millis() - t0) / 1000.0;
t0 = millis();
}
void setup()
{
Serial.begin(9600);
pinMode(sensorPin,INPUT);//Asignamos al pin que es entrada
pinMode(rele,OUTPUT);// Asignamos al pin que es salida
digitalWrite(rele, HIGH); //Activamos la bobina del relé
attachInterrupt(digitalPinToInterrupt(sensorPin), ISRCountPulse, RISING);
t0 = millis();
}
void loop()
{
float frequency = GetFrequency(); // obtener frecuencia en Hz
float flow_Lmin = frequency / factorK; // calcular caudal L/min
SumVolume(flow_Lmin);
time = millis();
Serial.print(" Caudal: ");
Serial.print(flow_Lmin, 3);
Serial.print(" (L/min)\tConsumo:");
Serial.print(volume, 1);
Serial.println(" (L)");
Serial.print("Time: ");
Serial.println(time); //prints time since program started
if (volume >volumenMaximo){
switch(estado) {
case 0: digitalWrite(rele, LOW); //Activamos la bobina del relé
delay(600000);
start = millis();
estado = 1;
Serial.println(time); //prints time since program started
break;
case 1: if (millis() - start > 1000UL) {
Serial.println("Cerrar válvula.");
digitalWrite(rele, HIGH); //Desactivamos la bobina del relé //
volume = 0.0;// Se resetea el volumen
estado = 0;
}
break;
}
}
if (currentMillis - previousMillis >= 1000){
previousMillis = currentMillis;// Se resetea tiempo
}
}
Empecé pensando el que el cierre del agua sea temporal pero creo que es mejor un bloqueo completo, si llegas y no hay agua es que hay una fuga. Si te pasas de consumo un día por que llenas la piscina o algo reseteas y punto.