Python中的覆盆子Pi-GPIO事件

2024-07-04 14:38:36 发布

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

我用我的树莓皮上的GPIO管脚和一个PIR传感器来检测运动。当传感器检测到运动时,我想将软件移到其他功能上。

目前,为了检测运动,我让我的程序在等待检测运动的同时不断循环运行。虽然这在目前是有效的,但对于将来的使用,这将是非常低效的,我希望通过将它分配给一个事件来改进它。

有没有任何方法可以将我的GPIO输入绑定到程序检测到的事件,而无需手动运行循环。

这是我当前的检测运动回路:

var = 1
counter = 0
while var == 1:
    if GPIO.input(7):
        counter += 1
        time.sleep(0.5)
    else:
        counter = 0
        time.sleep(1)

    if counter >= 3:
        print "Movement!"
        captureImage()
        time.sleep(20)

计数器和多次检测运动用于减少传感器接收到的误报数。


Tags: 方法程序功能gpioif软件timevar
3条回答

RPi.GPIOPython库现在支持Events,这在Interrupts and Edge detection段中有解释。

因此,使用sudo rpi-update更新覆盆子Pi以获取库的最新版本后,可以将代码更改为:

from time import sleep
import RPi.GPIO as GPIO

var=1
counter = 0

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def my_callback(channel):
    if var == 1:
        sleep(1.5)  # confirm the movement by waiting 1.5 sec 
        if GPIO.input(7): # and check again the input
            print("Movement!")
            captureImage()

            # stop detection for 20 sec
            GPIO.remove_event_detect(7)
            sleep(20)
            GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300)

GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300)

# you can continue doing other stuff here
while True:
    pass

我之所以选择Threaded callbacks方法,是因为我认为您的程序会并行执行一些其他操作来更改var的值。

您可以将GPIO代码包装到它自己的线程中,让程序的其余部分在GPIO等待输入时执行其他操作。查看threading module

首先我会把你的代码包装成一个函数

def wait_input():
    var=1
    counter = 0
    while var == 1:
        if GPIO.input(7):
            counter += 1
        time.sleep(0.5)
        else:
            counter = 0
            time.sleep(1)
        if counter >= 3:
            print "Movement!"
            captureImage()
            time.sleep(20)

然后在你的主程序中你可以这样做

input_thread = threading.Thread(target = wait_input)
input_thread.start()
# do something in the meanwhile
input_thread.join()

关于python线程有很多问题,所以您可能需要深入了解它们。请注意,在使用线程时还需要考虑很多事情,特别是在python中,它有一个全局解释器锁(GIL),一次只允许运行一个进程。查看可以绕GIL路由的multiprocessing module也可能是明智之举。

现在RPi GPIO库有内置的中断驱动GPIO控件,可以在单独的线程中释放资源。 您可能希望阅读以下http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-3

相关问题 更多 >

    热门问题