使用 python 信号模块设置 GPIO 状态更改的处理程序

Set handler for GPIO state change using python signal module

我想检测 raspberry pi 的 gpio 输入的变化,并使用 python 的信号模块设置处理程序。我是信号模块的新手,我不明白如何使用它。我现在正在使用此代码:

import RPi.GPIO as GPIO
import time
from datetime import datetime
import picamera
i=0
j=0
camera= picamera.PiCamera()

camera.resolution = (640, 480)

# handle the button event
def buttonEventHandler (pin):
    global j
    j+=1
    #camera.close()
    print "handling button event"
    print("pressed",str(datetime.now()))
    time.sleep(4)
    camera.capture( 'clicked%02d.jpg' %j )
    #camera.close()

def main():

      GPIO.setmode(GPIO.BCM)
      GPIO.setwarnings(False)
      GPIO.setup(2,GPIO.IN,pull_up_down=GPIO.PUD_UP)    
      GPIO.add_event_detect(2,GPIO.FALLING)

      GPIO.add_event_callback(2,buttonEventHandler) 
     # RPIO.add_interrupt_callback(2,buttonEventHandler,falling,RPIO.PUD_UP,False,None)

      while True:
          global i
          print "Hello world! {0}".format(i)
          i=i+1
          time.sleep(5)

  #  if(GPIO.input(2)==GPIO.LOW):

     # GPIO.cleanup()

if __name__=="__main__":
    main()

我只是以不同的方式更改了代码,您可以使用 SIGNAL 自由地实现相同的代码 module.You 可以启动新线程并轮询或注册回调事件,方法是使用以下代码并编写您的功能逻辑在它的 运行() 方法中。

import threading
import RPi.GPIO as GPIO
import time
import time
from datetime import datetime
import picamera
i=0
j=0
camera= picamera.PiCamera()

camera.resolution = (640, 480)
PIN = 2

class GPIOThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)              

    def run(self):
        while True:
            if GPIO.input(PIN) == False: # adjust this statement as per your pin status i.e HIGH/LOW
                global j
                j+=1
                #camera.close()
                print "handling button event"
                print("pressed",str(datetime.now()))
                time.sleep(4)
                camera.capture( 'clicked%02d.jpg' %j )

def main():

      GPIO.setmode(GPIO.BCM)
      GPIO.setwarnings(False)
      GPIO.setup(PIN,GPIO.IN,pull_up_down=GPIO.PUD_UP)    
      GPIO.add_event_detect(PIN,GPIO.FALLING)

      gpio_thread = GPIOThread()
      gpio_thread.start() 

      while True:
          global i
          print "Hello world! {0}".format(i)
          i=i+1
          time.sleep(5)


if __name__=="__main__":
    main()

上面的代码将迭代直到 PIN 输入变高,所以一旦 PIN 变高,运行 方法内 while 循环的条件就会中断并捕获图片。

因此,为了调用上面的线程,请执行此操作。

gpio_thread = GPIOThread()
gpio_thread.start() 

这将调用线程构造函数 init 并初始化构造函数中的变量(如果有),然后执行 运行 方法。

您也可以调用 join() 方法,等待线程完成执行。

gpio_thread.join()  

这对我来说总是有效的,干杯!!