En esta entrada te enseñaremos como puedes realizar tu propio sensor de nivel de agua ultrasónico usando un sensor ultrasónico HC-SR04 y tu placa Arduino favorita.
Realizaremos la medición de distancia entre un sensor ultrasónico colocado en la parte superior de un recipiente y la superficie del líquido que contiene para saber en todo momento el volumen contenido en el recipiente y calcular el porcentaje de llenado.
Una vez que nuestro proyecto a escala funcione, podemos aplicar el mismo principio que veremos durante este tutorial para realizar mediciones en recipientes mas grandes. Por ejemplo la cisterna en una casa o el tanque que alimenta nuestro hogar.
Materiales necesarios para el proyecto
Para armar este proyecto se requiere el siguiente material:
- Arduino Uno R3
- Sensor ultrasónico HC-SR04
- Shield de pantalla LCD de 16×2 caracteres.
- Cable para el sensor ultrasónico de 4 vías.
Conviene también que tengamos a la mano una cubeta o recipiente de tamaño mediano, donde podamos verter el líquido que deseamos medir, con la finalidad de que comprobemos que el proyecto funciona como se espera.
Armado del circuito eléctrico de sensor de nivel de agua con arduino
Armar el circuito eléctrico es sumamente sencillo. Solamente debemos conectar el shield de LCD con teclado al arduino y la parte de la pantalla LCD quedará solucionada. Todas las señales necesarias para el correcto funcionamiento de la pantalla estarán conectadas de forma correcta. Si deseas tener más detalles sobre la conexión de una pantalla LCD alfanumérica con el arduino, te recomendamos este otro artículo.
Para el sensor ultrasónico, podemos utilizar los pines que tenemos disponibles en el shield de pantalla LCD 16×2, tal como se muestra en las fotografías a continuación. Nosotros hemos utilizado borneras miniatura, pero vale utilizar cualquier método que consideremos apropiado para la conexión de los 4 hilos. Hay que observar que la disposición de los pines sobre el shield está desplazada del orden normal.
Para este experimento, nos conviene tener alejada la parte electrónica de los líquidos, por lo que nuestra sugerencia es soldar un cable de un par de metros al sensor ultrasónico. En nuestro caso, hemos utilizado cable flexible para sistemas de alarma, que tiene convenientemente 4 hilos de colores. Nos ha quedado de la siguiente manera:
Probando el sensor ultrasónico y la pantalla LCD.
La parte crítica de este proyecto es la medición de distancia, por lo que antes de seguir con las pruebas usando agua, recomendamos probar que nuestro sensor ultrasónico realmente este funcionando correctamente utilizando el programa que se muestra a continuación.
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 | #include <NewPing.h> /*Aqui se configuran los pines donde debemos conectar el sensor*/ #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 /*Crear el objeto de la clase NewPing*/ NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(9600); } void loop() { // Esperar 1 segundo entre mediciones delay(1000); // Obtener medicion de tiempo de viaje del sonido y guardar en variable uS int uS = sonar.ping_median(); // Imprimir la distancia medida a la consola serial Serial.print("Distancia: "); // Calcular la distancia con base en una constante Serial.print(uS / US_ROUNDTRIP_CM); Serial.println("cm"); } |
Deberás tener el arduino conectado a la PC mediante cable USB para visualizar los datos que ingresan desde el puerto serie.
Realizando cálculos de porcentaje y volumen para nuestro medidor de nivel de agua con arduino.
Para el programa que realiza el calculo del porcentaje de llenado del recipiente, estaremos usando la función map que viene incluida en la librería estándar de arduino. Esta función nos permitirá realizar la traducción entre la distancia medida por el sensor ultrasónico y el porcentaje de llenado del recipiente.
La entrada de la función será la distancia medida por el sensor, mientras que la salida será un porcentaje en el rango de 0 a 100%. Luego utilizaremos el valor del porcentaje para calcular el total del volumen de líquido en el recipiente.
Deberemos configurar algunas cosas, dependiendo de las condiciones de nuestro recipiente. En nuestro caso, para una aplicación real, lo hemos configurado como se muestra abajo.
El programa completo queda de la siguiente forma:
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 | /** GeekFactory - "INNOVATING TOGETHER" Distribucion de materiales para el desarrollo e innovacion tecnologica www.geekfactory.mx Programa que permite elaborar un sensor de nivel de agua con un sensor ultrasónico. Muestra la lectura en una pantalla LCD de 16 x 2 lineas y activa un led cuando el nivel es bajo. */ #include <NewPing.h> #include <LiquidCrystal.h> #include <GFLed.h> // configurar aqui el pin trigger del sensor #define CONFIG_LEVEL_SENSOR_TRIG_PIN 2 // configurar aqui el pin echo del sensor #define CONFIG_LEVEL_SENSOR_ECHO_PIN 3 // configurar la distancia maxima a detectar #define CONFIG_LEVEL_SENSOR_MAX_DISTANCE 200l // configurar la capacidad máxima del recipiente #define CONFIG_LEVEL_SENSOR_MAX_LITERS 5000l // configurar la distancia cuando el recipiente está lleno #define CONFIG_LEVEL_SENSOR_FULL 30 // configurar la distancia cuando el recipiente está vacío #define CONFIG_LEVEL_SENSOR_EMPTY 178 // configurar el nivel de porcentaje donde empezará a funcionar el led #define CONFIG_LEVEL_SENSOR_ALERT_LEVEL 20 // objetos requeridos para el manejo del hardware NewPing sonar(CONFIG_LEVEL_SENSOR_TRIG_PIN, CONFIG_LEVEL_SENSOR_ECHO_PIN, CONFIG_LEVEL_SENSOR_MAX_DISTANCE); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); GFLed alarmLed; uint32_t lastm = 0; // funcion de setup de arduino void setup() { Serial.begin(115200); lcd.begin(16, 2); alarmLed.setColor(LED_NONE); } // ciclo principal del programa void loop() { // esperar entre mediciones if (millis() - lastm >= 5000) { lastm = millis(); // obtener medicion de tiempo de viaje del sonido y guardar en variable us int32_t cm = sonar.ping_median() / US_ROUNDTRIP_CM; // convertir distancia en porcentaje int32_t percent = map(cm, CONFIG_LEVEL_SENSOR_EMPTY, CONFIG_LEVEL_SENSOR_FULL, 0, 100); // convertir porcentaje a litros int32_t liters = percent * CONFIG_LEVEL_SENSOR_MAX_LITERS / 100; // imprimir al monitor serial Serial.print(F("Distancia / porcentaje / litros: ")); Serial.print(cm); Serial.print(' '); Serial.print(percent); Serial.print(' '); Serial.print(liters); Serial.print(' '); Serial.println(); // imprimir a la pantalla lcd.clear(); lcd.print(F("Nivel: ")); lcd.print(percent); lcd.print('%'); lcd.setCursor(0, 1); lcd.print(F("Volumen: ")); lcd.print(liters); lcd.print('L'); // led de alerta if (percent < CONFIG_LEVEL_SENSOR_ALERT_LEVEL) { alarmLed.setColor(LED_GREEN); } else { alarmLed.setColor(LED_NONE); } } // parpadeo de led alarmLed.process(); } |
Estructura y uso de la función map.
Esta función re mapea un número en un rango determinado a otro. Debemos indicarle el rango de valores que esperamos en la entrada, así como el rango de valores que esperamos en la salida. Para nuestro caso la función estará operando con valores de tipo entero de 32 bits.
1 | map(value, fromLow, fromHigh, toLow, toHigh) |
Parámetros:
- value: la variable que deseamos mapear en un rango distinto.
- fromLow: valor bajo del rango actual.
- fromHigh: valor alto del rango actual.
- toLow: límite bajo del rango destino.
- toHigh: límite alto del rango destino.
La documentación de la función map se puede encontrar en la siguiente dirección de internet:
Haciendo nuestro sensor de nivel de agua con arduino y ultrasónico más resistente.
Hasta ahora hemos logrado que nuestro proyecto de sensor de nivel de agua con arduino sea funcional y lo hemos realizado de una forma muy económica. Pero ¿que pasa si realmente deseamos aplicarlo para medir el nivel de líquido en un ambiente húmedo? La respuesta a esta pregunta es que sencillamente el sensor que hemos sugerido no es el adecuado, ya que probablemente no dure mas que unas semanas dentro de un tanque de agua.
Afortunadamente, podemos subsanar esto de forma sencilla cambiando nuestro sensor ultrasónico por un módulo capaz de soportar las condiciones de humedad como el modelo AJ-SR04M que incluye un módulo electrónico y un transductor a prueba de agua.

El sensor ultrasónico modelo, que se muestra en la fotografía anterior, permite ser colocado en un recipiente en condiciones de humedad, ya que el transductor empleado en este es del mismo tipo que los empleados en sensores de reversa automotrices.
Conclusión
Como hemos podido observar, para realizar un proyecto completo con arduino bastan unos cuantos componentes y un presupuesto modesto.
En este caso, hemos realizado un dispositivo capaz de ayudarnos a determinar el nivel de líquido en un recipiente mediante un sensor ultrasónico. Este proyecto podrá ampliarse de acuerdo a las necesidades de cada uno de nuestros lectores, por lo que podremos utilizarlo para enviar los datos del sensor a internet, accionar alguna bomba o mecanismo o incluso hacer sonar una alarma.
Si tienes alguna idea para la aplicación de este circuito, no dudes en compartirla con nosotros a través de los comentarios en esta página.