Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
CircuitPython Countdown for MagTag Demo
import sys
import time
import board
import wifi
import socketpool
import adafruit_requests
import ssl
import rtc
import displayio
import terminalio
import adafruit_il0373
import adafruit_miniqr
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# The time of the thing!
EVENT_YEAR = 2021
EVENT_MONTH = 1
EVENT_DAY = 20
EVENT_HOUR = 12
EVENT_MINUTE = 00
# we'll make a python-friendly structure
event_time = time.struct_time((EVENT_YEAR, EVENT_MONTH, EVENT_DAY,
EVENT_HOUR, EVENT_MINUTE, 0, # we don't track seconds
-1, -1, False)) # we dont know day of week/year or DST
displayio.release_displays()
display_bus = displayio.FourWire(board.SPI(), command=board.EPD_DC,
chip_select=board.EPD_CS,
reset=board.EPD_RESET, baudrate=1000000)
time.sleep(1)
display = adafruit_il0373.IL0373(
display_bus,
width=296,
height=128,
rotation=270,
black_bits_inverted=False,
color_bits_inverted=False,
grayscale=True,
refresh_time=1,
seconds_per_frame=5
)
def bitmap_QR(matrix):
# monochome (2 color) palette
BORDER_PIXELS = 2
# bitmap the size of the screen, monochrome (2 colors)
bitmap = displayio.Bitmap(
matrix.width + 2 * BORDER_PIXELS, matrix.height + 2 * BORDER_PIXELS, 2
)
# raster the QR code
for y in range(matrix.height): # each scanline in the height
for x in range(matrix.width):
if matrix[x, y]:
bitmap[x + BORDER_PIXELS, y + BORDER_PIXELS] = 1
else:
bitmap[x + BORDER_PIXELS, y + BORDER_PIXELS] = 0
return bitmap
qr = adafruit_miniqr.QRCode(qr_type=3, error_correct=adafruit_miniqr.L)
qr.add_data(b"https://buildbackbetter.com/")
qr.make()
# generate the 1-pixel-per-bit bitmap
qr_bitmap = bitmap_QR(qr.matrix)
# We'll draw with a classic black/white palette
palette = displayio.Palette(2)
palette[0] = 0xFFFFFF
palette[1] = 0x000000
# we'll scale the QR code as big as the display can handle
scale = min(
display.width // qr_bitmap.width, display.height // qr_bitmap.height
)
# then put it on the right
pos_x = int((display.width / scale) - qr_bitmap.width)
pos_y = int(((display.height / scale) - qr_bitmap.height) / 2)
qr_img = displayio.TileGrid(qr_bitmap, pixel_shader=palette, x=pos_x, y=pos_y)
qr_group = displayio.Group(scale=scale)
qr_group.append(qr_img)
# bg color
bg_bm = displayio.Bitmap(display.width, display.height, 1)
bg_sprite = displayio.TileGrid(bg_bm, pixel_shader=palette, x = 0, y = 0)
# text label
font = bitmap_font.load_font("Arial-Bold-24.bdf")
text_area = label.Label(font, text="Loading...", max_glyphs=40,
anchor_point = (0, 0.5), line_spacing=0.75,
x = 10, y = display.height//2, color = 0x0)
splash = displayio.Group()
splash.append(bg_sprite)
splash.append(qr_group)
splash.append(text_area)
display.show(splash)
display.refresh()
wifi.radio.connect("adafruit", "ffffffff")
print("ip", wifi.radio.ipv4_address)
#ipv4 = ipaddress.ip_address("8.8.4.4")
#print(ipv4)
#print("ping", wifi.radio.ping(ipv4))
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
response = requests.get("http://worldtimeapi.org/api/timezone/America/New_York")
#print(response.status_code)
datetime_str = response.json()['datetime']
#print(datetime_str)
datesplit = datetime_str.split("-")
year = int(datesplit[0])
month = int(datesplit[1])
timesplit = datesplit[2].split("T")
mday = int(timesplit[0])
timesplit = timesplit[1].split(":")
hours = int(timesplit[0])
minutes = int(timesplit[1])
seconds = int(float(timesplit[2].split("-")[0]))
rtc.RTC().datetime = time.struct_time((year, month, mday, hours, minutes, seconds, 0, 0, False))
while True:
now = time.localtime()
print("Current time:", now)
remaining = time.mktime(event_time) - time.mktime(now)
print("Time remaining (s):", remaining)
if remaining < 0:
print("EVENT TIME")
while True: # that's all folks
pass
secs_remaining = remaining % 60
remaining //= 60
mins_remaining = remaining % 60
remaining //= 60
hours_remaining = remaining % 24
remaining //= 24
days_remaining = remaining
print("%d days, %d hours, %d minutes and %s seconds" %
(days_remaining, hours_remaining, mins_remaining, secs_remaining))
text_area.text = "%d Days\n%d Hours\n%d Mins" % (days_remaining, hours_remaining, mins_remaining)
display.refresh()
time.sleep(60)
@zackkitzmiller

This comment has been minimized.

Copy link

@zackkitzmiller zackkitzmiller commented Nov 13, 2020

@ladyada do you happen to have an example on controlling the NeoPixels in this script? I'm tearing my hair out here. ☹️

@ladyada

This comment has been minimized.

Copy link
Owner Author

@ladyada ladyada commented Nov 13, 2020

this code was really 'light' and not intended for use by others.
try this example
https://github.com/ladyada/Adafruit_Learning_System_Guides/tree/master/MagTag_CountdownCelebration
with this library which we just releaed
https://github.com/adafruit/Adafruit_CircuitPython_MagTag
it has a neopixel celebration example

@zackkitzmiller

This comment has been minimized.

Copy link

@zackkitzmiller zackkitzmiller commented Nov 13, 2020

@ladyada - thank you so much. I finally got the NeoPixels working with a countdown, but these guides look awesome. Thank you.

@ladyada

This comment has been minimized.

Copy link
Owner Author

@ladyada ladyada commented Nov 13, 2020

okidoke we will be publishing documentation in the next week with some more examples!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment