【问题标题】:How do I pause a script in python to keep 2 sensors from being detected at same time?如何在 python 中暂停脚本以防止同时检测到 2 个传感器?
【发布时间】:2016-05-06 03:32:25
【问题描述】:

我在一个检测 2 个振动传感器的 python 脚本中有这个函数,问题是传感器非常敏感,所以通常当一个被击中时,它们都会被检测到,这给了我一个错误的读数。我将如何阻止它们同时被检测到?我想检测哪个是第一个。这是我尝试过的-

#!/usr/bin/env python
import RPi.GPIO as GPIO
from time import sleep

def setup():
    GPIO.setmode(GPIO.BOARD)         
    GPIO.setup(KnockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(ShockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def shock():
    print('shock')

def knock():
    print('knock')

def register_callbacks():
    if GPIO.add_event_detect(ShockPin, GPIO.FALLING, callback=shock, bouncetime=5000):
        sleep(5)
    elif GPIO.add_event_detect(KnockPin, GPIO.FALLING, callback=knock, bouncetime=5000):
        sleep(5)

if __name__ == '__main__':
    try:
        setup()
        register_callbacks()

【问题讨论】:

  • 您的 sn-p 看起来不错。你的代码有效吗?如果不是,错误信息或不良行为是什么?
  • 你的代码有效,除了两个传感器会同时检测,我只想检测一个或另一个。
  • 添加一个变量来保存最后一个事件的时间,如果最后一个事件发生在 5 秒之前,则检查敲击/冲击?
  • @Ashafix 嗯,好主意,我会试一试..似乎合乎逻辑,我是 python 新手,所以我将如何检查每个事件检测的时间?

标签: python function events callback detect


【解决方案1】:

只是一个建议,我没有设置来测试它。保存最后一个事件的时间(使用datetime),然后检查最后一个事件是否超过5秒前。

import datetime
sensor_delay = 5 #delay in seconds
last_event = datetime.datetime.now()

def shock():
    global last_event
    if datetime.datetime.now() > last_event + datetime.timedelta(seconds=sensor_delay):
        print ('shock')
        last_event = datetime.datetime.now()

def knock():
    global last_event
    if datetime.datetime.now() > last_event + datetime.timedelta(seconds=sensor_delay):
        print('knock')
        last_event = datetime.datetime.now()

【讨论】:

  • 谢谢@Ashafix,我会试试看的!
  • 再次感谢您的提示,我实现了这一点,但仍然遇到同样的问题。当传感器被敲击或冲击到坚硬时,它会记录两个传感器。它会将传感器延迟 5 秒在开始时检测到,但在 5 秒后,它又回到了我原来的问题,即检测一个是否被敲到硬。我可能需要将它添加到注册回调函数中吗?
  • 那很愚蠢,last_event 应该是全局的,docs.python.org/3/reference/simple_stmts.html#global
  • 感谢您的更新,但仍然有同样的问题,两者都在注册..没有任何意义
  • 对不起@Ashafix 我是一个哑巴$$,我忘了在最后添加 last_event = datetime.datetime.now() .. 现在它可以工作了,非常感谢!
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多