目标
使用树莓派的GPIO,与霍尔流量计的信号线相接,在5V供电的情况下,通过脉冲计数测量水的累计流量。
实验工具
- 树莓派,我的是 zero w;
- 霍尔流量计,我买的是20块钱的 YF-B1 4分外牙,刚好与家里的自来水波纹管匹配;
- 电缆线,考虑到脉冲信号容易收到干扰,买的是1.5平方毫米的3芯屏蔽线,4元/米,1根10米;
- 1个5L的塑料桶;
- 1个精度较高(我的是精度0.001kg,量程<5kg)的电子秤,用来对接的水进行称重;
- putty用于远程树莓派;
- FileZilla用于向树莓派复制文件;
霍尔流量计
是一段带有叶轮的管,流体流过叶轮时叶轮转动,每转动一圈磁场变化一次,霍尔传感器产生一个脉冲信号,通过对脉冲信号计数可以得到水流量。
脉冲特性:F=aQ+b,F为叶轮的转动频率,单位Hz;Q为水的瞬时流量,单位L/min;a、b为转换系数,YF-B1脉冲特性为 F=11Q,量程1-30L/min。实际脉冲特性应该是一个F-Q的曲线。
pigpio
关于这个库在我的上一篇博文中介绍了,另外一个例子代码也是用来计数的。
python代码
每秒输出了2个结果:tf:累计流量,单位m3;f: 频率。
import os
import pigpio
class softpwm(object):
"""soft pwm based on pigpio with 1 GPIO need to be set"""
def __init__(self, gpio, fq=10, fqc=0, tf=0):
self._gpio = gpio#BCM gpio to be used as pwm input.
self._fq = fq#frequency by quality factor F=fq*Q+fqC.
self._fqc = fqc
self._tf = tf#total flow init value, m3.
# PIGPIO
pi = pigpio.pi()
self._pi=pi
if not self._pi.connected:
os.system('sudo pigpiod')
pi = pigpio.pi()
pi.set_mode(gpio, pigpio.INPUT)
self._high_tick00=None#last last high tick
self._high_tick0=None#last high tick
self._high=False#is high level, 1 0 1 0 is good and update period.
self._period=None#normal pusle duration, us
self._cb=pi.callback(gpio,pigpio.EITHER_EDGE,self._cbf)
def _cbf(self, gpio, level, tick):
if level == 1:#rising edge
if (self._high_tick0 is not None) & (self._period is not None):
t=pigpio.tickDiff(self._high_tick0, tick)
flow = (1000000.0/self._period-self._fqc)/self._fq*t/60000000.0/1000.0
self._tf = self._tf+flow
self._high_tick00 = self._high_tick0
self._high_tick0=tick
self._high=True
elif level == 0:#falling edge
if (self._high==True) & (self._high_tick00 is not None):
self._period=pigpio.tickDiff(self._high_tick00, self._high_tick0)
self._high = False
def frequency(self):
"""
Returns the PWM frequency.
"""
if self._period is not None:
return 1000000.0 / self._period
else:
return 0.0
def totalFlow(self):
"""
Returns total flow, m3.
"""
return self._tf
def stop(self):
self._cb.cancel()
self._pi.stop()
if __name__ == "__main__":
import time
import softpwm
PWM_GPIO = 4
SAMPLE_TIME = 1.0
p = softpwm.softpwm(PWM_GPIO,11)
while True:
time.sleep(SAMPLE_TIME)
tf = p.totalFlow()
f = p.frequency()
print("tf={:.5f} f={:.1f}".format(tf, f))
p.stop()
实验结果
在水龙头开到最大的情况下,频率f=98左右,相当于Q=9L/min,计量误差2%;
在f=33,Q=3L/min,误差13%;
在f=9.9,Q=0.9L/min,误差30%。
可见,霍尔流量计的脉冲特性适用于量程范围中间部分,小流量误差较大,f<4时霍尔流量计无法启动,即叶轮不转。