Skip to content

Instantly share code, notes, and snippets.

@IceXPR
Forked from ladyada/code.py
Created November 9, 2020 05:48
Show Gist options
  • Select an option

  • Save IceXPR/12b5bd7104bf5c2312a3e561c84add3f to your computer and use it in GitHub Desktop.

Select an option

Save IceXPR/12b5bd7104bf5c2312a3e561c84add3f to your computer and use it in GitHub Desktop.

Revisions

  1. @ladyada ladyada created this gist Nov 9, 2020.
    147 changes: 147 additions & 0 deletions code.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,147 @@
    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)