341 lines
8.4 KiB
Python
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()
|