2016-05-25 4 views
0

Ich habe ein Stück Code, der genau das tut, was ich brauche, abgesehen von einer Sache, einem Timeout.Timeout While Schleife Wenn kein Eingang

Im Grunde wird dieser Code einen Eintrag alle 0,5 Sekunden für 3 Sekunden protokollieren und dann "Fertig" drucken und dann neu starten. Der Sound, den ich zu protokollieren versuche, ist konstant für etwa 3,1s, also ist das perfekt. Jedes Mal, wenn der Ton vorhanden ist, wird "Fertig" ausgedruckt.

import RPi.GPIO as GPIO 
from time import sleep 

GPIO.setmode(GPIO.BOARD) 
pin = 7 #Defining pin 7 as Input pin 
GPIO.setup(pin, GPIO.IN) 

list = ["Start"] 

while l: 
    if GPIO.input(pin) == GPIO.LOW: #This is the input 
     if len(list) <= 6: 
      list.insert(0, "Entry") #Insert into list at first position 
      sleep(0.5) #If there is a constant sound, this makes sure a new item is interted only every 0,5s. 
      print ("Not Done") 
      print (len(list)) 

     elif len(list) > 6: 
      list = ["Start"] 
      print ("Done") 

So, jetzt möchte ich den Code, wenn neu starten, sagen, dass es einen Ton erkennt und meldet es, aber dann passiert nichts für 1 oder 2 Sekunden.

Also wenn die Liste vielleicht 3 oder 4 Einheiten lang wird, aber dann passiert nichts für eine Sekunde oder zwei, es muss wieder eine Einheit lang werden.

Ich hoffe, das macht Sinn. Und ich hoffe, du kannst mir helfen.

Vielen Dank!

Antwort

0

Sie möchten, dass ein langer Ton ein Signal ist. Sie möchten, dass kein Ton kein Signal ist und ein kurzer Ton kein Signal ist.

sound_present_for_samples = 0 
logging_threshold = 6 # 6 half seconds 
while True: 
    if GPIO.input(pin) == GPIO.LOW: 
     sound_present_for_samples += 1 
     if sound_present_for_samples == threshold: 
      print("Done") 
     elif sound_present_for_samples < threshold: 
      print("Not done") 
     sleep(0.5) 
    else: 
     sound_present_for_samples = 0 

Sie brauchen hier wirklich keine Liste. Die Nummer in sound_present_for_samples ist die Nummer von "Entry", die Sie in einer normalen Liste hätten. Sie können es jederzeit konstruieren. ["Entry"]*sound_present_for_samples mit ["Start"] nach vorne hinzugefügt.

Wenn Sie echte Daten in der Liste anstelle einer Zeichenfolge benötigen, können Sie auch sound_present_for_samples durch eine Liste ersetzen, und alle + = 1 mit .append und = 0 mit = [] und die Bedingungen mit len ​​(spfs).

+0

Dank @Chad Miller. - Es scheint nur zu funktionieren, um "Not Done" zu drucken - ich kann nicht scheinen, es zu drucken "Fertig". Als ich den Code zum ersten Mal ausführte, sagte er mir, dass "Schwelle" nicht definiert war. Also musste ich "logging_threshold" auf "threshold" setzen, damit es funktioniert. Hast du irgendwelche Vorschläge? Gibt es ein Modul, das ich nicht importiere? – LukeVenter

+0

@LukeVenter, es ist nur, dass deine Logik falsch ist. Geh von Hand durch. Führe es nicht aus. Stellen Sie sicher, dass Sie mit Stift und Papier verstehen, was vor sich geht. Zeichnen Sie eine Box mit Variablennamen. Verwenden Sie eine Münze oder einen Würfel, um zu entscheiden, was GPIO.input (Pin) zurückgibt. Schreiben Sie die Geschichte, stellen Sie sicher, dass es tut, was Sie erwarten. –