树莓丕GPIO活动在Python(Raspberry Pi- GPIO Events in Pyth

2019-08-31 17:47发布

我使用我树莓裨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)

计数器和检测运动多次被用来减少该传感器拾取的假阳性的数目。

Answer 1:

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



Answer 2:

现在RPI GPIO库已内置中断驱动的GPIO控制,可以在单独的线程释放资源发生。 您不妨仔细阅读以下http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-3



Answer 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哪一个可以路线。



Answer 4:

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


文章来源: Raspberry Pi- GPIO Events in Python