2013-04-22 14 views
19

Raspberry Pi cihazımdaki GPIO pinlerini hareket algılamak için bir PIR sensörü ile kullanıyorum. Sensör hareket algıladığında, yazılımı diğer işlevlere taşımak istiyorum.Python'da Raspberry Pi-GPIO Olayları

Şu anda, hareketi algılamak için, programımın hareket algılamayı beklerken sürekli bir döngü içinde çalışmasına izin veriyorum. Bu, şu anda çalışıyor olsa da, gelecekte kullanım için bu inanılmaz derecede verimsiz olacak ve bunu bir olaya atayarak geliştirmeyi ümit ediyorum.

GPIO girişimi, döngü tarafından manüel olarak çalıştırılmadan program tarafından algılanan bir olaya bağlama yolu var mı?

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) 

sayacı ve sensör alır yanlış pozitif sayısını azaltmak için kullanılan hareket birden çok kez tespit:

İşte akım algılama hareketi için bir döngü.

cevap

1

GPIO kodunu kendi iş parçacığına sarabilir ve programın geri kalanı GPIO giriş için beklerken başka bir şey yapabilir. ana programda

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) 

Ve sonra bunları

input_thread = threading.Thread(target = wait_input) 
input_thread.start() 
# do something in the meanwhile 
input_thread.join() 

gibi bir şey SO üzerinde sorular Var bolluk olabilir ben bir fonksiyonu haline kodunuzu sarmak threading module

İlk göz atın python iş parçacığı ile ilgili olarak, onları kazmak isteyebilirsiniz. Lütfen, özellikle bir işlemin tek seferde çalışmasına izin veren küresel bir yorumlayıcı kilidine (GIL) sahip olan python'da, iş parçacığı kullanırken dikkat edilmesi gereken pek çok şey olduğunu unutmayın. Ayrıca, GIL'in etrafından dolaşabileceği multiprocessing module'u da kontrol etmek akıllıca olabilir.

+1

Bu yöntem bir GUI ile çalışır mı? Ne yapmak istediğim, bu döngünün GUI'm içinde çalıştığı hareket detektörü sınıfını çağırmaktır, ancak döngüde GUI'yi çöker. Bunu iş parçacığı ile kullanırsam, GUI arka planda çalışmasına sebep olurken, GUI onunla ilişkili girdiyi dinler mi? – Stefoth

+1

@Stefoth, bu GUI programlamanın nasıl çalıştığı oldukça fazladır. GUI'niz kendi iş parçacığı içinde çalışır ve hareket algılama kodu kendi başına çalışır. – msvalkon

26

RPi.GPIO Python kütüphanesi okumak isteyebilirsiniz şimdi Interrupts and Edge detection paragrafta açıklanmıştır Olaylar destekler.

Yani kitaplığın son sürümü almak için sudo rpi-update ile Ahududu Pi güncellemeden sonra, kodunuzu için değiştirebilirsiniz: Ben senin programını başka şeyler yapar varsayalım çünkü

from time import sleep 
import RPi.GPIO as GPIO 

var=1 
counter = 0 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

def my_callback(channel): 
    if var == 1: 
     sleep(1.5) # confirm the movement by waiting 1.5 sec 
     if GPIO.input(7): # and check again the input 
      print("Movement!") 
      captureImage() 

      # stop detection for 20 sec 
      GPIO.remove_event_detect(7) 
      sleep(20) 
      GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300) 

GPIO.add_event_detect(7, GPIO.RISING, callback=my_callback, bouncetime=300) 

# you can continue doing other stuff here 
while True: 
    pass 

Ben Threaded callbacks yöntemi seçti Paralel olarak var değerini değiştirin.