2013-04-22 3 views
19

में रास्पबेरी पीआई-जीपीआईओ घटनाक्रम मैं गति का पता लगाने के लिए एक पीआईआर सेंसर के साथ अपने रास्पबेरी पीआई पर जीपीआईओ पिन का उपयोग कर रहा हूं। जब सेंसर गति का पता लगाता है तो मैं सॉफ़्टवेयर को अन्य कार्यों पर ले जाना चाहता हूं।पाइथन

फिलहाल, गति का पता लगाने के लिए मेरे पास लगातार एक लूप में चल रहा है, जबकि यह गति का पता लगाने की प्रतीक्षा कर रहा है। हालांकि इस समय यह काम करता है, भविष्य में उपयोग के लिए यह अविश्वसनीय रूप से अक्षम होगा और इसे किसी ईवेंट में निर्दिष्ट करके इस पर सुधार करने की उम्मीद है।

क्या मेरे जीपीआईओ इनपुट को किसी ईवेंट में मैन्युअल रूप से लूप चलाने के बिना प्रोग्राम द्वारा पता लगाया गया कोई भी तरीका है।

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) 

काउंटर और गति का पता लगाने के लिए कई बार झूठे सकारात्मक की संख्या को कम करने के लिए है कि सेंसर ऊपर उठाता है प्रयोग किया जाता है:

यहाँ का पता लगाने के लिए प्रस्ताव मेरे वर्तमान पाश है।

उत्तर

1

आप जीपीआईओ-कोड को अपने स्वयं के धागे में लपेट सकते हैं और आपका बाकी प्रोग्राम कुछ और कर सकता है जबकि जीपीआईओ इनपुट के लिए इंतजार कर रहा है। threading module

पहले की जाँच करें मैं एक समारोह में अपने कोड लपेट था

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) 

और फिर अपने मुख्य कार्यक्रम में आप सकता है इस

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

की तरह कुछ के प्रश्न के बहुत सारे इतने पर कर रहे हैं पायथन थ्रेडिंग के विषय में, तो आप उन्हें खोदना चाहते हैं। कृपया ध्यान दें कि थ्रेड का उपयोग करते समय विचार करने के लिए बहुत सी चीजें हैं, खासकर अजगर में जिसमें ग्लोबल दुभाषिया लॉक (जीआईएल) है जो एक समय में केवल एक प्रक्रिया को चलाने की अनुमति देता है। multiprocessing module को जांचना भी स्मार्ट हो सकता है जिसके साथ कोई भी जीआईएल के चारों ओर मार्ग बना सकता है।

+1

क्या यह विधि एक जीयूआई कहने के साथ काम करेगी? मैं जो करना चाहता हूं वह मोशन डिटेक्टर क्लास को कॉल करता है कि यह लूप मेरे जीयूआई से चल रहा है, लेकिन लूप के साथ यह सिर्फ जीयूआई को दुर्घटनाग्रस्त कर देता है। यदि मैं इसे थ्रेड के साथ उपयोग करता हूं, तो क्या यह पृष्ठभूमि में गति पहचानने के लिए लूप का कारण बनता है जबकि जीयूआई इसके साथ जुड़े इनपुट के लिए सुनता है? – Stefoth

+1

@Stefoth यह बहुत अच्छा है कि जीयूआई प्रोग्रामिंग कैसे काम करता है। आपका जीयूआई अपने स्वयं के थ्रेड में चलाएगा और गति का पता लगाने वाला कोड स्वयं ही चलता है। – msvalkon

26

RPi.GPIO अजगर पुस्तकालय में पढ़ने के लिए चाहते हो सकता है अब घटनाक्रम, जो Interrupts and Edge detection पैराग्राफ में वर्णन किया गया है का समर्थन करता है।

तो पुस्तकालय के नवीनतम संस्करण को प्राप्त करने के लिए sudo rpi-update के साथ अपने रास्पबेरी Pi को अद्यतन करने के बाद, आप अपने कोड को बदल सकते हैं:

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 

मैं चुना Threaded callbacks विधि क्योंकि मुझे लगता है कि अपने कार्यक्रम कुछ अन्य काम करता है var के मान को बदलने के समानांतर में।