2016-09-12 2 views
1

Ich möchte ändern in gpio Eingabe von Raspberry Pi und Set-Handler mit Signal-Modul von Python. Ich bin neu in Signalmodul und ich kann nicht verstehen, wie man es benutzt. Ich verwende diesen Code jetzt:Set-Handler für GPIO-Statuswechsel mit Python-Signal-Modul

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() 
+1

Warum verklagt nicht GPIO-Modul https://pypi.python.org/pypi/RPi.GPIO –

+0

Ich benutze GPIO-Modul, aber ich ruft die Handler-Funktion zweimal in einem einzigen Interrupt..ich denke Signalmodul funktioniert besser ... deshalb denke ich daran, es zu benutzen ... –

Antwort

0

ich gerade geändertener Code in einer anderen Art und Weise hart Sie sind frei gleiche zu implementieren SIGNAL module.You mit neuem Thread beginnen und abzufragen oder registrieren, ihre Veranstaltung zurückrufen, unter Verwendung von folgenden Code und schreiben Sie, was auch immer Ihre funktionale Logik in der Methode run().

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() 

Der obige Code wird iteriert, bis PIN-Eingabe hoch wird, so dass, sobald die Bedingung in PIN während Schleife innerhalb Run-Methode Pausen und Bild hoch geht erfasst wird.

Also, um oben Thread zu tun dies tun.

gpio_thread = GPIOThread() 
gpio_thread.start() 

dies wird der Faden Konstruktor init nennen und wird die Variable innerhalb Konstruktor wenn überhaupt, und führen die Run-Methode initialisieren.

Sie können auch die join() -Methode aufrufen, um zu warten, bis der Thread seine Ausführung beendet hat.

gpio_thread.join() 

Das funktioniert immer für mich, also Prost !!