Switch to async

This commit is contained in:
jimmy 2023-12-23 09:03:16 +00:00
parent 5821d81cf4
commit f8515bddde
1 changed files with 110 additions and 96 deletions

View File

@ -3,8 +3,8 @@
import array, time import array, time
from machine import Pin from machine import Pin
import rp2 import rp2
from random import randint
from time import sleep from time import sleep
import uasyncio as asyncio
# Configure the number of WS2812 LEDs. # Configure the number of WS2812 LEDs.
NUM_LEDS = 256 NUM_LEDS = 256
@ -26,9 +26,9 @@ def ws2812():
wrap() wrap()
class WS2812B: class WS2812B:
def __init__(self, num_leds, pin_num, brightness): def __init__(self, num_leds, pin_num, brightness, sm):
# Create the StateMachine with the ws2812 program, outputting on pin # Create the StateMachine with the ws2812 program, outputting on pin
self.sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(pin_num)) self.sm = rp2.StateMachine(sm, ws2812, freq=8_000_000, sideset_base=Pin(pin_num))
# Start the StateMachine, it will wait for data on its FIFO. # Start the StateMachine, it will wait for data on its FIFO.
self.sm.active(1) self.sm.active(1)
@ -39,29 +39,23 @@ class WS2812B:
self.brightness = brightness self.brightness = brightness
########################################################################## ##########################################################################
def pixels_show(self): async def pixels_show(self):
dimmer_ar = array.array("I", [0 for _ in range(self.num_leds)]) self.sm.put(self.ar, 8)
for i,c in enumerate(self.ar): await asyncio.sleep(0.00001)
r = int(((c >> 8) & 0xFF) * self.brightness)
g = int(((c >> 16) & 0xFF) * self.brightness)
b = int((c & 0xFF) * self.brightness)
dimmer_ar[i] = (g<<16) + (r<<8) + b
self.sm.put(dimmer_ar, 8)
time.sleep_ms(10)
def pixels_set(self, i, color): def pixels_set(self, i, color):
self.ar[i] = (color[1]<<16) + (color[0]<<8) + color[2] self.ar[i] = (int(color[1]*self.brightness)<<16) + (int(color[0]*self.brightness)<<8) + int(color[2]*self.brightness)
def pixels_fill(self, color): def pixels_fill(self, color):
for i in range(len(self.ar)): for i in range(len(self.ar)):
self.pixels_set(i, color) self.pixels_set(i, color)
def color_chase(self, color, wait): async def color_chase(self, color, wait):
for i in range(self.num_leds): for i in range(self.num_leds):
self.pixels_set(i, color) self.pixels_set(i, color)
time.sleep(wait) await asyncio.sleep(wait)
self.pixels_show() await self.pixels_show()
time.sleep(0.2) await asyncio.sleep(0.2)
def wheel(self, pos): def wheel(self, pos):
# Input a value 0 to 255 to get a color value. # Input a value 0 to 255 to get a color value.
@ -77,13 +71,13 @@ class WS2812B:
return (pos * 3, 0, 255 - pos * 3) return (pos * 3, 0, 255 - pos * 3)
def rainbow_cycle(self, wait): async def rainbow_cycle(self, wait):
for j in range(255): for j in range(255):
for i in range(self.num_leds): for i in range(self.num_leds):
rc_index = (i * 256 // self.num_leds) + j rc_index = (i * 256 // self.num_leds) + j
self.pixels_set(i, self.wheel(rc_index & 255)) self.pixels_set(i, self.wheel(rc_index & 255))
self.pixels_show() await self.pixels_show()
time.sleep(wait) await asyncio.sleep(wait)
BLACK = (0, 0, 0) BLACK = (0, 0, 0)
RED = (255, 0, 0) RED = (255, 0, 0)
@ -94,3 +88,23 @@ class WS2812B:
PURPLE = (180, 0, 255) PURPLE = (180, 0, 255)
WHITE = (255, 255, 255) WHITE = (255, 255, 255)
COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE) COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE)
async def run(pin, sm):
ws = WS2812B(10, pin, 1, sm)
ws.pixels_fill(ws.RED)
while True:
await ws.rainbow_cycle(0)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
asyncio.create_task(run(0,0))
asyncio.create_task(run(17,1))
asyncio.create_task(run(18,2))
loop.run_forever()