2017-12-05 3 views
0

Der folgende Code ist für einen PIR-Sensor in Python geschrieben.Python if Schleife time.sleep nur einmal ausführen

Was sollte es

tun Wenn der Sensor zum ersten Mal aktivieren war, sollte es einmal für 10 Sekunden warten und dann Druck halten "Intruder erkannt", bis der Sensor = war 0.

was ist eigentlich tun

Anstatt warten 10s einmal, der Code unten warten immer 10s, wenn der Pir-Sensor Tigger war.

Warum ist das?

import RPi.GPIO as GPIO 
import time 
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(11, GPIO.IN)   #Read output from PIR motion sensor 
GPIO.setup(3, GPIO.OUT)   #LED output pin 
while True: 
     i=GPIO.input(11) 
     if i==0:     #When output from motion sensor is LOW 
      print "No intruders",i 
      GPIO.output(3, 0) #Turn OFF LED 
      time.sleep(0.1) 
     elif i==1:    #When output from motion sensor is HIGH 
      time.sleep(10)  #This should be only run once when the pir sensor is trigger 
      print "Intruder detected",i 
      GPIO.output(3, 1) #Turn ON LED 
      time.sleep(0.1) 
+0

Sind Sie sicher, dass 'GPIO.input (11)' auf Null zurückgeht? Vielleicht mache ich einen 'print i' vor dem' if' um das zu überprüfen. –

+1

Frage ist einfach oder sogar albern, aber das Format der Frage ist gut. Es zeigt deutlich das erwartete Verhalten und der aktuelle Verhalten mit einem Code-Snippet. Ich denke nicht, dass es abgelehnt werden sollte. – Sraw

Antwort

1

einfach merken, wenn es triggererd war:

import RPi.GPIO as GPIO 
import time 
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(11, GPIO.IN)   # Read output from PIR motion sensor 
GPIO.setup(3, GPIO.OUT)   # LED output pin 
wasTriggered = False   # not yet triggered 
while True: 
     i=GPIO.input(11) 
     if i == 0:       # When output from motion sensor is LOW 
      print "No intruders",i 
      wasTriggered = False   # reset trigger if True else does nothing 
      GPIO.output(3, 0)    # Turn OFF LED 
      time.sleep(0.1) 
     elif i == 1:      # When output from motion sensor is HIGH 
      if wasTriggered == False:  # already triggered ? 
       time.sleep(10)   # only run once when the pir sensor is trigger 
       print "Intruder detected",i 
       GPIO.output(3, 1)   # Turn ON LED 
       wasTriggered = True  # set was triggered 
      time.sleep(0.1) 

ein „Gedächtnis“ Dies schafft - es wird nur einmal zurückgesetzt der Sensor ein, berichtet 0 an Pin 11. Sie könnten wechseln wollen die " Led wird rot + Ausgangstext "und der Schlaf um es" flinker "zu machen - was bedeutet, dass es sofort auf den Sensorwechsel reagiert und dann für 10 Sekunden pausiert, anstatt für 10 Sekunden zu pausieren und dann den Licht & Drucktext zu schalten, der die Verbindung trennen würde "Act" -> "React" Sequenz.

+0

Ich versuche eine Verzögerung von 10 Sekunden vor dem Alarm auszulösen. Also Switch LED + Ausgangstext und Sleep around funktioniert nicht. – butbut

+0

@butbut Wenn Sie einen Usecase dafür haben - ok, von einer "Guard watches for Trespasser" -Perspektive scheint es eine schlechte Idee zu sein;) - Ich habe die Dinge nicht umgestellt, also sollte die Antwort so funktionieren, wie Sie es wollten –

Verwandte Themen