Skip to content

Instantly share code, notes, and snippets.

@samwhitford
Created January 31, 2025 02:50
Show Gist options
  • Save samwhitford/f4d344d12369dd2a631604d6c5980b73 to your computer and use it in GitHub Desktop.
Save samwhitford/f4d344d12369dd2a631604d6c5980b73 to your computer and use it in GitHub Desktop.
M5Paper World Clock
from m5stack import *
from m5ui import *
from uiflow import *
import wifiCfg
import ntptime
import math
# SET YOUR WIFI SETTINGS HERE (SSID, PASSWORD)
wifiCfg.doConnect('', '')
setScreenColor(15)
cities = [
('Seattle', -8, 0),
('Sydney', +11, 1),
('London', 0, 2),
('Tokyo', +9, 3)
]
lookup = {'Sun':'0','Mon':'1','Tues':'2','Wed':'3','Thur':'4','Fri':'5','Sat':'6'}
reverse_lookup = {'0':'Sunday','1':'Monday','2':'Tuesday','3':'Wednesday','4':'Thursday','5':'Friday','6':'Saturday'}
def find_y_pos(display_pos):
top_buffer = 60
y_gap = 230
title_pos = top_buffer + (y_gap * display_pos)
time_pos = title_pos + 90
day_pos = time_pos + 10
line_pos = time_pos - 15
position = {'title':title_pos, 'time': time_pos, 'day': day_pos, 'line':line_pos}
return position
def calculate_local_time(current_hour, current_minute, current_day, offset_hours):
total_hours = current_hour + offset_hours
days_to_add = total_hours // 24
local_hour = total_hours % 24
new_day = (current_day + days_to_add) % 7
return local_hour, current_minute, new_day
def get_batt_level():
current_voltage = bat.voltage() / 1000
max_voltage = 4.55
min_voltage = 3.00
batt_percent = round((current_voltage - min_voltage) / (max_voltage - min_voltage) * 100)
return batt_percent
BatteryLevel = M5TextBox(450, 10, "", lcd.FONT_DejaVu24, 0, rotate=0)
BatteryLevel.setText("100%")
SeattleTitle = M5TextBox(50, 60, "", lcd.FONT_DejaVu72, 0, rotate=0)
SeattleTitle.setText("Seattle")
SydneyTitle = M5TextBox(50, 260, "", lcd.FONT_DejaVu72, 0, rotate=0)
SydneyTitle.setText("Sydney")
LondonTitle = M5TextBox(50, 460, "", lcd.FONT_DejaVu72, 0, rotate=0)
LondonTitle.setText("London")
TokyoTitle = M5TextBox(50, 660, "", lcd.FONT_DejaVu72, 0, rotate=0)
TokyoTitle.setText("Tokyo")
Seattle = M5TextBox(50, 150, "", lcd.FONT_DejaVu56, 0, rotate=0)
Sydney = M5TextBox(50, 350, "", lcd.FONT_DejaVu56, 0, rotate=0)
London = M5TextBox(50, 550, "", lcd.FONT_DejaVu56, 0, rotate=0)
Tokyo = M5TextBox(50, 750, "", lcd.FONT_DejaVu56, 0, rotate=0)
SeattleDay = M5TextBox(250, 160, "", lcd.FONT_DejaVu40, 0, rotate=0)
SydneyDay = M5TextBox(250, 360, "", lcd.FONT_DejaVu40, 0, rotate=0)
LondonDay = M5TextBox(250, 560, "", lcd.FONT_DejaVu40, 0, rotate=0)
TokyoDay = M5TextBox(250, 760, "", lcd.FONT_DejaVu40, 0, rotate=0)
ntp = ntptime.client(host='au.pool.ntp.org', timezone=0)
rtc.set_datetime((int((ntp.year())), int((ntp.month())), int((ntp.day())), int((lookup[(ntp.weekday())])), int((ntp.hour())), int((ntp.minute())), int((ntp.second()))))
while True:
BatteryLevel.setText(str(get_batt_level())+"%")
for idx, city_info in enumerate(cities):
city_name, utc_offset, display_pos = city_info
local_hour, local_minute, new_day = calculate_local_time((rtc.datetime()[4]), (rtc.datetime()[5]), (rtc.datetime()[3]), utc_offset)
label_position = find_y_pos(display_pos)
if city_name == "Seattle":
formatted_time = "{:02d}:{:02d}".format(local_hour, local_minute)
SeattleTitle.setPosition(50, label_position.get('title'))
Seattle.setPosition(50, label_position.get('time'))
SeattleDay.setPosition(250, label_position.get('day'))
Seattle.setText(formatted_time)
SeattleDay.setText(str(reverse_lookup.get(str(new_day))))
SeattleLine = M5Line(M5Line.PLINE, 50, label_position.get('line'), 400, label_position.get('line'), 0)
elif city_name == "Sydney":
formatted_time = "{:02d}:{:02d}".format(local_hour, local_minute)
SydneyTitle.setPosition(50, label_position.get('title'))
Sydney.setPosition(50, label_position.get('time'))
SydneyDay.setPosition(250, label_position.get('day'))
Sydney.setText(formatted_time)
SydneyDay.setText(str(reverse_lookup.get(str(new_day))))
SydneyLine = M5Line(M5Line.PLINE, 50, label_position.get('line'), 400, label_position.get('line'), 0)
elif city_name == "London":
formatted_time = "{:02d}:{:02d}".format(local_hour, local_minute)
LondonTitle.setPosition(50, label_position.get('title'))
London.setPosition(50, label_position.get('time'))
LondonDay.setPosition(250, label_position.get('day'))
London.setText(formatted_time)
LondonDay.setText(str(reverse_lookup.get(str(new_day))))
LondonLine = M5Line(M5Line.PLINE, 50, label_position.get('line'), 400, label_position.get('line'), 0)
elif city_name == "Tokyo":
formatted_time = "{:02d}:{:02d}".format(local_hour, local_minute)
TokyoTitle.setPosition(50, label_position.get('title'))
Tokyo.setPosition(50, label_position.get('time'))
TokyoDay.setPosition(250, label_position.get('day'))
Tokyo.setText(formatted_time)
TokyoDay.setText(str(reverse_lookup.get(str(new_day))))
TokyoLine = M5Line(M5Line.PLINE, 50, label_position.get('line'), 400, label_position.get('line'), 0)
lcd.show()
wait(60)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment