我在用霍尔传感器读数。每当霍尔传感器靠近磁铁时,它就会发出低信号。旋转轮子上的问题是,当磁铁被卡在面对霍尔传感器的位置时,它会不断获得连续的零。我用它来计算旋转的次数。为了避免在代码中出现这种情况,我想在计数器卡在磁铁上之前取最后一个值,忽略之后的所有其他值,直到我停止读取传感器的值,或者直到轮子移动到传感器远离磁铁为止。在磁铁面向传感器的过程中,它在5秒内获得了大约20个有效的低信号(0)。
我如何在我的代码中实现它呢?
我现在使用的代码是,
while (flag = True):
sensor = GPIO.input(16)
if (sensor==0):
counter = counter +1编辑:我需要不断地读取值。根据旋转速度,它应该在5秒左右得到一次零。只有当它面对传感器时,它才会得到恒定的零(比如3秒内的10个零),我应该可以使用代码忽略它。也就是说,基本上,当它变零的速率非常高时,我应该能够忽略这些值,并且计数器值应该设置为它在计数器开始以如此快速的速度增加之前的值。一旦传感器获取零的速率降低,计数器就应该开始计数
发布于 2014-10-31 10:33:22
假设您的传感器读取数值的速度快于轮子的旋转速度(因此您永远不会获得连续两个有效的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 = sensorEDIT:如果传感器获取值的速率非常高,则希望忽略传感器,但如果以normal速率获取值,则使用这些值。
当你说"10 zeros in 3 seconds"时,你可能不是真正的意思(9个读数相隔1微秒,但前面和后面的读数相差4秒意味着所有的读数都是有效的)。...so这听起来像是你真正想要的是,如果一个零的读数与之前的读数太接近了(使用你的数字,相差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_timehttps://stackoverflow.com/questions/26666564
复制相似问题