如果没有输入,则循环超时

时间:2016-05-25 13:47:30

标签: python python-3.x

我有一段代码可以完全满足我的需要,除非有一件事,超时。

基本上,此代码将每0.5秒记录一次条目3秒钟,然后打印“完成”然后重新启动。我试图记录的声音是恒定的大约3,1s,所以这是完美的。每次声音出现时,都会打印“完成”。

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个单位,但是在一两秒内没有任何反应,则必须恢复为一个单位长。

我希望这是有道理的。我希望你们都能帮助我。

非常感谢!

1 个答案:

答案 0 :(得分: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中的数字是&#34;条目&#34;你会有一个正常的清单。您可以随时构建它。 ["Entry"]*sound_present_for_samples将[&#34;开始&#34;]添加到前面。

如果你需要列表中的实际数据而不是字符串,你也可以用列表替换sound_present_for_samples,每个+ = 1用.append和= 0用= []和条件用len( SPFS)。