繁体   English   中英

Raspberry Pi,Python-处理pi上的多个传感器

[英]Raspberry Pi, Python - Dealing with multiple sensors on the pi

我有一个使用Raspberry Pi和两个电容麦克风的个人项目。 我在每个麦克风上使用以下侦听器:

GPIO.add_event_detect(mic1, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic1, soundHeard)

GPIO.add_event_detect(mic2, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic2, soundHeard)

当检测到声音时(我在麦克风上使用数字触发器),该事件会将引脚号发送给回调。 我使用引脚号来运行功能。 在该函数运行大约10秒钟时,我希望两个事件都完全停止触发,直到该函数移交控制为止。 当前,侦听器继续发送事件,这些事件似乎在函数上方堆叠,然后在函数完成后全部依次运行。

我尝试将全局变量与时间戳和其他各种方法结合使用以阻止事件侦听器无济于事。 如果我尝试关闭侦听器并将其重新打开,则会出现细分错误错误。 对此有任何帮助,

干杯,

维特纳

SOURCE FORGE文档中 (恰好在该部分上方: Switch Debounce ):

“请注意,在这种情况下,回调函数是按顺序而不是同时运行的。这是因为只有一个线程用于回调,每个线程都按照定义的顺序运行。”

我会通过将回调包装在一个函数中来回避此行为,该函数创建一个新线程来处理每个事件,从而让回调本身立即返回。 然后,我将使用threading.Lock以便在第一个事件的评估期间触发的所有事件都被立即抛出,而不是尝试取消绑定并重新绑定回调。

from threading import Thread, Lock

def callback_dispatcher(fun):
    def wrapped(*args):
        t = Thread(target=fun, args=args)
        t.start()
    return wrapped

#lock is defined in main thread so all child threads will have a copy of the same object
soundHeard_lock = Lock()

def soundHeard(channel):
    if soundHeard_lock.acquire(False): #False so Lock.acquire() is non-blocking 
                                       # otherwise calling lock.acquire will wait until the 
                                       # lock is freed by whatever thread currently owns it
        #if the lock is successfully acquired (no other thread has ownership currently
        try:
            #handle event
        finally: #we want to release the lock even if something else goes wrong
            soundHeard_lock.release()
    #else: #do nothing, we didn't get ownership of the lock

GPIO.add_event_detect(mic1, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic1, callback_dispatcher(soundHeard))

GPIO.add_event_detect(mic2, GPIO.BOTH, bouncetime=500)
GPIO.add_event_callback(mic2, callback_dispatcher(soundHeard))

**为清楚起见编辑

我使callback_dispatcher函数比您的情况要复杂一些,以使其更通用。 一个更简单的版本可以直接使用线程调用soundHeard函数,而无需创建闭包(在函数内定义的函数)。

def soundHeard_thread(*args) #replaces callback_dispatcher
    # *args uses tuple packing to pass along any args provided by the event
    #   this is a very powerful tool that you should definitely learn to leverage
    #   if you want to take your python to the next level. A quick google search
    #   gave me this tutorial: https://www.geeksforgeeks.org/packing-and-unpacking-arguments-in-python/
    t = Thread(target=soundHeard, args=args) 
    t.start()

#...

GPIO.add_event_callback(mic1, soundHeard_thread)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM