Cuando trabajo con Arduino, una de las cosas que ms me gusta es poder crear dispositivos o
aplicaciones como si estuviera jugando con un LEGO o Tente. Es increble las posibilidades que
nos brinda el Open Hardware. En este artculo vamos a ver un ejemplo de cmo podemos crear
un sensor de nivel de agua con Arduino. Cuando hablo de agua puede ser cualquier lquido e
incluso sustancias slidas. Lo nico que debemos de tener en cuenta es la capacidad del
recipiente.
Una de las formas ms sencillas es utilizar el sensor de ultrasonidos. Ya he hablado en algn otro
artculo de este sensor. Veremos las caractersticas principales para utilizarlo con Arduino. El otro
componente ser una pantalla LCD. Aqu es donde visualizaremos en todo momento la cantidad
de agua o lquido que queda en el recipiente. La aplicacin es sencilla, con el sensor de
ultrasonidos mediremos cuanta distancia hay hasta el lquido. Debemos conocer el recipiente para
saber cunta cantidad cabe y que medida se obtiene cuando est lleno. Lo mismo haremos
cuando el recipiente est vaco. Esto se llama calibracin. La pantalla LCD nos mostrar el
porcentaje de lquido que nos queda en el recipiente y su equivalente en litros. En este proyecto
haremos uso de las matemticas a nivel bsico y de la programacin a un nivel medio. Te lo ir
explicando todo paso a paso para que quede todo bien claro.
ndice de contenidos
1 El sensor de nivel de agua con Arduino nos permite medir cualquier lquido gracias al
sensor de ultrasonidos.
2 Componentes necesarios para el sensor de nivel de agua con Arduino
3 Circuito elctrico
4 Montando el sensor en la cubeta
5 Calibrando el sensor de nivel de agua con Arduino
6 Mostrando los datos en el LCD
7 Conclusiones
El sensor de nivel de agua con Arduino nos permite medir cualquier lquido gracias al
sensor de ultrasonidos.
La pieza ms importante en este proyecto ser el Arduino. En este caso podemos utilizar
cualquier modelo que tenga como mnimo 8 entradas digitales. En este tutorial trabajar con la
placa ms famosa de Arduino, la UNO.
El proyecto va a constar de diferentes fases donde iremos avanzando para conseguir nuestro
objetivo.
Lo primero que debemos hacer si queremos crear un sensor de nivel de agua con Arduino, es
conocer los componentes que vamos a utilizar. Por supuesto que esto es solo una idea, de todos
los componentes que voy a detallar a continuacin, alguno es prescindible.
Arduino UNO
Ser el cerebro de la aplicacin y el encargado de gestionar todos los sensores a travs de las
entradas y salidas digitales. En la programacin reside su potencia. Veremos que cdigo debemos
implementar para poder medir el nivel en un recipiente.
Ya hemos visto en diferentes artculos e incluso un captulo del podcast cmo funciona este
sensor. No voy a entrar en detalle en su funcionamiento solo comentar que este tipo de sensores
se basan en medir cuanto tiempo tarda en viajar una onda ultrasnica desde que sale del sensor
hasta que regresa.
Gracias a este tiempo y sabiendo la velocidad del sonido, es fcil calcular la distancia aplicando la
famosa frmula.
Adems de los componentes esenciales para el sensor de nivel de agua con Arduino, vamos a
necesitar los tpicos componentes que se suelen utilizar en muchos circuitos. Te los detallo a
continuacin.
Protoboard
Potencimetro 10k
Resistencia 220
Cables
Circuito elctrico
Con todos los componentes en nuestro poder, ya podemos empezar a montar el circuito. Como ya
he comentado al principio del artculo, vamos a necesitar 8 entradas y salidas digitales. Adems
utilizaremos el pin de 5V y el GND (toma de tierra). El circuito sera el siguiente.
Antes de meternos en faena y empezar a programar el sensor de nivel de agua con Arduino,
vamos a probar los diferentes componentes del circuito elctrico. Es importante asegurarnos de
que todo est bien conectado. Lo ms sencillo es probar cada componente por separado y as es
como lo haremos.
Para probar este sensor vamos a cargar un sketch que no servir ms adelante a la hora de medir
el nivel. Las conexiones Echo y Trigger van a los pines 6 y 7 respectivamente. Carga el siguiente
sketch en tu placa de Arduino y comprueba el monitor serie.
8 float distancia;
10 void setup()
11 {
13 Serial.begin(9600);
17 pinMode(PinEcho, INPUT);
18 }
19 void loop()
20 {
21 iniciarTrigger();
22
23 // La funcin pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
25
26 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que est en microsegundos
29 Serial.print(distancia);
30 Serial.print("cm");
31 Serial.println();
32 delay(500);
33 }
34
36 void iniciarTrigger()
37 {
39 digitalWrite(PinTrig, LOW);
40 delayMicroseconds(2);
41
43 digitalWrite(PinTrig, HIGH);
44 delayMicroseconds(10);
45
47 digitalWrite(PinTrig, LOW);
48 }
Como su nombre indica, se trata de una pantalla de 16 columnas y 2 filas. Esto nos va a permitir
escribir un total de 32 caracteres a la vez. Ahora lo que haremos es escribir un simple texto para
comprobar que todo est bien conectado. Carga el siguiente sketch en tu placa.
2 #include <LiquidCrystal.h> // Entre los smbolos <> buscar en la carpeta de libreras configurada
10
11 void setup() {
12 // Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
13 lcd.begin(COLS, ROWS);
14 }
15
16 void loop() {
17
18 lcd.setCursor(0,0);
19 lcd.print("Hola Mundo!!!!!!");
20 lcd.setCursor(0,1);
21 lcd.print("Probando el LCD.");
22 }
Por lo tanto, el resultado que debemos obtener es el texto Hola Mundo!!!!!! en la primera fila y en
la segunda fila Probando el LCD.. Debes obtener algo parecido a esto.
Ya hemos montado todo el circuito, hemos comprobado que todo funciona correctamente y ahora
vamos a montar el sensor encima del recipiente o cubeta donde vamos a tener el lquido. Lo
podemos hacer de muchas formas, yo te voy a mostrar una muy sencilla utilizando dos palos de
madera que se utilizan para cocinar. Son los tpicos para saber si el bizcocho est hecho o para
hacer brochetas.
Adems, he utilizado dos alambres de los tpicos que vienen en cualquier embalaje para sujetar
cables. Suelo recolectar este tipo de agarres ya que son muy tiles en muchas ocasiones. El
resultado lo puedes ver en las siguientes imgenes.
Gracias a estos dos palos podemos situar el ultrasonidos baca abajo encima de cualquier
recipiente o cubeta. En la siguiente imagen te muestro un ejemplo de cmo quedara.
Esto tambin nos puede servir de sujecin con alguna goma elstica u otro mtodo para que no
se mueva.
Ha llegado la hora de empezar a programar. Lo primero que debemos hacer es calibrar el sensor
de nivel de agua con Arduino. Para ello voy a utilizar un vaso medidor es decir, un vaso que tiene
marcadas las medidas. As podremos asignar una medida del sensor de ultrasonidos a una
cantidad de lquido. Esto nos permitir saber qu cantidad de lquido tenemos en el recipiente.
Algo que tienes que tener en cuenta es que el sensor de ultrasonidos mide la cantidad de espacio
vaco en el recipiente. Por lo tanto, si conocemos la capacidad total del recipiente, al restar la
cantidad de espacio vaco sabremos cunto lquido hay. Mira el esquema general.
Entonces, segn este esquema general debemos conocer que valor obtenemos con el sensor de
ultrasonidos cuando est vaco, cuando est lleno y una medida conocida. Esta ltima medida la
haremos con vaso medidor calculando el valor para 100 ml.
Antes de comenzar con las medidas, debemos de tener en cuenta que el vaso debe ser cilndrico
es decir, la base debe ser del mismo dimetro que la parte de arriba. Si intentamos medir en un
recipiente que no es cilndrico, en forma de cono, las medidas no sern proporcionales.
En todos los sistemas electrnicos se genera un ruido debido al movimiento de los electrones, al
propio sensor, la placa de Arduino, etc Esto se traduce en una variacin o fluctuacin en las
medidas que vamos obteniendo a travs del sensor. Para eliminar este tipo de ruido se suele
aplicar un filtro paso bajo que elimina las frecuencias bajas, justo donde se encuentra el ruido. La
forma ms sencilla de aplicarlo a travs de la programacin es hacer una media de los valores
que se van obteniendo.
Pero no solo para eliminar el ruido, calculando la media podemos eliminar las fluctuaciones
debidas al movimiento del recipiente. Imagnate un depsito de gasolina de un coche. Cuando va
en marcha el combustible no est quieto, se va moviendo. Si se quiere medir con un sensor de
ultrasonidos sera complicado si no se utiliza alguna tcnica como esta.
Dependiendo del nmero de muestras que utilicemos para obtener la media, podremos tener un
valor ms preciso o menos preciso. Pero esto tambin influye en cunto tarda en estabilizarse la
medida cuando se produce un cambio. Por lo tanto, si cogemos un nmero alto de muestras, la
media ser ms precisa pero tardar ms tiempo en reflejar los cambios. Por el contrario, si
cogemos un nmero bajo de muestras, la media ser menos precisa pero veremos reflejados ms
rpidos los cambios. Elegir uno u otro depender de lo que queramos conseguir, rapidez o
precisin.
Otro factor a tener en cuenta es el tamao del tipo de dato que vamos a almacenar. Debemos de
tener mucho ojo ya que podemos provocar un desbordamiento. Todas las muestras se irn
almacenando en una variable para luego calcular la media, por lo tanto si elegimos un nmero alto
de muestras debemos asegurarnos que no nos saldremos de rango.
En este caso yo voy a elegir precisin, voy a coger un rango de muestras de 100. El cdigo es
muy parecido al que hemos utilizado para probar el sensor de ultrasonidos al que he aadido el
clculo de la media cada 100 valores. No voy a profundizar ms en esta tcnica, si quieres
aprender todo lo que hay detrs te aconsejo que veas la leccin donde muestro como estabilizar
el sensor de temperatura LM35.
El cdigo que debes cargar en tu placa es el siguiente
8 // Nmero de muestras
10
15 bool primeraMedia = false; // Para saber que ya hemos calculado por lo menos una
16
17 void setup()
18 {
20 Serial.begin(9600);
22 pinMode(PinTrig, OUTPUT);
24 pinMode(PinEcho, INPUT);
25
26 // Inicializamos el array
28 {
29 lecturas[i] = 0;
30 }
31 }
32 void loop()
33 {
37 iniciarTrigger();
38
39 // La funcin pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
41
42 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que est en microsegundos
45
47 lecturas[lecturaActual] = distancia;
48
51
53 lecturaActual = lecturaActual + 1;
54
57 {
58 primeraMedia = true;
59 lecturaActual = 0;
60 }
61
62 // Calculamos la media
64
66 if (primeraMedia)
67 {
68 Serial.print(media);
69 Serial.println("cm");
70 }
71
72 delay(500);
73 }
74
76 void iniciarTrigger()
77 {
79 digitalWrite(PinTrig, LOW);
80 delayMicroseconds(2);
81
83 digitalWrite(PinTrig, HIGH);
84 delayMicroseconds(10);
85
87 digitalWrite(PinTrig, LOW);
88 }
Estos son los datos que yo he obtenido, seguramente tu hayas obtenido otros valores, depender
del recipiente y de la cantidad de lquido que entre en dicho recipiente.
Con los datos obtenidos en la fase anterior, con el recipiente en vaco, lleno y con 100 ml, ya
podemos obtener una frmula para el sensor de nivel de agua con Arduino. Las medidas
obtenidas nos indican la cantidad de espacio vaco que hay en el recipiente. Vamos a comenzar
cambiando el rango para llevarlo a 0 eliminando el offset de 2,20 cm. Es como si el lquido
estuviera a 0 cm cuando el recipiente est cero.
9,21 cm 0 cm 7,06 cm
El siguiente paso es calcular cunto ocupa 100 ml de lquido en nuestro recipiente. Esto se hace
restando la distancia cuando est vaco menos la distancia cuando tiene 100 ml.
Esta medida nos dice que cada 2,15 cm hay 100 ml de lquido. Con esto ya es sencillo calcular
cunto lquido hay dentro del recipiente. Vamos a hacerlo con un ejemplo. Supongamos que el
sensor de ultrasonidos nos da un distancia de 7,11 cm. Ese sera el espacio vaco pero
nosotros queremos saber cunto espacio queda lleno. Lo calculamos restando la distancia en
vaco menos la distancia obtenida.
Como sabemos que cada 2,15 cm hay 100 ml, aplicando una simple regla de 3 sabremos la
cantidad de lquido que tenemos.
Pues ya tenemos la base matemtica para calcular el nivel de lquido en nuestro recipiente, ahora
solo nos queda aplicar dichos clculos en nuestro sketch.
Todo esto tenemos que plasmarlo en un sketch para subirlo a nuestro Arduino. A continuacin te
dejo el cdigo para que veas como lo he hecho. Fjate en los comentarios.
8 // Nmero de muestras
10
14
19 bool primeraMedia = false; // Para saber que ya hemos calculado por lo menos una
20
21 void setup()
22 {
24 Serial.begin(9600);
26 pinMode(PinTrig, OUTPUT);
27 // Ponemos el pin Echo en modo entrada
28 pinMode(PinEcho, INPUT);
29
30 // Inicializamos el array
32 {
33 lecturas[i] = 0;
34 }
35 }
36 void loop()
37 {
40
41 iniciarTrigger();
42
43 // La funcin pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
45
46 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que est en microsegundos
49
51 lecturas[lecturaActual] = distancia;
52
55
57 lecturaActual = lecturaActual + 1;
58
61 {
62 primeraMedia = true;
63 lecturaActual = 0;
64 }
65
66 // Calculamos la media
68
70 if (primeraMedia)
71 {
74
75 Serial.print(media);
76 Serial.println(" cm");
77
78 Serial.print(cantidadLiquido);
79 Serial.println(" ml");
80 }
81
82 delay(500);
83 }
84
86 void iniciarTrigger()
87 {
89 digitalWrite(PinTrig, LOW);
90 delayMicroseconds(2);
91
93 digitalWrite(PinTrig, HIGH);
94 delayMicroseconds(10);
95
97 digitalWrite(PinTrig, LOW);
98 }
Mostrando los datos en el LCD
Por ltimo y, aunque no es necesario, vamos a mostrar la informacin en una pantalla LCD de
162. La informacin que vamos a mostrar es la cantidad de lquido en ml y el porcentaje de
llenado. Estos datos son fundamentales en el sensor de nivel de agua con Arduino.
El siguiente cdigo lo nico que hago es mezclar el cdigo anterior donde obtenemos la cantidad
de lquido y el cdigo con el que hemos probado el LCD.
2 #include <LiquidCrystal.h> // Entre los smbolos <> buscar en la carpeta de libreras configurada
10
14
17
18 // Nmero de muestras
20
24
29 bool primeraMedia = false; // Para saber que ya hemos calculado por lo menos una
30
31 void setup()
32 {
34 Serial.begin(9600);
36 pinMode(PinTrig, OUTPUT);
38 pinMode(PinEcho, INPUT);
39
40 // Inicializamos el array
42 {
43 lecturas[i] = 0;
44 }
45
46 // Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
47 lcd.begin(COLS, ROWS);
48 }
49 void loop()
50 {
53
54 iniciarTrigger();
55
56 // La funcin pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
58
59 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que est en microsegundos
62
64 lecturas[lecturaActual] = distancia;
65
70 lecturaActual = lecturaActual + 1;
71
74 {
75 primeraMedia = true;
76 lecturaActual = 0;
77 }
78
79 // Calculamos la media
81
83 if (primeraMedia)
84 {
88
90 lcd.clear();
91 // Cantidada de lquido
92 lcd.setCursor(0, 0);
94
95 // Porcentaje
96 lcd.setCursor(0, 1);
98
99 Serial.print(media);
101
102 Serial.print(cantidadLiquido);
104 }
105 else
106 {
109 }
110
111 delay(500);
112 }
113
114 // Mtodo que inicia la secuencia del Trigger para comenzar a medir
116 {
119 delayMicroseconds(2);
120
123 delayMicroseconds(10);
124
127 }
Conclusiones
En este tutorial hemos visto como crear un sensor de nivel de agua con Arduino. Con un
presupuesto inicial de unos 44 hemos podido realizar un proyecto de principio a fin. En este
presupuesto no entran las horas de programacin ni de imaginacin, eso muchas veces no es
cuantificable. Sin duda alguna este proyecto se puede mejorar y te animo a que lo hagas. Te voy a
dar unas pautas donde podras aplicar mejoras para que puedas utilizarlo en ambientes donde se
exija mayor precisin y estabilidad.
Cualquier duda o sugerencia me la dejas en los comentarios de este artculo. Y con esto damos
por terminado el tutorial donde hemos creado un sensor de nivel de agua con Arduino, si te ha
gustado comprtelo, y si tienes alguna duda deja un comentario, gracias :)