我有一些函数可以驱动带嵌套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)
作为注释。