Set handler for GPIO state change using python signal module
<p>I want to detect change in  <code>gpio</code> input of raspberry pi and set handler using signal module of python. I am new to signal module and I can't understand how to use it. I am using this code now:</p>

<pre><code>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()
</code></pre>

<p>I just changed code in a different manner tough you are free to implement same using SIGNAL module.You can start new thread and poll or register call back event their, by using following code and write whatever your functional logic in it's run() method.</p>

<pre><code>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()
</code></pre>

<p>The above code will iterate until PIN input goes high, so once PIN goes high the condition in while loop inside run method breaks and picture is captured.</p>

<p>So, in order to call above thread do this.</p>

<pre><code>gpio_thread = GPIOThread()
gpio_thread.start() 
</code></pre>

<p>this will call the thread constructor <strong>init</strong> and will initialize the variable inside constructor if any, and execute the run method.</p>

<p>You can also call join() method , to wait until thread completes it's execution.</p>

<pre><code>gpio_thread.join()  
</code></pre>

<p>This always works for me, so Cheers!!</p>

python raspberry-pi interrupt gpio django-signals