En el siguiente post os voy a enseñar cómo utilizar un caudalímetro para medir el flujo de agua en L/hora que atraviesa la alcachofa de nuestra ducha, así como la cantidad de agua que gastamos cada vez que nos duchamos.
Para lograr esto vamos a montar y programar un sencillo caudalímetro basado en el sensor de flujo YF-S201, un display LCD 2004 para poder visualizar los valores a tiempo real y una serie de elementos auxiliares necesarios para que le llegue el caudal de agua a nuestro sensor.
El sensor de flujo YF-S201 está constituido por una carcasa de plástico, un rotor de agua y un sensor de efecto Hall.
El funcionamiento de este sensor es muy simple, es decir, en el rotor tiene un pequeño imán adherido para poder registrar una vuelta cada vez que pasa por el sensor magnético de efecto Hall que hay en el otro lado del tubo, generándose pulsos de salida a una velocidad proporcional a la del flujo. En la parte posterior del sensor hay una flecha para indicar la dirección del flujo. Cada pulso en la salida del sensor equivale aproximadamente a 2,25 mililitros.
Una de las cosas a tener en cuenta es que no es un sensor de precisión, por lo que la frecuencia del pulso varía un poco dependiendo de la velocidad de flujo, la presión del fluido y la orientación del sensor, necesitándose una cuidadosa calibración si se requiere más que un 10% de precisión. A continuación os muestro algunas de las características más relevantes de este sensor.
La salida del sensor (cable amarillo) la vamos a conectar a nuestro Arduino para que mediante una correcta programación podamos visualizar a través del LCD 2004 el caudal que sale por nuestra ducha en L/hora. Además podremos ver consumo de agua en litros que hemos realizado en un determinado espacio de tiempo.
Como la señal del pulso de salida es una simple onda cuadrada es muy fácil de registrar mediante interrupciones, para posteriormente convertir los pulsos en caudal. Según la hoja de datos del fabricante, por cada litro de agua que pasa por el sensor obtenemos aproximadamente 450 pulsos, entonces:
Por último en la salida del sensor conectaremos la manguera con la alcachofa que habíamos retirado anteriormente del grifo de la ducha. El sensor en ambos extremos tiene roscas macho estándar de ½”, lo que nos facilita la conexión. También es muy recomendable aplicar teflón en cada uno de los extremos del sensor para evitar posibles fugas de agua.
Lista de Materiales
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Sensor de flujo YF-S201
- Manguera con conectores hembra de ½”
- Alcachofa de ducha con manguera y conector hembra de ½”
- Módulo LCM 2004 I2C V1
- Display 20×4 LCD 2004
- Teflón
- Batería de 12VDC/3000mAh (DC12300)
- Protoboard
- Cables de conexión
Código del programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
/* TITULO: Caudalímetro con sensor de flujo YF-S201 y LCD 2004. AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa vamos a poder medir el caudal de agua en L/hora, así como el volumen total en litros que pasa por el sensor, visualizando los valores a través de un LCD 2004. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | SCL del módulo I2C del LCD 2004 | 5V/MISO2 [ ][ ] A4/SDA[ ] | SDA del módulo I2C del LCD 2004 | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | Cable Amarillo del sensor de flujo YF-S201 | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - La alimentación y la masa del módulo LCM 2004 I2C V1 van directamente conectadas a VCC (+5V) y GND respectivamente. - Conexiones del sensor de flujo YF-S201: - Cable Rojo -> +5V de Arduino. - Cable Negro -> GND de Arduino. */ // Importar librerías #include <Wire.h> // Librería comunicación I2C #include <LiquidCrystal_I2C.h> // Librería LCD I2C // Declaración del objeto para el LCD // Poner la dirección del LCD a 0x20 para display 20x4 (A0=0, A1=0, A2=0) // Terminales de conexión del LCD // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); const int sensor = 2; // Pin digital para el sensor de flujo YF-S201 int litros_Hora; // Variable que almacena el caudal (L/hora) volatile int pulsos = 0; // Variable que almacena el número de pulsos unsigned long tiempoAnterior = 0; // Variable para calcular el tiempo transcurrido unsigned long pulsos_Acumulados = 0; // Variable que almacena el número de pulsos acumulados float litros; // // Variable que almacena el número de litros acumulados // Rutina de servicio de la interrupción (ISR) void flujo() { pulsos++; // Incrementa en una unidad el número de pulsos } void setup() { pinMode(sensor, INPUT_PULLUP); // Pin digital como entrada con conexión PULL-UP interna lcd.begin(20,4); // Inicializo el LCD 2004 interrupts(); // Habilito las interrupciones // Interrupción INT0, llama a la ISR llamada "flujo" en cada flanco de subida en el pin digital 2 attachInterrupt(digitalPinToInterrupt(sensor), flujo, RISING); tiempoAnterior = millis(); // Guardo el tiempo que tarda el ejecutarse el setup } void loop () { // Cada segundo calculamos e imprimimos el caudal y el número de litros consumidos if(millis() - tiempoAnterior > 1000) { // Realizo los cálculos tiempoAnterior = millis(); // Actualizo el nuevo tiempo pulsos_Acumulados += pulsos; // Número de pulsos acumulados litros_Hora = (pulsos * 60 / 7.5); // Q = frecuencia * 60/ 7.5 (L/Hora) litros = pulsos_Acumulados*1.0/450; // Cada 450 pulsos son un litro pulsos = 0; // Pongo nuevamente el número de pulsos a cero // Llamada a la función que muestra los resultados en el LCD 2004 LCD_2004(); } } // Función que muestra los resultados en el LCD 2004 void LCD_2004() { // Imprimo la cabecera del sistema lcd.clear(); lcd.setCursor(0,0); lcd.print(">CAUDALIMETRO YF-S201"); lcd.setCursor(0,1); lcd.print("********************"); // Presento los valores a través del LCD 2004 lcd.setCursor(0,2); // Imprimo el caudal en L/hora lcd.print("-> "); lcd.print(litros_Hora, DEC); lcd.print(" L/Hora"); lcd.setCursor(0,3); // Imprimo el número de litros acumulados lcd.print("-> "); lcd.print(litros); lcd.print(" Litros"); } |