Adafruit_Learning_System_Gu.../Gemma_LightTouch/gemma_lighttouch.py
2018-05-14 20:56:51 +01:00

101 lines
2.7 KiB
Python

"""Interactive light show using built-in LED and capacitive touch"""
import time
import adafruit_dotstar
import board
import touchio
led = adafruit_dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1)
touch_A0 = touchio.TouchIn(board.A0)
touch_A1 = touchio.TouchIn(board.A1)
touch_A2 = touchio.TouchIn(board.A2)
def wheel(pos):
""" Input a value 0 to 255 to get a color value.
The colours are a transition r - g - b - back to r."""
if pos < 0 or pos > 255:
return 0, 0, 0
if pos < 85:
return int(255 - pos * 3), int(pos * 3), 0
if pos < 170:
pos -= 85
return 0, int(255 - pos * 3), int(pos * 3)
pos -= 170
return int(pos * 3), 0, int(255 - (pos * 3))
def cycle_sequence(seq):
"""Allows other generators to iterate infinitely"""
while True:
for elem in seq:
yield elem
def rainbow_cycle(seq):
"""Rainbow cycle generator"""
rainbow_sequence = cycle_sequence(seq)
while True:
# pylint: disable=stop-iteration-return
led[0] = (wheel(next(rainbow_sequence)))
yield
def brightness_cycle():
"""Allows cycling through brightness levels"""
brightness_value = cycle_sequence([1, 0.8, 0.6, 0.4, 0.2])
while True:
# pylint: disable=stop-iteration-return
led.brightness = next(brightness_value)
yield
color_sequences = cycle_sequence(
[
range(256), # rainbow_cycle
[50, 160], # Python colors!
[0], # red
[85], # green
[170], # blue
]
)
cycle_speeds = cycle_sequence([0.1, 0.3, 0.5])
brightness = brightness_cycle()
CYCLE_SPEED_INITIAL = 0.3
cycle_speed_start = time.monotonic()
cycle_speed = cycle_speed_start + CYCLE_SPEED_INITIAL
rainbow = None
touch_A0_state = None
touch_A1_state = None
touch_A2_state = None
while True:
now = time.monotonic()
if not touch_A0.value and touch_A0_state is None:
touch_A0_state = "ready"
if touch_A0.value and touch_A0_state == "ready" or rainbow is None:
rainbow = rainbow_cycle(next(color_sequences))
touch_A0_state = None
if now >= cycle_speed:
next(rainbow)
cycle_speed_start = now
cycle_speed = cycle_speed_start + CYCLE_SPEED_INITIAL
if not touch_A1.value and touch_A1_state is None:
touch_A1_state = "ready"
if touch_A1.value and touch_A1_state == "ready":
CYCLE_SPEED_INITIAL = next(cycle_speeds)
cycle_speed_start = now
cycle_speed = cycle_speed_start + CYCLE_SPEED_INITIAL
touch_A1_state = None
if not touch_A2.value and touch_A2_state is None:
touch_A2_state = "ready"
if touch_A2.value and touch_A2_state == "ready":
next(brightness)