Add led patterns
This commit is contained in:
parent
1f39ed4f08
commit
406f483ef0
|
@ -0,0 +1,129 @@
|
||||||
|
from ws2812 import WS2812B
|
||||||
|
import uasyncio as asyncio
|
||||||
|
import time, math
|
||||||
|
|
||||||
|
class LedPatterns(WS2812B):
|
||||||
|
async def color_chase(self, color, wait):
|
||||||
|
for i in range(self.num_leds):
|
||||||
|
self.set(i, color)
|
||||||
|
await asyncio.sleep(wait)
|
||||||
|
self.show()
|
||||||
|
time.sleep(0.2)
|
||||||
|
|
||||||
|
def wheel(self, pos):
|
||||||
|
# Input a value 0 to 255 to get a color value.
|
||||||
|
# The colours are a transition r - g - b - back to r.
|
||||||
|
if pos < 0 or pos > 255:
|
||||||
|
return (0, 0, 0)
|
||||||
|
if pos < 85:
|
||||||
|
return (255 - pos * 3, pos * 3, 0)
|
||||||
|
if pos < 170:
|
||||||
|
pos -= 85
|
||||||
|
return (0, 255 - pos * 3, pos * 3)
|
||||||
|
pos -= 170
|
||||||
|
return (pos * 3, 0, 255 - pos * 3)
|
||||||
|
|
||||||
|
|
||||||
|
async def rainbow_cycle(self, wait):
|
||||||
|
for j in range(255):
|
||||||
|
for i in range(self.num_leds):
|
||||||
|
rc_index = (i * 256 // self.num_leds) + j
|
||||||
|
self.set(i, self.wheel(rc_index & 255))
|
||||||
|
self.show()
|
||||||
|
await asyncio.sleep(wait)
|
||||||
|
|
||||||
|
async def breathing(self, color, duration):
|
||||||
|
steps = 256 # Number of steps for the breathing effect
|
||||||
|
for _ in range(steps):
|
||||||
|
brightness = int(255 * abs(steps / 2 - _) / (steps / 2)) # Calculate brightness
|
||||||
|
self.fill((brightness * color[0] // 255, brightness * color[1] // 255, brightness * color[2] // 255))
|
||||||
|
self.show()
|
||||||
|
await asyncio.sleep(duration / steps)
|
||||||
|
|
||||||
|
async def color_transition(self, start_color, end_color, duration):
|
||||||
|
steps = 256 # Number of steps for the color transition
|
||||||
|
for step in range(steps):
|
||||||
|
# Interpolate between start_color and end_color
|
||||||
|
color = (
|
||||||
|
int(start_color[0] + (end_color[0] - start_color[0]) * step / steps),
|
||||||
|
int(start_color[1] + (end_color[1] - start_color[1]) * step / steps),
|
||||||
|
int(start_color[2] + (end_color[2] - start_color[2]) * step / steps),
|
||||||
|
)
|
||||||
|
self.fill(color)
|
||||||
|
self.show()
|
||||||
|
await asyncio.sleep(duration / steps)
|
||||||
|
|
||||||
|
async def scanner(self, color, speed):
|
||||||
|
position = 0
|
||||||
|
direction = 1 # 1 for moving right, -1 for moving left
|
||||||
|
|
||||||
|
while True:
|
||||||
|
self.fill((0, 0, 0)) # Clear the LEDs
|
||||||
|
self.set(position, color) # Set the current position to the specified color
|
||||||
|
while self.busy():
|
||||||
|
pass
|
||||||
|
self.show()
|
||||||
|
await asyncio.sleep(speed)
|
||||||
|
position += direction
|
||||||
|
if position == self.num_leds - 1 or position == 0:
|
||||||
|
direction *= -1 # Reverse direction when reaching the end
|
||||||
|
|
||||||
|
async def bidirectional_scanner(self, color_left, color_right=None, speed=0.1):
|
||||||
|
# If right color is not specified, use the left color
|
||||||
|
color_right = color_right or color_left
|
||||||
|
|
||||||
|
position_left = 0
|
||||||
|
position_right = self.num_leds - 1
|
||||||
|
direction_left = 1 # 1 for moving right, -1 for moving left
|
||||||
|
direction_right = -1 # 1 for moving right, -1 for moving left
|
||||||
|
|
||||||
|
while True:
|
||||||
|
self.fill((0, 0, 0)) # Clear the LEDs
|
||||||
|
self.set(position_left, color_left) # Set the left position to the specified color
|
||||||
|
self.set(position_right, color_right) # Set the right position to the specified color
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
await asyncio.sleep(speed)
|
||||||
|
|
||||||
|
position_left += direction_left
|
||||||
|
position_right += direction_right
|
||||||
|
|
||||||
|
# Reverse direction when reaching the end
|
||||||
|
if position_left == self.num_leds - 1 or position_left == 0:
|
||||||
|
direction_left *= -1
|
||||||
|
if position_right == self.num_leds - 1 or position_right == 0:
|
||||||
|
direction_right *= -1
|
||||||
|
|
||||||
|
async def sine_wave_propagation(self, color, speed):
|
||||||
|
frequency = 10 # Adjust the frequency of the sine wave
|
||||||
|
phase = 0 # Initial phase of the sine wave
|
||||||
|
|
||||||
|
while True:
|
||||||
|
self.fill((0, 0, 0)) # Clear the LEDs
|
||||||
|
|
||||||
|
for i in range(self.num_leds):
|
||||||
|
brightness = int(127.5 * (math.sin(frequency * i + phase) + 1))
|
||||||
|
self.set(i, (brightness * color[0] // 255, brightness * color[1] // 255, brightness * color[2] // 255))
|
||||||
|
while self.busy():
|
||||||
|
pass
|
||||||
|
self.show()
|
||||||
|
await asyncio.sleep(speed)
|
||||||
|
|
||||||
|
# Update phase for the sine wave propagation
|
||||||
|
phase += 0.1
|
||||||
|
|
||||||
|
async def run():
|
||||||
|
ws = LedPatterns(150, 0, 0, 0.1)
|
||||||
|
while True:
|
||||||
|
#await ws.color_transition(ws.RED, ws.BLUE, 2)
|
||||||
|
#await ws.color_transition(ws.BLUE, ws.GREEN, 2)
|
||||||
|
#await ws.color_transition(ws.GREEN, ws.RED, 2)
|
||||||
|
#await ws.bidirectional_scanner(ws.GREEN)
|
||||||
|
await ws.sine_wave_propagation(ws.RED, 0.1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
asyncio.create_task(run())
|
||||||
|
loop.run_forever()
|
Loading…
Reference in New Issue