Tutorial Sensor De Flujo De Agua

Los sensores de flujo o caudalímetro sirven para una medición de caudal o de un gasto volumétrico de un fluido (es funcional para obtener datos del consumo del líquido en el proyecto destinado) esto siendo a través del mismo sensor.
Para las mediciones de caudal debemos de aclarar que el caudal es la cantidad de líquido o fluido hablando de volumen junto con la unidad de tiempo en el que tarda en a travesar, dándonos expresiones de litros por minuto (l/m) o litros por hora (l/h) o hasta metros cúbicos por hora (m³/h)., Mientras que los caudalímetros son los sensores que van a ser los encargados de obtener los datos de los líquidos.


Existen varios modelos así como el YF-S201, FS300A, FS400A y son muy usados en varias aplicaciones, puesto que el flujo o caudal es parámetro necesario en varios procesos, a nivel doméstico lo podemos usar para medir el consumo de agua.
El sensor utilizado para este tutorial es el YF-S201
; Este sensor internamente tiene un rotor cuyas paletas tiene un imán, la cámara en donde se encuentra el rotor es totalmente aislado evitando fugas de agua y de igual manera del otro lado del tubo se miden la cantidad de vueltas de la aspa de viento que se ha hecho a través de la misma pared de plástico y esto para que el sensor se mantenga seguro y seco, externamente a la cámara tiene un sensor de efecto hall que detecta el campo magnético del imán de las paletas y con esto el movimiento del rotor, el sensor de efecto hall envía los pulsos por uno de los cables del sensor, los pulsos deberán ser convertidos posteriormente a flujo pero esto ya es tarea del Arduino o controlador que se desee usar. El sensor YF-S201 sirve para medir caudal de agua en tuberías de 1/2″ de diámetro y puede ser empleado con otros líquidos de baja viscosidad, como: bebidas gasificadas, bebidas alcohólicas, combustible, etc.

Todos los modelos poseen tres cables para su conexión:
– Rojo: Voltaje de 5 a 18 VDC
– Negro: Tierra (GND)
– Amarillo: Salida de pulsos

La salida de pulsos es una onda cuadrada cuya frecuencia es proporcional al caudal. El factor de conversión de frecuencia (Hz) a caudal (L/min) varía entre modelos y  depende de la presión, densidad e incluso del mismo caudal.

La fórmula general será:

f(Hz)=K x Q(L/min)

Donde nosotros llamaremos a K como el factor de conversión siendo:
K = 7.5 para el sensor de ½” (YF-S201)
K = 5.5 para el sensor de ¾” (FS300A)
K = 3.5 para el sensor de 1” (FS400A)
trabajar con dichos valores no nos garantiza precisión, pero nos pueden servir para aplicaciones simples, si necesitamos mayor exactitud necesitamos calibrar y calcular dicho factor.

Como anteriormente se mencionó trabajaremos con el sensor de flujo de ½” (YF-S201). Su formula y procedimiento que vamos a usar será el proporcionado por el fabrícate:

f(Hz)=7.5 x Q(L/min)

Conexiones entre Arduino y Sensor de flujo:

Como se puede observar el cable amarillo va conectado directamente al pin 2 del Arduino, utilizamos este pin porqué en el programa vamos a usar la interrupción externa. Arduino Uno solo tiene interrupciones externas en los pines 2 y 3.

Podemos usar la misma conexión si estamos trabajando con un Arduino Nano, Mini, Mega o Micro, puesto que todas estas placas tienen interrupción externa en el pin 2.

  1. Realizando Mediciones de Flujo
    Para calcular el flujo, es necesario saber cómo dato el factor de conversión de frecuencia a caudal, dicho dato nos lo da el fabricante, de lo contrario tendríamos que calcularlo, lo segundo se lo hará mas adelante.

Teniendo el factor de conversión, el programa se resume a calcular la frecuencia de los pulsos del sensor, para posteriormente con el factor de conversión escalar de frecuencia a caudal.

A continuación se muestra el programa para calcular la frecuencia de los pulsos y el caudal de agua:

volatile int NumPulsos; //variable para la cantidad de pulsos recibidos
int PinSensor = 2;    //Sensor conectado en el pin 2
float factor_conversion=7.5; //para convertir de frecuencia a caudal

//---Función que se ejecuta en interrupción---------------
void ContarPulsos ()
{ 
  NumPulsos++;  //incrementamos la variable de pulsos
} 

//---Función para obtener frecuencia de los pulsos--------
int ObtenerFrecuencia() 
{
  int frecuencia;
  NumPulsos = 0;   //Ponemos a 0 el número de pulsos
  interrupts();    //Habilitamos las interrupciones
  delay(1000);   //muestra de 1 segundo
  noInterrupts(); //Desabilitamos las interrupciones
  frecuencia=NumPulsos; //Hz(pulsos por segundo)
  return frecuencia;
}

void setup()
{ 
  Serial.begin(9600); 
  pinMode(PinSensor, INPUT); 
  attachInterrupt(0,ContarPulsos,RISING); //(Interrupcion 0(Pin2),funcion,Flanco de subida)
} 

void loop ()    
{
  float frecuencia=ObtenerFrecuencia(); //obtenemos la Frecuencia de los pulsos en Hz
  float caudal_L_m=frecuencia/factor_conversion; //calculamos el caudal en L/m
  float caudal_L_h=caudal_L_m*60; //calculamos el caudal en L/h

  //-----Enviamos por el puerto serie---------------
  Serial.print ("FrecuenciaPulsos: "); 
  Serial.print (frecuencia,0); 
  Serial.print ("Hz\tCaudal: "); 
  Serial.print (caudal_L_m,3); 
  Serial.print (" L/m\t"); 
  Serial.print (caudal_L_h,3); 
  Serial.println ("L/h"); 
}

En nuestro caso el factor de conversión es de 7.5, dato promedio que nos da el fabricante para el sensor de flujo de ½” pulgada, ustedes deben usar el correspondiente factor de conversión de su sensor de flujo.

El resultado mostramos a continuación:

lectura de caudal de agua

Mencionamos nuevamente que el valor no es exacto, una manera de poder verificar es que el flujo es casi constante y para llenar un recipiente durante 1 minuto, debería coincidir con el caudal en L/min, ejemplo si nuestro caudal es de 8L/min, entonces en un minuto debería de obtenerse 8L. Si la medición no es correcta una forma de corregir es aumentar o disminuir el factor de conversión hasta lograr una medición más precisa.

Para medir el volumen con el sensor de flujo podemos usar el ejemplo que se muestra a continuación.

2. Midiendo el volumen o consumo de Agua

Teniendo el caudal podemos medir el volumen de agua, puesto que el caudal es la variación del volumen con respecto al tiempo, de esto podemos calcular el volumen como:

formula caudal y volumen

Para realizar esta tarea usamos el siguiente programa:

volatile int NumPulsos; //variable para la cantidad de pulsos recibidos
int PinSensor = 2;    //Sensor conectado en el pin 2
float factor_conversion=7.11; //para convertir de frecuencia a caudal
float volumen=0;
long dt=0; //variación de tiempo por cada bucle
long t0=0; //millis() del bucle anterior

//---Función que se ejecuta en interrupción---------------
void ContarPulsos ()  
{ 
  NumPulsos++;  //incrementamos la variable de pulsos
} 

//---Función para obtener frecuencia de los pulsos--------
int ObtenerFrecuecia() 
{
  int frecuencia;
  NumPulsos = 0;   //Ponemos a 0 el número de pulsos
  interrupts();    //Habilitamos las interrupciones
  delay(1000);   //muestra de 1 segundo
  noInterrupts(); //Deshabilitamos  las interrupciones
  frecuencia=NumPulsos; //Hz(pulsos por segundo)
  return frecuencia;
}

void setup() 
{ 
  
  Serial.begin(9600); 
  pinMode(PinSensor, INPUT); 
  attachInterrupt(0,ContarPulsos,RISING);//(Interrupción 0(Pin2),función,Flanco de subida)
  Serial.println ("Envie 'r' para restablecer el volumen a 0 Litros"); 
  t0=millis();
} 

void loop ()    
{
  if (Serial.available()) {
    if(Serial.read()=='r')volumen=0;//restablecemos el volumen si recibimos 'r'
  }
  float frecuencia=ObtenerFrecuecia(); //obtenemos la frecuencia de los pulsos en Hz
  float caudal_L_m=frecuencia/factor_conversion; //calculamos el caudal en L/m
  dt=millis()-t0; //calculamos la variación de tiempo
  t0=millis();
  volumen=volumen+(caudal_L_m/60)*(dt/1000); // volumen(L)=caudal(L/s)*tiempo(s)

   //-----Enviamos por el puerto serie---------------
  Serial.print ("Caudal: "); 
  Serial.print (caudal_L_m,3); 
  Serial.print ("L/min\tVolumen: "); 
  Serial.print (volumen,3); 
  Serial.println (" L");
}

En el monitor serial, recibimos el caudal y el volumen, para restablecer el volumen debemos de enviar la letra r y el volumen empezará desde 0.

Lectura de volumen o consumo de agua

De esta forma podemos saber el consumo del agua, para saber qué tan exacto es la medida simplemente hay que comparar el valor que arroja el sensor y medir en un recipiente la cantidad real, en nuestro caso por ejemplo, cuando con el sensor medimos 8 litros, la cantidad real de agua es 7.5 litros, teniendo un error de 0.5 litros lo cual podría ser significativo para algunas aplicaciones, para corregir esto como se mencionó anteriormente podemos disminuir el valor del factor de conversión o aumentar si la cantidad real es mayor que la del sensor.

Podemos realizar el siguiente ejemplo para calcular el factor de conversión de forma más exacta.

Calibrando nuestro sensor de flujo:

Para tener una medición más exacta es necesario calcular el valor del factor de conversión que es el que nos sirve para  pasar de Frecuencia de pulsos a caudal de agua

La variable que podemos medir con exactitud es la cantidad de pulsos (usando el Arduino), y con ayuda de un recipiente con graduación podemos medir la cantidad o volumen de agua.

Estas dos variables podemos medirlas con exactitud, para calcular el factor de conversión con estas dos variables podemos usar la siguiente formula:

formula pulsos vs volumen

Donde K es el factor de conversión, n°Pulsos son la cantidad de pulsos medidos con el sensor correspondientes al volumen que pasa por el sensor, dicho volumen debemos medirlo con ayuda de recipientes con graduación.

Para calcular la cantidad de pulsos del sensor usamos el siguiente sketch:

volatile long NumPulsos; //variable para la cantidad de pulsos recibidos
int PinSensor = 2;    //Sensor conectado en el pin 2


//---Función que se ejecuta en interrupción---------------
void ContarPulsos ()
{ 
  NumPulsos++;  //incrementamos la variable de pulsos
} 

//---Función para obtener frecuencia de los pulsos--------

void setup()
{ 
  Serial.begin(9600); 
  pinMode(PinSensor, INPUT); 
  attachInterrupt(0,ContarPulsos,RISING);//(Interrupción 0(Pin2),función,Flanco de subida)
  interrupts();    //Habilitamos las interrupciones
} 

void loop ()    
{
  //-----Enviamos por el puerto serie---------------
  Serial.print ("Numero de Pulsos = "); 
  Serial.println (NumPulsos); 
  delay(100);
}
lectura de pulsos del sensor
LitrosPulsosK
14367.27
14297.15
28727.27
312837.13
14136.88
417067.11
14237.05
416867.03
Promedio7.11

Las muestras que debemos tomar deben ser tomadas con caudales cercanos a nuestro caudal de trabajo, para tener una mejor precisión.

Nuestro factor  de conversión obtenido es de 7.11, con este valor podemos trabajar los ejemplos anteriores y verificar que las medidas sean más exactas.

Dejar un comentario

Close Bitnami banner
Bitnami