2016-05-25 3 views
0

У меня есть часть кода, которая делает именно то, что мне нужно, за исключением одной вещи, таймаута.Тайм-аут while Loop If No Input

В принципе, этот код регистрирует запись каждые 0,5 с в течение 3 секунд, а затем печатает «Готово» и затем перезапускается. Звук, который я пытаюсь записать, является постоянным в течение примерно 3,1 с, так что это идеально. Каждый раз, когда звук присутствует, он печатает «Готово».

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") 

Так что теперь, я хочу код, чтобы перезагрузить, если сказать, что обнаруживает звук и регистрирует его, но ничего не происходит в течение 1 или 2 секунд.

Так что, если список доходит до 3 или 4 единиц в длину, но тогда ничего не происходит на секунду или два, он должен вернуться к тому, чтобы быть единым целым.

Надеюсь, это имеет смысл. И я надеюсь, что вы все можете мне помочь.

Большое спасибо!

ответ

0

Вы хотите, чтобы длинный звук был одним сигналом. Вы не хотите, чтобы звук не был сигналом, а короткий звук не был сигналом.

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 

Вам здесь не нужен список. Число в sound_present_for_samples - это номер «Entry», который вы имели бы в обычном списке. Вы можете построить его в любое время. ["Entry"]*sound_present_for_samples с ["Старт"] добавлен в начало.

Если вам нужны реальные данные в списке вместо строки, вы также можете заменить sound_present_for_samples на список, а каждый + = 1 на .append и = 0 с = [] и условия с len (spfs).

+0

Спасибо @Chad Миллер. - Кажется, он работает только для печати «Не сделано» - я не могу заставить его печатать «Готово». Когда я впервые запускал код, он сказал мне, что «порог» не определен. Поэтому мне пришлось изменить «logging_threshold» на «порог», чтобы он работал. Есть ли у вас какие-либо предложения? Есть ли модуль, который я не импортирую? – LukeVenter

+0

@ LukeVenter, это просто, что ваша логика ошибочна. Пройдите через это вручную. Не запускайте его. Убедитесь, что вы понимаете, с ручкой и бумагой, что происходит. Нарисуйте поле с именами переменных. Используйте монету или кости, чтобы решить, что возвращает GPIO.input (pin). Напишите историю, убедитесь, что она делает то, что вы ожидаете. –