wallart/wallart.py

105 lines
2.5 KiB
Python

import board
from digitalio import DigitalInOut, Direction, Pull
import adafruit_dotstar as dotstar
import adafruit_fancyled.adafruit_fancyled as fancy
import time
import neopixel
import random
import microcontroller
# One pixel connected internally!
dot = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1, brightness=0.2)
dot[0] = 0
# Built in red LED
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT
# NeoPixel strip (of 16 LEDs) connected on D4
GRIDLEN = 64
grid = neopixel.NeoPixel(board.D4, GRIDLEN, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB)
class GlitchPixel:
def __init__(self):
self.init()
self.nsteps = 64
self.step = random.randrange(self.nsteps)
def init(self):
self.step = 0
self.pos = random.randrange(GRIDLEN)
self.color = fancy.CHSV(random.random()).pack()
def frame(self):
bmask = (0xff * self.step // 32) & 0xff
if self.step > self.nsteps/2:
bmask = 0xff - bmask
mask = (bmask << 16) | (bmask << 8) | (bmask << 0)
color = self.color & mask
grid[self.pos] = color
self.step += 1
if self.step > self.nsteps:
self.init()
def fade():
reps = 300 + random.randrange(GRIDLEN)
hue = random.randrange(256)
colors = [fancy.CHSV(hue, 255, v).pack() for v in range(0, 256, 32)]
rcolors = colors[:]
rcolors.reverse()
colors = colors + rcolors
for count in range(reps):
pos = count % GRIDLEN
for color in colors:
grid[pos] = color
pos -= 1
grid.show()
def singleCursor():
red = fancy.CHSV(0, 210, 127).pack()
pos = 20
for i in range(80):
grid[pos] = red * (i % 2)
led.value = not (i % 2)
grid.show()
time.sleep(0.08)
def sparkle():
white = fancy.CHSV(0, 0, 127).pack()
pos = [0,0,0]
for i in range(50):
for j in range(len(pos)):
pos[j] = random.randrange(GRIDLEN)
grid[pos[j]] = white
grid.show()
for p in pos:
grid[p] = 0
grid.show()
def glitchPulse():
grid.fill(0)
pixels = []
for i in range(4):
p = GlitchPixel()
pixels.append(p)
for f in range(1000):
for p in pixels:
p.frame()
grid.show()
time.sleep(0.1)
def loop():
fade()
singleCursor()
sparkle()
glitchPulse()
# For some reason, this program freezes occasionally.
# I don't want to debug CircuitPython.
microcontroller.reset()
while True:
loop()