树莓Pi,Python处理Pi上的多个传感器

2024-09-28 01:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个个人项目使用树莓派和两个电容话筒。我在每个麦克风上使用以下听众:

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)

当检测到声音时(我在麦克风上使用数字触发器),事件会将pin号发送到回调。我使用pin号码来运行一个函数。当该函数正在运行时,大约10秒,我希望这两个事件完全停止触发,直到函数返回控制权。目前,侦听器不断地发送事件,这些事件似乎堆积在函数的上方,然后在函数完成后全部串行运行。在

我尝试过使用带有时间戳的全局变量和其他各种方法来停止事件侦听器,但没有成功。如果我试图关闭侦听器并重新打开它们,就会出现分段错误。如果你能帮上忙,我很感激

干杯

威特纳


Tags: 项目函数eventaddgpiocallbackpin事件
1条回答
网友
1楼 · 发布于 2024-09-28 01:28:45

docs on SOURCEFORGE(就在这一部分的上方:Switch Debounce):

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

为了避免这种行为,我会将回调包装在一个函数中,该函数创建一个新线程来处理每个事件,从而让回调本身立即返回。然后我将使用^{},这样在第一个事件求值期间触发的任何事件都会立即抛出,而不是尝试解除绑定并重新绑定回调。在

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函数,而无需创建闭包(函数在函数中定义)。在

^{pr2}$

相关问题 更多 >

    热门问题