Skip to content

Instantly share code, notes, and snippets.

@ladyada
Created November 9, 2020 01:11
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save ladyada/2f117c1c83ed78e02c0f324724474698 to your computer and use it in GitHub Desktop.
Save ladyada/2f117c1c83ed78e02c0f324724474698 to your computer and use it in GitHub Desktop.
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
Copy link

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

@ladyada
Copy link
Author

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
Copy link

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

@ladyada
Copy link
Author

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