У меня есть некоторые функции, которые управляют светодиодами RGB с вложенными циклами for, но примеры кода используют 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 (), который я хочуудалить.
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))
Update # 2
curr_thread = threading.Thread(target=theaterChaseRainbow, args=(strip))
curr_thread.daemon = False
curr_thread.start()
но я получаю эту ошибку "Аргумент TypeError: theatreChaseRainbow () после * должен быть итеративным, а не Adafruit_NeoPixel"
Я также пытался поместить аргумент strip прямо в функцию.Это устраняет ошибку, но затем ничего не происходит.
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()
Это почти работает.Он отображает и мигает светодиодами, но он гораздо более неустойчивый и не плавный.Я думаю, это потому, что time.sleep
находится во вложенном цикле for, а не для всей функции.Как мне сделать только вторую часть цикла сна?Я оставил оригинал time.sleep(.05)
в качестве комментария в коде функции.