我正在使用我的树莓Pi上的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)
计数器和多次检测运动用于减少传感器拾取的假阳性数。
发布于 2013-06-04 21:59:28
现在RPi GPIO库内置了中断驱动的GPIO控制,这可以在单独的线程中发生,从而释放资源。您可能希望阅读以下http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-3
发布于 2013-04-22 17:44:55
您可以将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也可能是聪明的做法。
发布于 2018-10-03 16:15:23
kapcom01给出了一些很好的想法,但最好不要在中断中做太多的指令。
通常,当回调为call时,您会将一个标志设为1,并在main函数中进行处理。在这种方式下,不存在释放程序员的风险。
像这样的东西:
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
https://stackoverflow.com/questions/16143842
复制相似问题