Adafruit_CircuitPython_HT16K33/examples/ht16k33_animation_demo.py
2020-03-17 12:45:06 -04:00

341 lines
8.4 KiB
Python

"""
Test script for display animations on an HT16K33 with alphanumeric display
The display must be initialized with auto_write=False.
"""
from time import sleep
import board
import busio
from adafruit_ht16k33.segments import Seg14x4
#
# Segment bits on the HT16K33 with alphanumeric display.
#
# Add the values of the segments you need to create a bitmask
#
N = 16384
M = 8192
L = 4096
K = 2048
J = 1024
I = 512
H = 256
G2 = 128
G1 = 64
F = 32
E = 16
D = 8
C = 4
B = 2
A = 1
# The number of seconds to delay between writing segments
DEFAULT_CHAR_DELAY_SEC = 0.2
# The number of cycles to go for each animation
DEFAULT_CYCLES = 5
# Brightness of the display (0 to 15)
DEFAULT_DISPLAY_BRIGHTNESS = 0.3
# Initialize the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)
# Initialize the HT16K33 with alphanumeric display featherwing.
#
# You MUST set auto_write=False
display = Seg14x4(i2c, auto_write=False)
display.brightness = DEFAULT_DISPLAY_BRIGHTNESS
def animate(digits, bitmasks, delay=DEFAULT_CHAR_DELAY_SEC, auto_write=True):
"""
Main driver for all alphanumeric display animations (WIP!!!)
Param: digits - a list of the digits to write to, in order, like [0, 1, 3]. The digits are
0 to 3 starting at the left most digit.
Param: bitmasks - a list of the bitmasks to write, in sequence, to the specified digits.
Param: delay - The delay, in seconds (or fractions of), between writing bitmasks to a digit.
Param: auto_write - Whether to actually write to the display immediately or not.
Returns: Nothing
"""
if not isinstance(digits, list):
raise ValueError("The first parameter MUST be a list!")
if not isinstance(bitmasks, list):
raise ValueError("The second parameter MUST be a list!")
if delay < 0:
raise ValueError("The delay between frames must be positive!")
for dig in digits:
if not 0 <= dig <= 3:
raise ValueError(
"Digit value must be \
an integer in the range: 0-3"
)
for bits in bitmasks:
if not 0 <= bits <= 0xFFFF:
raise ValueError(
"Bitmask value must be an \
integer in the range: 0-65535"
)
display.set_digit_raw(dig, bits)
if auto_write:
display.show()
sleep(delay)
def chase_forward_and_reverse(delay=DEFAULT_CHAR_DELAY_SEC, cycles=DEFAULT_CYCLES):
cy = 0
while cy < cycles:
animate([0, 1, 2, 3], [A, 0], delay)
animate([3], [B, C, D, 0], delay)
animate([2, 1, 0], [D, 0], delay)
animate([0], [E, F, H, G2, 0], delay)
animate([1, 2], [G1, G2, 0], delay)
animate([3], [G1, J, A, 0], delay)
animate([2, 1], [A, 0], delay)
animate([0], [A, F, E, D, 0], delay)
animate([1, 2], [D, 0], delay)
animate([3], [D, C, B, J, G1, 0], delay)
animate([2, 1], [G2, G1, 0], delay)
animate([0], [H, 0], delay)
cy += 1
def prelude_to_spinners(delay=DEFAULT_CHAR_DELAY_SEC, cycles=DEFAULT_CYCLES):
cy = 0
auto_write = False
while cy < cycles:
animate([1, 2], [A], 0, auto_write)
display.show()
sleep(delay)
animate([0, 3], [A], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + F], 0, auto_write)
animate([3], [A + B], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + E + F], 0, auto_write)
animate([3], [A + B + C], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + D + E + F], 0, auto_write)
animate([3], [A + B + C + D], 0, auto_write)
display.show()
sleep(delay)
animate([1], [A + D], 0, auto_write)
animate([2], [A + D], 0, auto_write)
display.show()
sleep(delay)
animate([1], [A + D + M], 0, auto_write)
animate([2], [A + D + K], 0, auto_write)
display.show()
sleep(delay)
animate([1], [A + D + M + H], 0, auto_write)
animate([2], [A + D + K + J], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + E + F + J + D], 0, auto_write)
animate([3], [A + B + C + H + D], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + E + F + J + K + D], 0, auto_write)
animate([3], [A + B + C + H + M + D], 0, auto_write)
display.show()
sleep(delay)
display.fill(0)
display.show()
sleep(delay)
cy += 1
def spinners(delay=DEFAULT_CHAR_DELAY_SEC, cycles=DEFAULT_CYCLES):
cy = 0
auto_write = False
while cy < cycles:
animate([0], [H + M], 0, auto_write)
animate([1], [J + K], 0, auto_write)
animate([2], [H + M], 0, auto_write)
animate([3], [J + K], 0, auto_write)
display.show()
sleep(delay)
animate([0], [G1 + G2], 0, auto_write)
animate([1], [G1 + G2], 0, auto_write)
animate([2], [G1 + G2], 0, auto_write)
animate([3], [G1 + G2], 0, auto_write)
display.show()
sleep(delay)
animate([0], [J + K], 0, auto_write)
animate([1], [H + M], 0, auto_write)
animate([2], [J + K], 0, auto_write)
animate([3], [H + M], 0, auto_write)
display.show()
sleep(delay)
cy += 1
display.fill(0)
def enclosed_spinners(delay=DEFAULT_CHAR_DELAY_SEC, cycles=DEFAULT_CYCLES):
cy = 0
auto_write = False
while cy < cycles:
animate([0], [A + D + E + F + H + M], 0, auto_write)
animate([1], [A + D + J + K], 0, auto_write)
animate([2], [A + D + H + M], 0, auto_write)
animate([3], [A + B + C + D + J + K], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + D + E + F + G1 + G2], 0, auto_write)
animate([1], [A + D + G1 + G2], 0, auto_write)
animate([2], [A + D + G1 + G2], 0, auto_write)
animate([3], [A + B + C + D + G1 + G2], 0, auto_write)
display.show()
sleep(delay)
animate([0], [A + D + E + F + J + K], 0, auto_write)
animate([1], [A + D + H + M], 0, auto_write)
animate([2], [A + D + J + K], 0, auto_write)
animate([3], [A + B + C + D + H + M], 0, auto_write)
display.show()
sleep(delay)
cy += 1
display.fill(0)
def count_down():
auto_write = False
numbers = [
[A + B + C + D + G1 + G2 + N],
[A + B + D + E + G1 + G2 + N],
[B + C + N],
]
index = 0
display.fill(0)
while index < len(numbers):
animate([index], numbers[index], 0, auto_write)
display.show()
sleep(1)
display.fill(0)
sleep(0.5)
index += 1
sleep(1)
display.fill(0)
try:
text = "Init"
display.fill(1)
display.show()
sleep(1)
display.fill(0)
display.show()
display.print(text)
display.show()
sleep(2)
display.fill(0)
display.show()
sleep(1)
count_down()
sleep(0.2)
text = "Go!!"
display.print(text)
display.show()
sleep(1.5)
display.fill(0)
display.show()
sleep(0.5)
print()
while True:
# Arrow
print("Arrow")
animate([0, 1, 2], [G1 + G2], 0.1)
animate([3], [G1 + H + K], 0.1)
sleep(1.0)
display.fill(0)
sleep(1.0)
# Flying
print("Flying")
cyc = 0
while cyc < DEFAULT_CYCLES:
animate([0], [H + J, G1 + G2, K + M, G1 + G2], DEFAULT_CHAR_DELAY_SEC)
cyc += 1
animate([0], [0])
sleep(1.0)
display.fill(0)
sleep(1.0)
# Chase forward and reverse.
print("Chase forward and reverse")
chase_forward_and_reverse(0.01, 5)
sleep(1.0)
display.fill(0)
sleep(1.0)
# Testing writing to more than one segment simultaneously
print("Prelude to Spinners")
prelude_to_spinners(0.1, 5)
sleep(1.0)
display.fill(0)
display.show()
sleep(1.0)
print("Spinners")
spinners(0.1, 20)
sleep(1.0)
display.fill(0)
display.show()
sleep(1.0)
print("Enclosed Spinners")
enclosed_spinners(0.1, 20)
sleep(1.0)
display.fill(0)
display.show()
sleep(1.0)
print()
except KeyboardInterrupt:
display.fill(0)
display.show()