2016-09-12 10 views
1

Я хочу обнаружить изменение в gpio ввода малины pi и установить обработчик с помощью сигнального модуля python. Я новичок в сигнальном модуле, и я не могу понять, как его использовать. Я использую этот код прямо сейчас:Установить обработчик для изменения состояния GPIO с помощью модуля сигналов питона

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

Почему вы не подаете в суд на модуль GPIO https://pypi.python.org/pypi/RPi.GPIO –

+0

Я использую модуль GPIO, но я вызываю функцию обработчика два раза за один прерыватель. лучше .. вот почему я думаю об использовании этого ... –

ответ

0

Я просто изменил код иным образом жестко вы можете реализовать то же самое с помощью SIGNAL module.You можете начать новую тему и опрашивать или зарегистрироваться перезвонит событие их, используя следующие код и написать всю свою функциональную логику в методе 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() 

Приведенный выше код будет перебирать до ввода PIN-кода не переходит на высокий уровень, поэтому, когда PIN идет высоко состояние в то время как цикл внутри метода запуска перерывов и изображения захватывается.

Итак, для того, чтобы вызвать верхнюю нить, сделайте это.

gpio_thread = GPIOThread() 
gpio_thread.start() 

это будет вызывать конструктор НИТЬ инициализации и инициализировать переменную внутри конструктора, если таковые имеются, и выполнить метод выполнения.

Вы также можете вызвать метод join(), чтобы подождать, пока поток завершит его выполнение.

gpio_thread.join() 

Это всегда работает для меня, поэтому Cheers !!

 Смежные вопросы

  • Нет связанных вопросов^_^