树莓派pigpio接霍尔流量计测量水流量

目标

    使用树莓派的GPIO,与霍尔流量计的信号线相接,在5V供电的情况下,通过脉冲计数测量水的累计流量。

实验工具

  1. 树莓派,我的是 zero w;
  2. 霍尔流量计,我买的是20块钱的 YF-B1 4分外牙,刚好与家里的自来水波纹管匹配;
  3. 电缆线,考虑到脉冲信号容易收到干扰,买的是1.5平方毫米的3芯屏蔽线,4元/米,1根10米;
  4. 1个5L的塑料桶;
  5. 1个精度较高(我的是精度0.001kg,量程<5kg)的电子秤,用来对接的水进行称重;
  6. putty用于远程树莓派;
  7. 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时霍尔流量计无法启动,即叶轮不转。

    

猜你喜欢

转载自blog.csdn.net/xhydongda/article/details/109751115
今日推荐