从Python的for循环中删除time.sleep()?

时间:2019-05-25 02:52:19

标签: python for-loop sleep nonblocking led

我有一些函数可以驱动带嵌套for循环的RGB LED,但是代码示例使用time.sleep(),这阻止了我其余代码的运行。我想从for循环中删除睡眠时间,但不知道该怎么做。

我使此计时器功能起作用,但是它不起作用。

currentTime = int(round(time.time() * 1000))
blinkWait = int(round(time.time() * 1000))

def CheckTime( lastTime,  wait):
  if currentTime - lastTime >= wait:
    lastTime += wait
    return True
  return False

def rainbowCycle(strip, wait_ms=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""  
    for j in range(256*iterations):

        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))

    if CheckTime(blinkWait,50):
       blinkWait = int(round(time.time() * 1000))
       strip.show()

我试图实现一个获取当前时间的计时器,然后检查经过的时间,但无法将其集成到for循环中。

这些是带有要删除的time.sleep()的原始示例LED模式代码功能。

def rainbowCycle(strip, wait_ms=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""  
    for j in range(256*iterations):

        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
        strip.show()
        time.sleep(wait_ms/1000.0)

def theaterChaseRainbow(strip, wait_ms=50):
    """Rainbow movie theater light style chaser animation."""
    for j in range(256):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, wheel((i+j) % 255))
            strip.show()
            time.sleep(wait_ms/1000.0)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)

谢谢。

更新

我试图将计时器包装在函数调用周围,但这也不起作用。必须有一种方法可以使for循环中的两次迭代之间具有无阻塞延迟,但是我很茫然。

                rainbowCycle(strip)
                blinkWait = int(round(time.time() * 1000))

更新#2

curr_thread = threading.Thread(target=theaterChaseRainbow, args=(strip))
            curr_thread.daemon = False
            curr_thread.start()

但是我收到此错误“ *后的TypeError:TheaterChaseRainbow()参数必须是可迭代的,而不是Adafruit_NeoPixel”

我也尝试将带状arg直接放在函数中。这样可以消除错误,但是什么也没发生。

def theaterChaseRainbow(strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)):

更新#3

在@Aprillion的建议下,我重新考虑了可能重复的帖子。我尽力将这些建议集成到我的代码中。我添加了如下线程

def theaterChaseRainbow(strip):
    """Rainbow movie theater light style chaser animation."""
    for j in range(256):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, wheel((i+j) % 255))
            strip.show()
            #time.sleep(.05)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)

def myTimer(seconds):
                time.sleep(seconds)
                theaterChaseRainbow(strip)

然后在主循环中调用:

myThread = threading.Thread(target=myTimer, args=(.05,))
            myThread.start()

这几乎可行。它显示,并使LED闪烁,但更加不稳定且不平滑。我认为这是因为time.sleep位于嵌套的for循环中,而不是整个函数中。我该如何使循环的第二部分进入睡眠状态?我在功能代码中留下了原始的time.sleep(.05)作为注释。

0 个答案:

没有答案