Adafruit_Learning_System_Gu.../Logans_Run_Hand_Jewel_LED/code.py
2022-02-18 17:02:35 -05:00

100 lines
2.6 KiB
Python

# SPDX-FileCopyrightText: 2017 Mikey Sklar for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import time
import board
import neopixel
pixpin = board.D1
numpix = 7
wait = .5 # 1/2 second color fade duration
# defaults to RGB|GRB Neopixels
strip = neopixel.NeoPixel(pixpin, numpix, brightness=1, auto_write=False)
# uncomment the following 3 line for RGBW Neopixels
# strip = neopixel.NeoPixel(
# pixpin, numpix, bpp=4, brightness=.3, auto_write=True
# )
# Linear interpolation of y value given min/max x, min/max y, and x position.
def lerp(x, x0, x1, y0, y1):
# Clamp x within x0 and x1 bounds.
if x > x1:
x = x1
if x < x0:
x = x0
# Calculate linear interpolation of y value.
return y0 + (y1 - y0) * ((x - x0) / (x1 - x0))
# Set all pixels to the specified color.
def fill_pixels(r, g, b):
for i in range(0, numpix):
strip[i] = (r, g, b)
strip.write()
# Get the color of a pixel within a smooth gradient of two colors.
# Starting R,G,B color
# Ending R,G,B color
# Position along gradient, should be a value 0 to 1.0
def color_gradient(start_r, start_g, start_b, end_r, end_g, end_b, pos):
# Interpolate R,G,B values and return them as a color.
red = lerp(pos, 0.0, 1.0, start_r, end_r)
green = lerp(pos, 0.0, 1.0, start_g, end_g)
blue = lerp(pos, 0.0, 1.0, start_b, end_b)
return (red, green, blue)
# Starting R,G,B color
# Ending R,G,B color
# Total duration of animation, in milliseconds
def animate_gradient_fill(start_r, start_g, start_b, end_r, end_g, end_b,
duration_ms):
start = time.monotonic()
# Display start color.
fill_pixels(start_r, start_g, start_b)
# Main animation loop.
delta = time.monotonic() - start
while delta < duration_ms:
# Calculate how far along we are in the duration as a position 0...1.0
pos = delta / duration_ms
# Get the gradient color and fill all the pixels with it.
color = color_gradient(start_r, start_g, start_b,
end_r, end_g, end_b, pos)
fill_pixels(int(color[0]), int(color[1]), int(color[2]))
# Update delta and repeat.
delta = time.monotonic() - start
# Display end color.
fill_pixels(end_r, end_g, end_b)
while True:
# Run It:
# Nice fade from dim red to full red for 1/2 of a second:
animate_gradient_fill(10, 0, 0, 255, 0, 0, wait)
# Then fade from full red to dim red for 1/2 a second.
animate_gradient_fill(255, 0, 0, 10, 0, 0, wait)
# time.sleep(1) # Use this delay if using multiple color fades