Created
October 17, 2019 11:37
-
-
Save nickadam/84a5ffc2d7f501b50ac5c887d8995a6f to your computer and use it in GitHub Desktop.
#ws281x #strangerthings
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import time | |
import random | |
from rpi_ws281x import PixelStrip, Color | |
import argparse | |
# LED strip configuration: | |
LED_COUNT = 50 # Number of LED pixels. | |
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!). | |
# LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0). | |
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) | |
LED_DMA = 10 # DMA channel to use for generating signal (try 10) | |
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest | |
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) | |
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53 | |
LETTERS = { | |
'A' : 49, | |
'B' : 47, | |
'C' : 45, | |
'D' : 44, | |
'E' : 42, | |
'F' : 41, | |
'G' : 39, | |
'H' : 38, | |
'Q' : 36, | |
'P' : 35, | |
'O' : 33, | |
'N' : 32, | |
'M' : 30, | |
'L' : 28, | |
'K' : 27, | |
'J' : 24, | |
'I' : 23, | |
'R' : 20, | |
'S' : 17, | |
'T' : 16, | |
'U' : 13, | |
'V' : 12, | |
'W' : 10, | |
'X' : 9, | |
'Y' : 7, | |
'Z' : 6 | |
} | |
DIM = { | |
'Blue' : Color(0,0,10), | |
'Yellow' : Color(10,10,0), | |
'Red' : Color(0,10,0), | |
'Green' : Color(10,0,0), | |
'White' : Color(10,10,10), | |
} | |
BRIGHT = { | |
'Blue' : Color(0,0,255), | |
'Yellow' : Color(255,255,0), | |
'Red' : Color(0,255,0), | |
'Green' : Color(255,0,0), | |
'White' : Color(255,255,255), | |
} | |
def assignColors(): | |
lights = {} | |
colors = ['Blue', 'Yellow', 'Red', 'Green', 'White'] | |
lastColor = '' | |
for i in LETTERS: | |
color = random.choice(colors) | |
while lastColor == color: | |
color = random.choice(colors) | |
lights[i] = color | |
lastColor = color | |
return lights | |
def spaz2(strip, colors, wait_ms=50): | |
colorDefs = { | |
'Blue' : [0,0,255], | |
'Yellow' : [255,255,0], | |
'Red' : [0,255,0], | |
'Green' : [255,0,0], | |
'White' : [255,255,255], | |
} | |
t = 0 | |
while t <= 100: | |
t = t + 1 | |
if(t >= 80): | |
colors = assignColors() | |
for letter in LETTERS: | |
color = colors[letter] | |
level = random.randint(int(t / 4), t) | |
brightness = int(2.55 * level) | |
setColor = {} | |
i = 0 | |
for n in colorDefs[color]: | |
setColor[i] = n | |
if n == 255: | |
setColor[i] = brightness | |
i = i + 1 | |
led = LETTERS[letter] | |
strip.setPixelColor(led, Color(setColor[0], setColor[1], setColor[2])) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def spaz(strip, colors, wait_ms=60): | |
colorDefs = { | |
'Blue' : [0,0,255], | |
'Yellow' : [255,255,0], | |
'Red' : [0,255,0], | |
'Green' : [255,0,0], | |
'White' : [255,255,255], | |
} | |
l = 0 | |
while l <= 3: | |
l = l + 1 | |
t = 0 | |
while t <= 25: | |
if l >= 3: | |
randomColors = assignColors() | |
for letter in LETTERS: | |
color = colors[letter] | |
if l >= 3: | |
color = randomColors[letter] | |
level = random.randint(0,3) | |
brightness = level * 28 * l | |
#brightness = random.randint(0,255) | |
setColor = {} | |
i = 0 | |
for n in colorDefs[color]: | |
setColor[i] = n | |
if n == 255: | |
setColor[i] = brightness | |
i = i + 1 | |
led = LETTERS[letter] | |
strip.setPixelColor(led, Color(setColor[0], setColor[1], setColor[2])) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
t = t + 1 | |
def ramp(strip, colors, wait_ms=50): | |
colorDefs = { | |
'Blue' : [0,0,255], | |
'Yellow' : [255,255,0], | |
'Red' : [0,255,0], | |
'Green' : [255,0,0], | |
'White' : [255,255,255], | |
} | |
t = 10 | |
while t <= 255: | |
for letter in LETTERS: | |
color = colors[letter] | |
brightness = t | |
setColor = {} | |
i = 0 | |
for n in colorDefs[color]: | |
setColor[i] = n | |
if n == 255: | |
setColor[i] = brightness | |
i = i + 1 | |
led = LETTERS[letter] | |
strip.setPixelColor(led, Color(setColor[0], setColor[1], setColor[2])) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
t = t + 10 | |
def fastRamp(strip, colors, wait_ms=50): | |
colorDefs = { | |
'Blue' : [0,0,255], | |
'Yellow' : [255,255,0], | |
'Red' : [0,255,0], | |
'Green' : [255,0,0], | |
'White' : [255,255,255], | |
} | |
t = 10 | |
while t <= 255: | |
for letter in LETTERS: | |
color = colors[letter] | |
brightness = t | |
setColor = {} | |
i = 0 | |
for n in colorDefs[color]: | |
setColor[i] = n | |
if n == 255: | |
setColor[i] = brightness | |
i = i + 1 | |
led = LETTERS[letter] | |
strip.setPixelColor(led, Color(setColor[0], setColor[1], setColor[2])) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
t = t + 30 | |
def walk(strip, colors, wait_ms=350): | |
for letter in LETTERS: | |
color = DIM[colors[letter]] | |
led = LETTERS[letter] | |
strip.setPixelColor(led, color) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def dimLights(strip, colors, wait_ms=50): | |
for letter in LETTERS: | |
color = DIM[colors[letter]] | |
led = LETTERS[letter] | |
strip.setPixelColor(led, color) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def dark(strip, wait_ms=50): | |
for letter in LETTERS: | |
led = LETTERS[letter] | |
strip.setPixelColor(led, Color(0,0,0)) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def brightenOne(strip, colors, brightLetter, wait_ms=50): | |
for letter in LETTERS: | |
color = DIM[colors[letter]] | |
if letter == brightLetter: | |
color = BRIGHT[colors[letter]] | |
led = LETTERS[letter] | |
strip.setPixelColor(led, color) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def lightOne(strip, color, led, wait_ms=50): | |
strip.setPixelColor(led, color) | |
strip.show() | |
time.sleep(wait_ms/1000.0) | |
def spellWord(strip, colors, word): | |
for letter in word.upper(): | |
brightenOne(strip, colors, letter, 666) | |
dimLights(strip, colors, 333) | |
dimLights(strip, colors, 1500) | |
def colorWipe(strip, color, wait_ms=50): | |
"""Wipe color across display a pixel at a time.""" | |
for i in range(strip.numPixels()): | |
strip.setPixelColor(i, color) | |
strip.show() | |
time.sleep(wait_ms / 1000.0) | |
def theaterChase(strip, color, wait_ms=50, iterations=10): | |
"""Movie theater light style chaser animation.""" | |
for j in range(iterations): | |
for q in range(3): | |
for i in range(0, strip.numPixels(), 3): | |
strip.setPixelColor(i + q, color) | |
strip.show() | |
time.sleep(wait_ms / 1000.0) | |
for i in range(0, strip.numPixels(), 3): | |
strip.setPixelColor(i + q, 0) | |
def wheel(pos): | |
"""Generate rainbow colors across 0-255 positions.""" | |
if pos < 85: | |
return Color(pos * 3, 255 - pos * 3, 0) | |
elif pos < 170: | |
pos -= 85 | |
return Color(255 - pos * 3, 0, pos * 3) | |
else: | |
pos -= 170 | |
return Color(0, pos * 3, 255 - pos * 3) | |
def rainbow(strip, wait_ms=20, iterations=1): | |
"""Draw rainbow that fades across all pixels at once.""" | |
for j in range(256 * iterations): | |
for i in range(strip.numPixels()): | |
strip.setPixelColor(i, wheel((i + j) & 255)) | |
strip.show() | |
time.sleep(wait_ms / 1000.0) | |
def rainbowCycle(strip, wait_ms=20, iterations=5): | |
"""Draw rainbow that uniformly distributes itself across all pixels.""" | |
for j in range(256 * iterations): | |
for i in range(strip.numPixels()): | |
strip.setPixelColor(i, wheel( | |
(int(i * 256 / strip.numPixels()) + j) & 255)) | |
strip.show() | |
time.sleep(wait_ms / 1000.0) | |
def theaterChaseRainbow(strip, wait_ms=50): | |
"""Rainbow movie theater light style chaser animation.""" | |
for j in range(256): | |
for q in range(3): | |
for i in range(0, strip.numPixels(), 3): | |
strip.setPixelColor(i + q, wheel((i + j) % 255)) | |
strip.show() | |
time.sleep(wait_ms / 1000.0) | |
for i in range(0, strip.numPixels(), 3): | |
strip.setPixelColor(i + q, 0) | |
# Main program logic follows: | |
if __name__ == '__main__': | |
# Process arguments | |
parser = argparse.ArgumentParser() | |
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit') | |
args = parser.parse_args() | |
# Create NeoPixel object with appropriate configuration. | |
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL) | |
# Intialize the library (must be called once before other functions). | |
strip.begin() | |
print('Press Ctrl-C to quit.') | |
if not args.clear: | |
print('Use "-c" argument to clear LEDs on exit') | |
try: | |
while True: | |
colors = assignColors() | |
dark(strip, 1000) | |
walk(strip, colors) | |
spellWord(strip, colors, '') | |
spellWord(strip, colors, 'RIGHTHERE') | |
spellWord(strip, colors, '') | |
spellWord(strip, colors, 'RUN') | |
ramp(strip, colors) | |
spaz(strip, colors) | |
#spaz2(strip, colors) | |
fastRamp(strip, colors) | |
dark(strip, 1000) | |
#lightOne(strip, Color(255,0,0), A) | |
#lightOne(strip, Color(0,255,0), A) | |
#lightOne(strip, Color(0,0,255), A) | |
#lightOne(strip, Color(0,0,0), A) | |
except KeyboardInterrupt: | |
if args.clear: | |
colorWipe(strip, Color(0, 0, 0), 10) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment