Cómo he monitorizado la capacidad del tanque de gasoil mediante sensor de ultrasonido

Hallá por 2021/2022 desarrollé un pequeño proyecto con el objetivo de monitorizar el tanque de gasoil que suministraba la caldera de mi casa. La única forma de conocer la capacidad era mediante un piloto analógico que indicaba.

No estoy seguro de en qué categoría tendría más sentido, de momento lo dejo en Hardware, ¡pero estoy seguro que @5ombr4 me lo moverá si así lo ve mejor! :grin:

Mi idea era poder tenerlo accesible mediante el PC con varios objetivos:

  1. Poder predecir cuándo sería necesario rellenar el tanque.
  2. Poder observar la tasa de uso de gasoil en el tiempo, con tal de poder aplicar inteligencia y observar qué gastaba más, en qué tiempo, etcétera.

Existen diversas técnicas para lograrlo, pero la que considero más sencilla y más técnica es hacerlo a través de un sensor ultrasónico. Este sensor enviará los datos digitalizados a una Raspberry Pi 3B, que los procesará y almacenará, de tal forma que permita mantener un registro de monitorización y estadísticas de tiempo.

Funcionamiento del sensor

¿Cómo funciona el sensor de ultrasonido y cómo calculamos la distancia?. El funcionamiento es simple. El sensor crea un pulso de disparo en TRIG (trigger), enviando pulsos de 40kHz (manteniendo el estado de TRIG en HIGH durante un mínimo de 10µs). Inmediatamente, el circuito de control en el sensor cambiará el estado del pin de ECHO a HIGH, y manteniéndose así hasta que el pulso ultrasónico rebote con un objeto y regresa al receptor. En función del tiempo durante el cual el pin de ECHO permanece HIGH, esperando recibir de vuelta el pulso enviado, podemos calcular la distancia entre sensor y objeto. El emisor de pulsos es T, y el receptor es R.

Por poner un ejemplo, si calculamos el tiempo para el cual el ECHO es HIGHT como 588µs, y tomando que la velocidad del sonido en la atmósfera terrestre es de 343,2m/s:

cálculo de distancia a obstáculo

Conexiones electrónicas

Conectamos el pin TRIG del sensor ultrasónico al pin físico 16, es decir, el pin GPIO23 de la raspy. Usamos posteriormente una combinación de resistencia de 1kΩ y 2kΩ para convertir el pin de ECHO a 3.3V (aproximadamente) y conéctelo al pin físico 18 (GPIO24). Finalmente proporcionamos las conexiones de +5V y GND. El esquema de comunicaciones electrónicas quedaría tal que:

Cálculo de distancia contra objeto

Una vez sabemos cómo calcular la distancia y tenemos conectado el sensor a nuestra CPU, el siguiente paso consiste en probar las ecuaciones anteriores en código. He elegido desarrollar un breve script en Python que muestre por stdout la distancia medida.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 23
GPIO_ECHO = 24
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)

StartTime = time.time()
StopTime = time.time()

while GPIO.input(GPIO_ECHO) == 0:
StartTime = time.time()

while GPIO.input(GPIO_ECHO) == 1:
StopTime = time.time()

TimeElapsed = StopTime - StartTime
distance = (TimeElapsed * 34320) / 2

print ("Distance = %.1f cm" % distance)

Obteniendo unos resultados:

$ ./distance.py
Distance = 85.8 cm

Cálculo de subcuboide

El siguiente paso, una vez podemos calcular la distancia entre el emisor de ultrasonido y el obstáculo que constituye el fluído de gasoil, hemos de calcular el tamaño del tanque para poder establecer una equivalencia con la distancia obtenida y, así, poder determinar la capacidad ocupada.

Para dinamizar y simplificar los cálculos de capacidad, he modelizado el tanque como un cuboide, esto evidentemente no dará una capacidad 100% precisa con la realidad del tanque, que tiene bordes redondeados; pero será más simple.

Dado un cuboide de 112x100x71, que corresponde a las medidas aproximadas del tanque de gasoil:

Y recibido el valor de distancia entre sensor y gasoil, es sencillo calcular las medidas del subcuboide resultante. Por ejemplo, dada una distancia de 85cm:

Obtendríamos un subcuboide de 15x112x71 que corresponde a x * (y - d) * z = 112 * (100 - 85) * 71 = 119.280cm3 = 119L , un 14% de capacidad.

Una vez obtenidos los datos, adaptamos el script de forma simple stdin/stdout (para monitorización) de forma que devuelva un float con los litros restantes según los parámetros de entrada:

ancho=112 # Coordinate axis x: ancho / width
alto=100 # Coordinate axis y: alto / height
profundidad=71 # Coordenate axis z: profundidad / depth

def volumenCuboide(x,y,z):
return x * y * z

def subcuboide(x,y,z,d):
s = y - d
return volumenCuboide(x,s,z)

l = subcuboide(ancho,alto,profundidad,distance)/1000 # Divsion by 100 for cm^3 to liters
print ("%.1f" % l)

Así:

$ ./gasoil40kHz.py
119.4

Instalación

Con todo ideado y probado, aquí os muestro unas fotografías reales de cómo conseguí dejarlo más o menos estable, de la forma más perpendicular posible al eje x del tanque:

Me valgo de uno de los tapones del tanque para colocar, usando adhesivos, y de la forma más perpendicular posible al eje x del tanque, el sensor de ultrasonido. Aprovecho que los cable son finos para pasarlos por el aislante de la propia prensa del tapón, quedando el resto del circuito fuera.

Aprovechando también que los cable son finos para pasarlos por el aislante de la propia prensa del tapón, quedando el resto del circuito fuera.

Una vez instalado, para realizar la obtención de datos gráficos configuramos la máquina receptora de los datos del sensor en un agente de Zabbix. Añadimos un UserParameter que contenga la llamada al script, de forma que obtengamos los valores directamente desde el servidor de Zabbix.

# /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
AllowKey=system.run[*]
Server=172.16.0.1
ServerActive=172.16.0.1
Hostname=gasoil40kHz
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UserParameter=Gasoil,/home/pi/gasoil.py

Con esto y en monitorización a través de Zabbix que tomaría datos en función de os parámetros que le asignemos en la línea de tiempo, podemos configurar y dibujar gráficas. Aquí un ejemplo:

Como se ve en la gráfica, es pulible. Hay un cierto baile de datos en cuanto a las lecturas, por eso he empleado una gráfica de puntos para notar las variaciones de lectura, que pueden deberse a gases propios del fluido monitorizado; o a movimientos de la superficie del tanque provocados por el extractor de gasoil hacia la caldera. De todas formas, para el uso y la línea de tiempo sobra y basta.

El margen de error presente se encuentra en unos 6l. Pero con dicho margen se puede hacer una aproximación fidedigna del rango de capacidad y consumo del tanque.

8 Me gusta

¡Es tremendo proyectazo!
Todavía no contamos con una categoría adecuada para esto en el foro. Es un proyecto que involucra tanto software como hardware, así que lo voy a dejar por acá.

Volviendo al tema en cuestión. Se nota que realmente le dedicaste tiempo al asunto.
Te iba a recomendar usar una Raspberry Pi Zero 2W para el proyecto, pero veo que ya tenés una 3b+ en tus manos, por lo que mejor así.
Siempre quise probar esos sensores de proximidad y en algún momento sé que me voy a hacer con uno jajajaja

Me encanta lo que has hecho a nivel general, me encanta la practicidad del mismo y me encanta ver cuando alguien aplica las herramientas que usa “día a día” en cosas que le mejoran la calidad de vida.
Sin ir más lejos, tenemos a @Yomes con su script para monitoreo del equipo, y también parece que se va a empezar un videojuego en esta comunidad. Muy posiblemente sea necesaria una categoría “Portafolios” en donde ubicar a todos los proyectos del foro.

1 me gusta

Un proyecto muy práctico e interesante. Me gusta que combine informática, electrónica, física y geometría.

Como sugerencia, para afinar la medición, lo que podría hacer el programa es tomar varias medidas (5 o 10, por ejemplo) en un período de tiempo relativamente largo (quizá un segundo o dos), calcular la media y devolver el resultado. Eso debería filtrar el “ruido” causado por los gases y partículas en suspensión que pudiera haber en el depósito.

Una aproximación distinta al problema sería usar un sensor de presión en el fondo del tanque, en lugar de medir la distancia a la superficie, pero sería más complicado, más caro, supondría rehacerlo todo de cero y no estoy muy seguro que que diera valores más precisos. Creo que tu solución es más elegante.

1 me gusta

¡Wow, me encantó!

Ni sabía que se podía hacer ello con una RPi, pensaba que los buses de la RPi eran al estilo del x86, o sea, no modificables, personalmente yo habría preferido hacer la gráfica localmente por mera desconfianza de las bigcorps. =~=

Igual la idea es bastante buena, me sirvió para repasar matemáticas. xD

1 me gusta

La verdad es que son aparatos increíbles, hasta el puerto GPIO es totalmente configurable, por lo que se le pueden conectar sensores de toda clase.
Los ejemplos que dí en mi guía de Raspberry Pi sólo dí algunos ejemplos de los proyectos que se pueden realizar, pero el límite es la imaginación de cada no. Con decirte que los brazos robóticos que fabrican Raspberry Pi’s usan de cerebro otras Raspberry Pi’s jajajaja.

1 me gusta

La skill que hay entre mis seguidores no tiene ningún sentido…

4 Me gusta

Quiero remarcar mucho la iniciativa que tienen los miembros. Son increíbles.

Realmente un proyecto interesante. Te recomiendo emplear un Filtro Digital para eliminar ese ruido excesivo que posee para aumentar la precian. Puedes usar un filtro pasa bajos simple para empezar. Si conoces la FT del sistema, puedes ir a un filtro mas complejo. O si no conoces el sistema, por el siempre confiable NLMS. No es difícil de emplear y tengo una implementación del mismo en C si quieres usarlo.