首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Raspberry Pi- Python中的GPIO事件

Raspberry Pi- Python中的GPIO事件
EN

Stack Overflow用户
提问于 2013-04-22 17:37:32
回答 3查看 50.5K关注 0票数 22

我正在使用我的树莓Pi上的GPIO引脚与PIR传感器来检测运动。当传感器检测到运动时,我想将软件移到其他功能上。

目前,为了检测运动,我让我的程序在等待运动被检测的同时不断地循环运行。虽然这在目前是有效的,但对于未来的使用,这将是令人难以置信的低效,我希望通过将其分配给一个事件来改进这一点。

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

这是我当前检测运动的循环:

代码语言:javascript
复制
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)

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

EN

回答 3

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2013-04-22 17:44:55

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

首先,我会将您的代码封装到一个函数中

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
input_thread = threading.Thread(target = wait_input)
input_thread.start()
# do something in the meanwhile
input_thread.join()

关于python线程有很多问题,所以你可能想把它们找出来。请注意,在使用线程时也有很多事情需要考虑,特别是在python中,它有一个全局解释器锁(GIL),一次只允许一个进程运行。查看可以绕过GIL路由的multiprocessing module也可能是聪明的做法。

票数 1
EN

Stack Overflow用户

发布于 2018-10-03 16:15:23

kapcom01给出了一些很好的想法,但最好不要在中断中做太多的指令。

通常,当回调为call时,您会将一个标志设为1,并在main函数中进行处理。在这种方式下,不存在释放程序员的风险。

像这样的东西:

代码语言:javascript
复制
     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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16143842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档