secrets.py
First, make sure you've set up your secrets.py file has your accurate network info stored.
Text Editor
Adafruit recommends using the Mu editor for editing your CircuitPython code. You can get more info in this guide.
Alternatively, you can use any text editor that saves simple text files.
To use with CircuitPython, you need to first install a few libraries, into the lib folder on your CIRCUITPY drive. Then you need to update code.py with the example script.
Thankfully, we can do this in one go. In the example below, click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, open the directory Magtag_Cat_Fed_Clock/ and then click on the directory that matches the version of CircuitPython you're using and copy the contents of that directory to your CIRCUITPY drive.
Your CIRCUITPY
# SPDX-FileCopyrightText: 2020 Collin Cunningham for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import time
from adafruit_magtag.magtag import MagTag
USE_AMPM_TIME = True
weekdays = ("mon", "tue", "wed", "thur", "fri", "sat", "sun")
last_sync = None
last_minute = None
magtag = MagTag()
magtag.graphics.set_background("/background.bmp")
mid_x = magtag.graphics.display.width // 2 - 1
magtag.add_text(
text_font="Lato-Regular-74.bdf",
text_position=(mid_x,10),
text_anchor_point=(0.5,0),
is_data=False,
)
magtag.set_text("00:00a", auto_refresh = False)
magtag.add_text(
text_font="/BebasNeueRegular-41.bdf",
text_position=(126,86), #was 141
text_anchor_point=(0,0),
is_data=False,
)
magtag.set_text("DAY 00:00a", index = 1, auto_refresh = False)
def hh_mm(time_struct, twelve_hour=True):
""" Given a time.struct_time, return a string as H:MM or HH:MM, either
12- or 24-hour style depending on twelve_hour flag.
"""
postfix = ""
if twelve_hour:
if time_struct.tm_hour > 12:
hour_string = str(time_struct.tm_hour - 12) # 13-23 -> 1-11 (pm)
postfix = "p"
elif time_struct.tm_hour > 0:
hour_string = str(time_struct.tm_hour) # 1-12
postfix = "a"
if time_struct.tm_hour == 12:
postfix = "p" # 12 -> 12 (pm)
else:
hour_string = '12' # 0 -> 12 (am)
postfix = "a"
else:
hour_string = '{hh:02d}'.format(hh=time_struct.tm_hour)
return hour_string + ':{mm:02d}'.format(mm=time_struct.tm_min) + postfix
while True:
if not last_sync or (time.monotonic() - last_sync) > 3600:
# at start or once an hour
magtag.network.get_local_time()
last_sync = time.monotonic()
# get current time
now = time.localtime()
# minute updated, refresh display!
if not last_minute or (last_minute != now.tm_min): # minute has updated
magtag.set_text(hh_mm(now, USE_AMPM_TIME), index = 0)
last_minute = now.tm_min
# timestamp
if magtag.peripherals.button_a_pressed:
out = weekdays[now.tm_wday] + " " + hh_mm(now, USE_AMPM_TIME)
magtag.set_text(out, index = 1)
while magtag.peripherals.button_a_pressed: # wait till released
pass
After copying the code to the MagTag, the board will restart. After a moment the board's display will refresh to show the current time.
To save a reference to the current time of cat feeding, press and release the left-most pushbutton (under the fork & knife icon).
import time from adafruit_magtag.magtag import MagTag
First off, we import code libraries to handle time formatting/calculation and the MagTag library for access to all the board's special features.
USE_AMPM_TIME = True
weekdays = ("mon", "tue", "wed", "thur", "fri", "sat", "sun")
last_sync = None
last_minute = None
magtag = MagTag()
Next, we define some variables. USE_AMPM_TIME determines if time will be displayed in 12 hour or 24 hour (aka military time) format. The weekdays variable stores names for days of the week.
The last_sync variable is defined to keep track of when the time was last synced with the adafruit.io server, and the last_minute variable keeps a reference to the last time the display was updated at a new minute.
Finally the magtag object is created for addressing the board.
magtag.graphics.set_background("/background.bmp")
mid_x = magtag.graphics.display.width // 2 - 1
magtag.add_text(
text_font="Lato-Regular-74.bdf",
text_position=(mid_x,10),
text_anchor_point=(0.5,0),
is_data=False,
)
magtag.set_text("00:00a", auto_refresh = False)
magtag.add_text(
text_font="/BebasNeueRegular-41.bdf",
text_position=(126,86), #was 141
text_anchor_point=(0,0),
is_data=False,
)
magtag.set_text("DAY 00:00a", index = 1, auto_refresh = False)
The graphics layout is composed of three parts:
-
set_backgroundsets the bitmap image (with cat & fork/knife icons) as the base image on the display. -
add_textis called to create the large main time display, then called again to create the smaller reference clock below.
def hh_mm(time_struct, twelve_hour=True):
""" Given a time.struct_time, return a string as H:MM or HH:MM, either
12- or 24-hour style depending on twelve_hour flag.
"""
postfix = ""
if twelve_hour:
if time_struct.tm_hour > 12:
hour_string = str(time_struct.tm_hour - 12) # 13-23 -> 1-11 (pm)
postfix = "p"
elif time_struct.tm_hour > 0:
hour_string = str(time_struct.tm_hour) # 1-12
postfix = "a"
else:
hour_string = '12' # 0 -> 12 (am)
postfix = "a"
else:
hour_string = '{hh:02d}'.format(hh=time_struct.tm_hour)
return hour_string + ':{mm:02d}'.format(mm=time_struct.tm_min) + postfix
Next, the hh_mm function is defined. This function takes a time_struct value and converts it into a time string formatted for display.
while(True):
if not last_sync or (time.monotonic() - last_sync) > 3600:
# at start or once an hour
magtag.network.get_local_time()
last_sync = time.monotonic()
In the main loop, we first check to see if it's time to sync local time w the adafruit.io server. This is done the first time the code is run, and once every hour after.
# get current time
now = time.localtime()
# minute updated, refresh display!
if not last_minute or (last_minute != now.tm_min): # minute has updated
magtag.set_text(hh_mm(now, USE_AMPM_TIME), index = 0)
last_minute = now.tm_min
Next we get the the local time as a time_struct and store it in the now variable.
If the minute value of now has changed, the main time display is updated, and a reference is saved in last_minute for comparison next time through the loop.
# timestamp
if magtag.peripherals.button_a_pressed:
out = weekdays[now.tm_wday] + " " + hh_mm(now, USE_AMPM_TIME)
magtag.set_text(out, index = 1)
while magtag.peripherals.button_a_pressed: # wait till released
pass
Finally, the code checks to see if the A button is pressed. If it is, the smaller time display is updated using the hh_mm function, prefixed by the current weekday. If the button is held continuously, the code waits for it to be released.
Page last edited January 15, 2025
Text editor powered by tinymce.