Artículos recientes

Novedades

Tutorial sensor de flujo de agua

Tutorial sensor de flujo de agua

Los sensores de flujo YF-S201, FS300A, FS400A 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 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, 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.

Sensor de flujo

Modelo

Conexión

Caudal

Sensor de flujo de agua 1/2" YF-S201

YF-S201

½”

1-30 L/min

Sensor de flujo de agua 3/4" FS300A

FS300A

¾”

1-60 L/min

Sensor de flujo de agua 1" FS400A

FS400A

1”

1-60 L/min

 

Todos los modelos tienen tres cables para su conexión, rojo y negro para la alimentación y amarillo para la salida de los 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.

Para el caso del sensor de ½” el factor de conversión promedio proporcionado por el fabrícate es:

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

Llamaremos nosotros K al factor de conversión, siendo K=7.5 para el sensor de ½”, K=5.5 para el sensor de ¾” y 3.5 para el sensor de 1”, 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.


En este tutorial trabajaremos con  el sensor de flujo de ½” (YF-S201) pero el tutorial también se aplica para los demás modelos teniendo en cuenta cambios que se indican en el desarrollo del tutorial

Conexiones entre Arduino y Sensor de flujo:

 Conexines entre sensor de flujo y arduino

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

 

Mencionar nuevamente que el valor no es exacto, una forma de verificar es, con el flujo casi constante, llenar un recipiente durante 1 minutos, 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);
}

El programa solo muestra la cantidad de pulsos del sensor, para realizar una muestra de pulsos y volumen es necesario resetear y a continuación empezar a llenar el recipiente, en otras palabras verificar que cuando se empiece a medir el agua la cantidad de pulsos debe estar en cero.

  lectura de pulsos del sensor

 

Para tener un valor más exacto es mejor tomar varias muestras y finalmente quedarnos con el promedio de estas, en nuestro caso nuestros resultados son los siguientes:

Litros

Pulsos

K

1

436

7.27

1

429

7.15

2

872

7.27

3

1283

7.13

1

413

6.88

4

1706

7.11

1

423

7.05

4

1686

7.03

Promedio

7.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.

 

Pueden adquirir los materiales usados en este tutorial en nuestra tienda:

Arduino Uno R3

Sensor de flujo de agua 1/2" YF-S201

Sensor de flujo de agua 3/4" FS300A

Sensor de flujo de agua 1" FS400A

29 Comments

    • Avatar
      Gaspar Uriarte
      ene 20, 2017

      Hola soy de México, estoy empezando en esto de arduino, tengo una duda como podría desplegar en un LCD 16x2 el caudal en L/min y L/hora, les agradecería mucho su ayuda ya que no he intentado y no he podido, gracias de antemano.

      • Avatar
        Naylamp
        feb 2, 2017

        Hola Gaspar, es fácil de implementar un LCD, puedes guiarte de nuestro tutorial: Tutorial LCD

        • Avatar
          jlsanta
          ene 21, 2018

          //añades este código al principio #include // include the library code: LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //( RS, EN, d4, d5, d6, d7) //Iniciamos la libreria con el número del pin de interface// añades después de las líneas -----Enviamos por el puerto serie------------- //-----Enviamos al LCD------------- lcd.setCursor(0, 1);// Ajustar el cursor a la columna 0, línea 1 lcd.begin(16, 2); lcd.print ("Caudal: "); lcd.print (caudal_L_m,3); lcd.print ("L/mintVolumen: "); lcd.setCursor(0, 1); lcd.print("Consumo: ");lcd.print (volumen,3); lcd.println ("Litros");

    • Avatar
      Hernan Dario Manjarres Gomez
      feb 24, 2017

      Buenas, estoy intentando juntar este tutorial, con el de cliente web de sp8266, la parte del sp8266 esta genial, todo va super bien, pero a la hora de combinar ambos codigos, no funcionan, podrias darme una luz de por que?

      • Avatar
        Naylamp
        mar 23, 2017

        Hola Hernan, el problema es que al deshabilitar las interrupciones la entrada de datos en la comunicación serial puede estar fallando. Intenta lo siguiente: habilita en el void setup() las interrupciones con interrupts(); y borra o comenta interrupts() y noInterrupts() en la función ObtenerFrecuecia, de esta forma las interrupciones siempre estarán habilitadas, esto podría generar que la función millis() se retrase un poco pero no debería afectar mucho si no necesitas tiempos o pausas exactas.

    • Avatar
      Marco Cabezas
      mar 8, 2017

      Buenas noches, saludos cordiales, estoy diseñando un proyecto y me piden implementar los sensores de flujo y presión en las lineas de agua para el sistema de alarma contra incendio. Mi consulta es como se implementa o donde va el arduino y como se complementa con la central de alarma contra incendio, gracias por su respuesta.

    • Avatar
      Jose Gutierrez
      may 25, 2017

      Hola buen dia, estoy interesado en realizar un proyecto con este dispositivo, nadamas que el fluido con el que voy a trabajar es gasolina y mi duda es ¿Tambien puedo usar este sensor para ese fluido? si no es asi les agradeseria infinitamente si me podrian ayudar con algun sensor que soporte este fluido Muchas gracias a todos :)

      • Avatar
        Eduardo Gutiérrez
        jun 27, 2017

        Buen día estoy interesado en desarrollar un proyecto donde pueda medir flujo de agua por temporada mensuales con múltiples interrupciones LAS CUALES SE GUARDEN EN MEMORIA Y DARLE UN VOLOR COSTO EN UN TIPO DE MONEDA( TIPO TAXIMETRO)

    • Avatar
      julio cesar Uriostegui flores
      jul 5, 2017

      hola, tengo una pegunta, puedo utilizar este sensor para apagar una electrovalvula cuando pase cierta cantidad de agua ?

    • Avatar
      Juan Antonio Chorro
      oct 22, 2017

      Hola Estoy intentado utilizar tu código para cortar el agua cuando el tiempo de funcionamiento sea superior a un tiempo especificado( fuga de agua) Estoy utilizando esta condición, pero no me funciona( al mínimo movimiento del sensor me da corte de agua)tiempoAgua=millis(); if(caudal_L_m >0){ tiempoAgua++;//incrementamos la variable de tiempo Agua if (tiempoAgua>(5000)){ // pinMode(rele1,OUTPUT); Serial.println("Corte por fuga");//Si value=consignas apagamos circuitos } else{} }

    • Avatar
      JORGE MARTINEZ VALENZUELA
      oct 30, 2017

      Buena tarde, estoy trabajando en un dispensador, existe alguna valvula que abra y cierre el flujo?? o como se puede construir? gracias

    • Avatar
      CESAR MAZA
      nov 13, 2017

      QUe tal..Me gustaría saber si este flujómetro también es útil para gas... O debo calibrar el factor K. Muchas gracias.. saludos

    • Avatar
      Huascar
      nov 23, 2017

      como calculo el consumo de cada mes con arduino

    • Avatar
      Ivan
      nov 26, 2017

      Estoy intentando mandar a mostrar los datos con arduino pero al momento de presentarse en pantalla el mensaje desaparece casi inmediatamente, podrias decirme que modificar del código para que se muestre bien?

    • Avatar
      Juan Bacchella
      nov 26, 2017

      Hola, soy de Argentina. Alguien sabe si puedo utilizar este sensor para controla Cloro Liquido? Tengo que dosificar cloro en bidones. Muchas gracias

    • Avatar
      Jose
      dic 5, 2017

      Buen día. Alguien sabe si puede usarse este tipo de sensor para medir el flujo de aire. Quizás aplicando algún factor de conversión. Pero mi duda principal es si se podría usar para el aire.

    • Avatar
      George
      ene 21, 2018

      Hola, porfavor quisiera monitorear mas de un sensor de flujo con un codigo de arduino, podrias hacer un ejemplo monitoreando dos sensores de flujo

    • Avatar
      rafael Angel Moscoso
      feb 21, 2018

      Buensa tardes ,, somos INGEMECANICA-INGETECSA - empresas dedicadas a la fabricacion de sistemas de dosificacion de quimicos y plantas de tratamiento de aguas, estamos interesados EN montar a nuestros equipos la tarjeta arduino con sensor de flujo de 3/4 , nos podrian ampliar la informacion , si la tarjeta tambien sirve para cconectarla a un PLC nECESITAMOS ESCALIZAR LOS PULSOS A mL y litros las dosis maximas son baches hasta 40 ltros , podrian decirme hasta que margenes de error podria tener con las tarjetasgracias

    • Avatar
      Fabricio
      abr 2, 2018

      Hola tengo una pregunta, estoy haciendo un proyecto y nesecito conectar 50 caudalimetros. Ciendo q en el Arduino uno solo podré conectar 2 como maximo. Q me recomiendan cara conectar está cantidad?

    • Avatar
      laura
      jul 24, 2018

      info sobre arduino, sensores de caudal y como integrar con Mysql, .Net y PHP

    • Avatar
      ALfredo
      jul 25, 2018

      hola, tengo un problema con la memoria, sn muchas variables

    • Avatar
      Jairr
      jul 28, 2018

      Se podrá para tres caudalimetros

    • Avatar
      maría paz
      sep 10, 2018

      hola, estoy realizando un proyecto parecido, solo que quiero que el monitor que muestra el flujo del agua aparezca en una app, como lo podría hacer?, por favor ayúdenme

    • Avatar
      Raul Alberto
      oct 29, 2018

      Buenos días, he estado intentado hacer que el caudalimetro mida una cantidad de litros y mande la orden al arduino para que me apague una electrovalvula y no he sido capaz, me podrían colaborar con una variable para esa interrupción, muchas gracias.

    • Avatar
      Oscar Eduardo
      nov 18, 2018

      Hola, muy buenos tutoriales, estoy tratando de armar un circuito con sesores de galgasa extensometricas para medir la deformacion de una barra de acero al mismo tiempo, es posible leer por ejemplo 5 galgas extensométricas al mismo tiempo, agradecería tu comentario. Graciaaas

    • Avatar
      FREDDY
      dic 28, 2018

      Hola, my interesante el proyecto. Pregunto si abra algun transductor de flijo para un caudal de hasta 500GPM....saludos

    • Avatar
      Edgardo Hernandez Meyer
      mar 8, 2019

      Hola soy de Valledupar-Colombia, mi pregunta es la siguiente. tengo un proyecto de una bomba de presion para mi casa, realice el proyecto con un arduino uno y en sensor YFS201. La idea es que cuando el caudal alcansa 1L/M debe ensender la bomba, en pocas palabras, cuando abran una llave lo detecta y enciende la bomba, cuando cierran la apaga. Funciono correcto en pruebas en el patio, cuando lo subo al techo y lo conecto al tanque de 1000 litros funciona detentando la apertura de la llave pero cuando cierran enpieza a encender y apagar la bomba como si abrieran y cerraran continuamente. Que piensas del problema?

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment: