115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
|
from machine import Pin
|
||
|
from neopixel import NeoPixel
|
||
|
import _thread
|
||
|
import time, math
|
||
|
import sys
|
||
|
|
||
|
class LedPatterns:
|
||
|
def __init__(self, pin, num_leds):
|
||
|
self.num_leds = num_leds
|
||
|
self.np = NeoPixel(Pin(pin), num_leds)
|
||
|
self.run = True
|
||
|
|
||
|
def color_chase(self, color, wait):
|
||
|
self.run = True
|
||
|
for i in range(self.num_leds):
|
||
|
self.np[i] = color
|
||
|
self.np.write()
|
||
|
if not run:
|
||
|
break
|
||
|
time.sleep(wait)
|
||
|
|
||
|
def wheel(self, pos):
|
||
|
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)
|
||
|
|
||
|
def rainbow_cycle(self, wait):
|
||
|
run = True
|
||
|
for j in range(255):
|
||
|
for i in range(self.num_leds):
|
||
|
self.np[i] = self.wheel((i * 256 // self.num_leds) + j)
|
||
|
self.np.write()
|
||
|
if not run:
|
||
|
break
|
||
|
time.sleep(wait)
|
||
|
|
||
|
def breathing(self, color, duration):
|
||
|
steps = 256
|
||
|
for _ in range(steps):
|
||
|
brightness = int(255 * abs(steps / 2 - _) / (steps / 2))
|
||
|
self.np.fill((brightness * color[0] // 255, brightness * color[1] // 255, brightness * color[2] // 255))
|
||
|
self.np.write()
|
||
|
time.sleep(duration / steps)
|
||
|
|
||
|
def color_transition(self, start_color, end_color, duration):
|
||
|
steps = 256
|
||
|
for step in range(steps):
|
||
|
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.np.fill(color)
|
||
|
self.np.write()
|
||
|
if not self.running():
|
||
|
return
|
||
|
time.sleep(duration / steps)
|
||
|
|
||
|
def scanner(self, color, speed):
|
||
|
position = 0
|
||
|
direction = 1
|
||
|
|
||
|
while True:
|
||
|
self.np.fill((0, 0, 0))
|
||
|
self.np[position] = color
|
||
|
self.np.write()
|
||
|
time.sleep(speed)
|
||
|
position += direction
|
||
|
if position == self.num_leds - 1 or position == 0:
|
||
|
direction *= -1
|
||
|
|
||
|
def bidirectional_scanner(self, color_left, color_right=None, speed=0.1):
|
||
|
color_right = color_right or color_left
|
||
|
position_left = 0
|
||
|
position_right = self.num_leds - 1
|
||
|
direction_left = 1
|
||
|
direction_right = -1
|
||
|
while True:
|
||
|
self.np.fill((0, 0, 0))
|
||
|
self.np[position_left] = color_left
|
||
|
self.np[position_right] = color_right
|
||
|
self.np.write()
|
||
|
time.sleep(speed)
|
||
|
|
||
|
position_left += direction_left
|
||
|
position_right += direction_right
|
||
|
|
||
|
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
|
||
|
|
||
|
def sine_wave_propagation(self, color, speed):
|
||
|
frequency = 10
|
||
|
phase = 0
|
||
|
while True:
|
||
|
self.np.fill((0, 0, 0))
|
||
|
for i in range(self.num_leds):
|
||
|
brightness = int(127.5 * (math.sin(frequency * i + phase) + 1))
|
||
|
self.np[i] = (brightness * color[0] // 255, brightness * color[1] // 255, brightness * color[2] // 255)
|
||
|
self.np.write()
|
||
|
time.sleep(speed)
|
||
|
phase += 0.1
|
||
|
|
||
|
def fill(self,color):
|
||
|
for i in range(self.num_leds):
|
||
|
self.np[i] = color
|
||
|
self.np.write()
|