Monitorización de capacidad de tanque de gasoil mediante sensor de ultrasonido
21 de junio de 2022 • fjbalon
Este proyecto consiste en desarrollar un método para monitorizar la capacidad utilizada en un tanque de gasoil, que nutre una caldera. 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.
Mi idea es poder tener la información accesible desde el PC u otros equipos informáticos, con el objetivo de poder predecir cuándo será necesario rellenar el tanque de nuevo, antes de que se gaste el gasoil, y poder observar la tasa de uso de gasoil en el tiempo, con tal de poder aplicar inteligencia. Por ejemplo, cotejar y relacionar el gasto de inverno con respecto verano; las horas y duración de las duchas, el gasto de calefacción, etcétera.
¿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:
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:
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 bajo un código (usaremos Python), que muestre por stdout cada segundo la distancia medida. El código será:
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 positivos como:
./distance.py
Distance = 85.8 cm
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 de un total de
, 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
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.
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 de estos valores, podemos configurar y dibujar gráficas.
Como se ve en la gráfica, el procedimiento requiere de pulido. 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.