我用我的树莓皮上的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)
计数器和多次检测运动用于减少传感器接收到的误报数。
RPi.GPIOPython库现在支持Events,这在Interrupts and Edge detection段中有解释。
因此,使用
sudo rpi-update
更新覆盆子Pi以获取库的最新版本后,可以将代码更改为:我之所以选择Threaded callbacks方法,是因为我认为您的程序会并行执行一些其他操作来更改
var
的值。您可以将GPIO代码包装到它自己的线程中,让程序的其余部分在GPIO等待输入时执行其他操作。查看threading module
首先我会把你的代码包装成一个函数
然后在你的主程序中你可以这样做
关于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
相关问题 更多 >
编程相关推荐