Update PyBadge Conference Badge to be more readable
This commit is contained in:
parent
3b82052b0b
commit
fe94b1b3f2
1 changed files with 78 additions and 63 deletions
|
|
@ -7,7 +7,6 @@ This is a Conference Badge type Name Tag that is intended to be displayed on
|
|||
the PyBadge. Feel free to customize it to your heart's content.
|
||||
"""
|
||||
|
||||
import time
|
||||
from math import sqrt, cos, sin, radians
|
||||
import board
|
||||
from micropython import const
|
||||
|
|
@ -39,25 +38,30 @@ FOREGROUND_COLOR = 0xFFFFFF
|
|||
BACKGROUND_TEXT_COLOR = 0xFFFFFF
|
||||
FOREGROUND_TEXT_COLOR = 0x000000
|
||||
|
||||
# Default Values
|
||||
brightness = 0.2
|
||||
direction = 1
|
||||
speed = 1
|
||||
settings = {"brightness": 0.2, "direction": 1, "speed": 1}
|
||||
|
||||
# Define the NeoPixel and Game Pad Objects
|
||||
neopixels = neopixel.NeoPixel(board.NEOPIXEL, NEOPIXEL_COUNT, brightness=brightness,
|
||||
auto_write=False, pixel_order=neopixel.GRB)
|
||||
# Define the NeoPixel
|
||||
neopixels = neopixel.NeoPixel(
|
||||
board.NEOPIXEL,
|
||||
NEOPIXEL_COUNT,
|
||||
brightness=settings["brightness"],
|
||||
auto_write=False,
|
||||
pixel_order=neopixel.GRB,
|
||||
)
|
||||
|
||||
# Define Events and Shift Register
|
||||
latest_event = Event()
|
||||
last_event = Event()
|
||||
|
||||
pad = ShiftRegisterKeys(clock=board.BUTTON_CLOCK,
|
||||
data=board.BUTTON_OUT,
|
||||
latch=board.BUTTON_LATCH,
|
||||
key_count=8,
|
||||
value_when_pressed=True,
|
||||
interval=0.1,
|
||||
max_events=1)
|
||||
pad = ShiftRegisterKeys(
|
||||
clock=board.BUTTON_CLOCK,
|
||||
data=board.BUTTON_OUT,
|
||||
latch=board.BUTTON_LATCH,
|
||||
key_count=8,
|
||||
value_when_pressed=True,
|
||||
interval=0.1,
|
||||
max_events=1,
|
||||
)
|
||||
|
||||
# Make the Display Background
|
||||
splash = displayio.Group()
|
||||
|
|
@ -67,9 +71,7 @@ color_bitmap = displayio.Bitmap(160, 128, 1)
|
|||
color_palette = displayio.Palette(1)
|
||||
color_palette[0] = BACKGROUND_COLOR
|
||||
|
||||
bg_sprite = displayio.TileGrid(color_bitmap,
|
||||
pixel_shader=color_palette,
|
||||
x=0, y=0)
|
||||
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
|
||||
splash.append(bg_sprite)
|
||||
|
||||
# Draw a Foreground Rectangle where the name goes
|
||||
|
|
@ -79,55 +81,66 @@ splash.append(rect)
|
|||
# Load the Hello font
|
||||
large_font_name = "/fonts/Verdana-Bold-18.bdf"
|
||||
large_font = bitmap_font.load_font(large_font_name)
|
||||
large_font.load_glyphs(HELLO_STRING.encode('utf-8'))
|
||||
large_font.load_glyphs(HELLO_STRING.encode("utf-8"))
|
||||
|
||||
# Load the "My Name Is" font
|
||||
small_font_name = "/fonts/Arial-12.bdf"
|
||||
small_font = bitmap_font.load_font(small_font_name)
|
||||
small_font.load_glyphs(MY_NAME_STRING.encode('utf-8'))
|
||||
small_font.load_glyphs(MY_NAME_STRING.encode("utf-8"))
|
||||
|
||||
# Load the Name font
|
||||
name_font_name = NAME_FONTNAME
|
||||
name_font = bitmap_font.load_font(name_font_name)
|
||||
name_font.load_glyphs(NAME_STRING.encode('utf-8'))
|
||||
name_font.load_glyphs(NAME_STRING.encode("utf-8"))
|
||||
|
||||
# Setup and Center the Hello Label
|
||||
hello_label = Label(large_font, text=HELLO_STRING)
|
||||
(x, y, w, h) = hello_label.bounding_box
|
||||
hello_label.x = (80 - w // 2)
|
||||
hello_label.y = 15
|
||||
hello_label.color = BACKGROUND_TEXT_COLOR
|
||||
splash.append(hello_label)
|
||||
splash.append(
|
||||
Label(
|
||||
large_font,
|
||||
anchor_point=(0.5, 0.5),
|
||||
anchored_position=(board.DISPLAY.width // 2, 15),
|
||||
text=HELLO_STRING,
|
||||
color=BACKGROUND_TEXT_COLOR,
|
||||
)
|
||||
)
|
||||
|
||||
# Setup and Center the "My Name Is" Label
|
||||
mni_label = Label(small_font, text=MY_NAME_STRING)
|
||||
(x, y, w, h) = mni_label.bounding_box
|
||||
mni_label.x = (80 - w // 2)
|
||||
mni_label.y = 35
|
||||
mni_label.color = BACKGROUND_TEXT_COLOR
|
||||
splash.append(mni_label)
|
||||
splash.append(
|
||||
Label(
|
||||
small_font,
|
||||
anchor_point=(0.5, 0.5),
|
||||
anchored_position=(board.DISPLAY.width // 2, 35),
|
||||
text=MY_NAME_STRING,
|
||||
color=BACKGROUND_TEXT_COLOR,
|
||||
)
|
||||
)
|
||||
|
||||
# Setup and Center the Name Label
|
||||
name_label = Label(name_font, text=NAME_STRING, line_spacing=0.75)
|
||||
(x, y, w, h) = name_label.bounding_box
|
||||
name_label.x = (80 - w // 2)
|
||||
name_label.y = 85
|
||||
name_label.color = FOREGROUND_TEXT_COLOR
|
||||
splash.append(name_label)
|
||||
splash.append(
|
||||
Label(
|
||||
name_font,
|
||||
anchor_point=(0.5, 0.5),
|
||||
anchored_position=(board.DISPLAY.width // 2, 85),
|
||||
text=NAME_STRING,
|
||||
color=FOREGROUND_TEXT_COLOR,
|
||||
)
|
||||
)
|
||||
|
||||
# Remap the calculated rotation to 0 - 255
|
||||
def remap(vector):
|
||||
return int(((255 * vector + 85) * 0.75) + 0.5)
|
||||
|
||||
|
||||
# Calculate the Hue rotation starting with Red as 0 degrees
|
||||
def rotate(degrees):
|
||||
cosA = cos(radians(degrees))
|
||||
sinA = sin(radians(degrees))
|
||||
red = cosA + (1.0 - cosA) / 3.0
|
||||
green = 1./3. * (1.0 - cosA) + sqrt(1./3.) * sinA
|
||||
blue = 1./3. * (1.0 - cosA) - sqrt(1./3.) * sinA
|
||||
green = 1.0 / 3.0 * (1.0 - cosA) + sqrt(1.0 / 3.0) * sinA
|
||||
blue = 1.0 / 3.0 * (1.0 - cosA) - sqrt(1.0 / 3.0) * sinA
|
||||
return (remap(red), remap(green), remap(blue))
|
||||
|
||||
|
||||
palette = []
|
||||
pixels = []
|
||||
|
||||
|
|
@ -140,37 +153,39 @@ for degree in range(0, 360):
|
|||
for x in range(0, NEOPIXEL_COUNT):
|
||||
pixels.append(x * 360 // NEOPIXEL_COUNT)
|
||||
|
||||
|
||||
def check_buttons(event):
|
||||
if event.key_number == BUTTON_RIGHT:
|
||||
settings["direction"] = -1
|
||||
elif event.key_number == BUTTON_LEFT:
|
||||
settings["direction"] = 1
|
||||
elif (event.key_number == BUTTON_UP) and settings["speed"] < 10:
|
||||
settings["speed"] += 1
|
||||
elif (event.key_number == BUTTON_DOWN) and settings["speed"] > 1:
|
||||
settings["speed"] -= 1
|
||||
elif (event.key_number == BUTTON_A) and settings["brightness"] < 0.5:
|
||||
settings["brightness"] += 0.025
|
||||
elif (event.key_number == BUTTON_B) and settings["brightness"] > 0.025:
|
||||
settings["brightness"] -= 0.025
|
||||
|
||||
|
||||
# Main Loop
|
||||
last_read = 0
|
||||
while True:
|
||||
for color in range(0, 360, speed):
|
||||
for color in range(0, 360, settings["speed"]):
|
||||
for index in range(0, NEOPIXEL_COUNT):
|
||||
palette_index = pixels[index] + color * direction
|
||||
palette_index = pixels[index] + color * settings["direction"]
|
||||
if palette_index >= 360:
|
||||
palette_index -= 360
|
||||
elif palette_index < 0:
|
||||
palette_index += 360
|
||||
neopixels[index] = palette[palette_index]
|
||||
neopixels.show()
|
||||
neopixels.brightness = brightness
|
||||
# Reading buttons too fast returns 0
|
||||
if (last_read + 0.1) < time.monotonic():
|
||||
pad.events.get_into(latest_event)
|
||||
last_read = time.monotonic()
|
||||
neopixels.brightness = settings["brightness"]
|
||||
pad.events.get_into(latest_event)
|
||||
if latest_event.pressed and latest_event.key_number != last_event.key_number:
|
||||
# Respond to the buttons
|
||||
if latest_event.key_number == BUTTON_RIGHT:
|
||||
direction = -1
|
||||
elif latest_event.key_number == BUTTON_LEFT:
|
||||
direction = 1
|
||||
elif (latest_event.key_number == BUTTON_UP) and speed < 10:
|
||||
speed += 1
|
||||
elif (latest_event.key_number == BUTTON_DOWN) and speed > 1:
|
||||
speed -= 1
|
||||
elif (latest_event.key_number == BUTTON_A) and brightness < 0.5:
|
||||
brightness += 0.025
|
||||
elif (latest_event.key_number == BUTTON_B) and brightness > 0.025:
|
||||
brightness -= 0.025
|
||||
check_buttons(latest_event)
|
||||
last_event = latest_event
|
||||
latest_event = Event(key_number=8) # An imaginary key number that doesn't exist!
|
||||
|
||||
latest_event = Event(
|
||||
key_number=8
|
||||
) # An imaginary key number that doesn't exist!
|
||||
|
|
|
|||
Loading…
Reference in a new issue