caudal-consumo-de-agua-con-arduino-y-caudalimetro

Medir caudal y consumo de agua con Arduino y caudalímetro

¿Qué es un caudalímetro?

Un caudalímetro es un sensor que permite medir la cantidad de agua que atraviesa una tubería. Podemos conectar un caudalímetro a un procesador como Arduino para obtener la medición del sensor.

El nombre del caudalímetro proviene del término caudal, que es la relación entre volumen y tiempo. Las unidades en el sistema internacional son m^3/s, siendo otras unidades habituales l/s y l/min. El caudal depende de diversos factores, principalmente de la sección de tubería y la presión de suministro.

En instalaciones domésticas diámetros habituales de tuberías 1” (DN25), 3/4” (DN20) y 1/2” (DN15), siendo esta última la normal en grifos. La presión debería estar en el rango de 100 kPA (1 Kg/cm2) a 500kPA (5 Kg/cm2)

Caudales habituales para instalaciones para tuberías de 1/2” (las normales en grifos) 0.1 l/s (6 l/min) y 0.2 l/s (12 l/min). Para tuberías de 3/4” podemos tener caudales en torno a 20 l/min, y para tuberías de 1” en torno a 35 l/min.

Dentro del campo de caudalímetros que podemos emplear en nuestros proyectos de electrónica y domótica caseros tenemos diversos modelos como el YF-S201, FS300A, FS400A. Cada uno dispone de distintas características, aunque el criterio de selección entre estos tres será el diámetro de la tubería.

Podemos usar un caudalímetro en nuestros proyectos por ejemplo, para determinar el consumo de una instalación, regular el flujo actuando sobre una bomba, controlar el llenado de un depósito o controlar un sistema de riego.

Precio

Podemos encontrar el YF-S201 (conexión de 1/2”) por 2.50€, el FS300A (conexión de 3/4”) por 4.50€ y el FS400A (conexión de 1”) por 6.50€, buscando en vendedores internacionales en eBay o AliExpress.

arduino-caudalimetro-componente

¿Cómo funciona un caudalímetro?

Los caudalímetros como el YF-S201, FS300A y el FS400A están constituidos por una carcasa plástica estanca y un rotor con paletas en su interior. Al atravesar el fluido el interior el sensor el caudal hace girar el rotor.

La velocidad de giro se determina mediante un imán fijado al rotor, que es detectado mediante un sensor hall externo a la carcasa. Por tanto, ninguna parte eléctrica está en contacto con el fluido.

La salida del sensor es una onda cuadrada cuya frecuencia es proporcional al caudal atravesado.

El factor K de conversión entre frecuencia (Hz) y caudal (L/min) depende de los parámetros constructivos del sensor. El fabricante proporciona un valor de referencia en sus Datasheet. No obstante, la constante K depende de cada caudalímetro. Con el valor de referencia podemos tener una precisión de +-10%. Si queremos una precisión superior deberemos realizar un ensayo para calibrar el caudalímetro.

ModeloConexiónCaudalesK
YF-S2011/2”1-30 L/min7.5
FS300A3/4”1-60 L/min5.5
FS400A1”1-60 L/min3.5

Esquema de montaje

La conexión del caudalímetro es muy sencilla. Por un lado alimentamos el sensor conectando Vcc y Gnd, respectivamente, a 5V y Gnd en Arduino. Por otro lado, conectamos la salida del sensor SIG a un pin digital que permita emplear interrupciones.

arduino-caudalimetro-esquema

Mientras que la conexión, vista desde Arduino, sería la siguiente.

arduino-caudalimetro-conexion

Ejemplos de código

Calcular el caudal

Para realizar la lectura del caudalímetro debemos calcular la frecuencia de la señal de salida del sensor. Para ello emplearemos una interrupción que cuente pulsos en un determinado intervalo, y dividiendo el número de pulsos entre el intervalo en segundos, obtendremos la frecuencia.

A continuación, convertimos la medición en frecuencia a caudal, para lo cuál empleamos el factor K, que como hemos dicho depende del modelo de caudalímetro que estemos empleando.

const int sensorPin = 2;
const int measureInterval = 2500;
volatile int pulseConter;

// YF-S201
const float factorK = 7.5;

// FS300A
//const float factorK = 5.5;

// FS400A
//const float factorK = 3.5;

void ISRCountPulse()
{
  pulseConter++;
}

float GetFrequency()
{
  pulseConter = 0;

  interrupts();
  delay(measureInterval);
  noInterrupts();

  return (float)pulseConter * 1000 / measureInterval;
}

void setup()
{
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(sensorPin), ISRCountPulse, RISING);
}

void loop()
{
  // obtener frecuencia en Hz
  float frequency = GetFrequency();

  // calcular caudal L/min
  float flow_Lmin = frequency / factorK;

  Serial.print("Frecuencia: ");
  Serial.print(frequency, 0);
  Serial.print(" (Hz)\tCaudal: ");
  Serial.print(flow_Lmin, 3);
  Serial.println(" (L/min)");
}

Calcular el consumo

Si queremos calcular el volumen de agua consumido, simplemente debemos realizar la integración respecto del tiempo

const int sensorPin = 2;
const int measureInterval = 2500;
volatile int pulseConter;

// YF-S201
const float factorK = 7.5;

// FS300A
//const float factorK = 5.5;

// FS400A
//const float factorK = 3.5;

float volume = 0;
long t0 = 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);
  attachInterrupt(digitalPinToInterrupt(sensorPin), ISRCountPulse, RISING);
  t0 = millis();
}

void loop()
{
  // obtener frecuencia en Hz
  float frequency = GetFrequency();

  // calcular caudal L/min
  float flow_Lmin = frequency / factorK;
  SumVolume(flow_Lmin);

  Serial.print(" Caudal: ");
  Serial.print(flow_Lmin, 3);
  Serial.print(" (L/min)\tConsumo:");
  Serial.print(volume, 1);
  Serial.println(" (L)");
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full