Skip to content

Adding demos and tests #60

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Feb 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions docs/examples.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,11 @@ Ensure your device works with this simple test.
.. literalinclude:: ../examples/ht16k33_bicolor24_simpletest.py
:caption: examples/ht16k33_bicolor24_simpletest.py
:linenos:

.. literalinclude:: ../examples/ht16k33_matrix_pillow_image.py
:caption: examples/ht16k33_matrix_pillow_image.py
:linenos:

.. literalinclude:: ../examples/ht16k33_animation_demo.py
:caption: examples/ht16k33_animation_demo.py
:linenos:
328 changes: 328 additions & 0 deletions examples/ht16k33_animation_demo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,328 @@
"""
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 = 2

# 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!")
elif not isinstance(bitmasks, list):
raise ValueError("The second parameter MUST be a list!")
elif delay < 0:
raise ValueError("The delay between frames must be positive!")
else:
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()