ws281x/patterns.py

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()