我正在读取霍尔传感器的值。只要霍尔传感器位于磁铁附近,它就会发出低信号。旋转轮上的问题是,当磁铁卡在面向霍尔传感器的位置时,它会不断变为连续的零点。我用它来计算转数。为了避免在代码中出现这种情况,我想在计数器卡在磁铁上之前取出计数器的最后一个值,然后忽略所有其他值,直到我停止从传感器读取值或直到车轮移动为止传感器远离磁铁。在磁铁面向传感器的过程中,磁铁在5秒内达到20低电平有效信号(0)。
如何在我的代码中实现它?
我现在使用的当前代码是,
while (flag = True):
sensor = GPIO.input(16)
if (sensor==0):
counter = counter +1
编辑:我需要不断地读取值。假设基于旋转速度在5秒内左右获得一次零。只有当它面向传感器卡住时,它才会得到恒定的零(在3秒内像10个零),我应该可以使用代码忽略它。也就是说,基本上我应该能够忽略当它获得零的速率非常高时的值,并且计数器值应该设置为在计数器开始以该快速增加的速度增加之前的值。一旦传感器变为零的速率降低,计数器就应该开始计数
答案 0 :(得分:0)
假设您的传感器读取的值比轮子旋转的速度快(因此您将永远不会连续获得两个有效的0),只需跟踪最后一个值以确保连续不会得到两个零:
last_sensor = None # or object()
while flag:
sensor = GPIO.input(16)
if (sensor==0 and sensor != last_sensor):
counter = counter +1
last_sensor = sensor
修改强>
您想要忽略传感器,如果它获得的速率非常高,但如果它以normal
速率获得它们,则使用这些值。
当你说"10 zeros in 3 seconds"
时,你可能并不是真的那个意思(9个读数间隔1微秒,但是前面和后面的读数是4秒关闭意味着所有的读数都是有效的)。 ...所以这听起来像你真正想要的是如果一个零读数太接近于先前的读数(使用你的数字,3/10秒),然后忽略它。如果这就是你想要的,你只需要使用上面的代码,但是有时间限制:
import time
last_time = time.time() - 10 # ensure we get the first reading
min_gap = 3/10.0 # minimum number of seconds between zeros
while flag:
sensor = GPIO.input(16)
cur_time = time.time()
if sensor==0:
if cur_time - last_time > min_gap:
counter = counter +1
last_time = cur_time