我使用我树莓裨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.GPIO Python库现在支持活动 ,这是在解释中断和边缘检测段落。
因此,与更新您的树莓派后sudo rpi-update
,以获取最新版本的库,你可以改变你的代码:
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
我选择了螺纹回调方法,因为我想,你的程序做一些其他的事情在平行于改变的值var
。
现在RPI GPIO库已内置中断驱动的GPIO控制,可以在单独的线程释放资源发生。 您不妨仔细阅读以下http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-3
你可以换的GPIO代码到它自己的线程,并让你的程序的其他部分做其他的事情,而GPIO等待输入。 退房的线程模块
首先,我想换你的代码放到一个函数
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()
有很多的SO关于蟒蛇线程的问题,所以你可能要挖起来。 请注意,也有很多东西使用线程的时候,要考虑尤其是蟒蛇具有全局解释器锁(GIL)只允许一个进程同时运行。 这也可能是聪明检查出的多模块与各地GIL哪一个可以路线。
kapcom01给出了一些伟大的想法,但它是更好地使不作出了很多的一个中断指令。
通常你把一个标志为1时,回调调用,您做出处理的主要功能。 在采取这些方式没有freesing的PROGRAMM的风险。
有些事情是这样的:
from time import sleep
import RPi.GPIO as GPIO
def init():
# make all your initialization here
flag_callback = False
# add an interrupt on pin number 7 on rising edge
GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300)
def my_callback():
# callback = function which call when a signal rising edge on pin 7
flag_callback = True
def process_callback():
# TODO: make process here
print('something')
if __name__ == '__main__':
# your main function here
# 1- first call init function
init()
# 2- looping infinitely
while True:
#3- test if a callback happen
if flag_callback is True:
#4- call a particular function
process_callback()
#5- reset flagfor next interrupt
flag_callback = False
pass