152 lines
3.7 KiB
Python
152 lines
3.7 KiB
Python
import time
|
|
import machine
|
|
from picographics import PicoGraphics, DISPLAY_TUFTY_2040
|
|
|
|
rtc = machine.RTC()
|
|
display = PicoGraphics(display=DISPLAY_TUFTY_2040)
|
|
|
|
# Tufty constants.
|
|
A = 7
|
|
B = 8
|
|
C = 15
|
|
UP = 22
|
|
DOWN = 6
|
|
LED = 25
|
|
|
|
WIDTH, HEIGHT = display.get_bounds()
|
|
display.set_backlight(1.0)
|
|
|
|
# Buttons
|
|
button_a = machine.Pin(A, machine.Pin.IN)
|
|
button_b = machine.Pin(B, machine.Pin.IN)
|
|
button_c = machine.Pin(C, machine.Pin.IN)
|
|
button_up = machine.Pin(UP, machine.Pin.IN)
|
|
button_down = machine.Pin(DOWN, machine.Pin.IN)
|
|
|
|
WHITE = display.create_pen(255, 255, 255)
|
|
BLACK = display.create_pen(0, 0, 0)
|
|
|
|
PINK = display.create_pen(214, 28, 78)
|
|
ORANGE_1 = display.create_pen(247, 126, 33)
|
|
ORANGE_2 = display.create_pen(250, 194, 19)
|
|
|
|
cursors = ["hour", "minute"]
|
|
set_clock = False
|
|
cursor = 0
|
|
last = 0
|
|
|
|
|
|
def days_in_month(month, year):
|
|
if month == 2 and ((year % 4 == 0 and year % 100 != 0) or year % 400 == 0):
|
|
return 29
|
|
return (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[month - 1]
|
|
|
|
|
|
# Button handling function
|
|
def button(pin):
|
|
global last, set_clock, cursor, year, month, day, hour, minute
|
|
|
|
time.sleep(0.01)
|
|
if not pin.value():
|
|
return
|
|
|
|
if button_a.value() and button_c.value():
|
|
machine.reset()
|
|
|
|
adjust = 0
|
|
changed = False
|
|
|
|
if pin == button_b:
|
|
set_clock = not set_clock
|
|
changed = True
|
|
if not set_clock:
|
|
rtc.datetime((year, month, day, 0, hour, minute, second, 0))
|
|
|
|
if set_clock:
|
|
if pin == button_c:
|
|
cursor += 1
|
|
cursor %= len(cursors)
|
|
|
|
if pin == button_a:
|
|
cursor -= 1
|
|
cursor %= len(cursors)
|
|
|
|
if pin == button_up:
|
|
adjust = 1
|
|
|
|
if pin == button_down:
|
|
adjust = -1
|
|
|
|
if cursors[cursor] == "hour":
|
|
hour += adjust
|
|
hour %= 24
|
|
if cursors[cursor] == "minute":
|
|
minute += adjust
|
|
minute %= 60
|
|
|
|
if set_clock or changed:
|
|
draw_clock()
|
|
|
|
|
|
# Register the button handling function with the buttons
|
|
button_down.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
|
|
button_up.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
|
|
button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
|
|
button_b.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
|
|
button_c.irq(trigger=machine.Pin.IRQ_RISING, handler=button)
|
|
|
|
|
|
def draw_clock():
|
|
|
|
display.set_pen(WHITE)
|
|
display.clear()
|
|
|
|
hr = "{:02}".format(hour)
|
|
min = "{:02}".format(minute)
|
|
sec = "{:02}".format(second)
|
|
|
|
hr_width = display.measure_text(hr, 1)
|
|
hr_offset = 15
|
|
|
|
minute_width = display.measure_text(min, 1)
|
|
minute_offset = 15
|
|
|
|
second_width = display.measure_text(sec, 1)
|
|
second_offset = 5
|
|
|
|
display.set_pen(PINK)
|
|
display.rectangle(10, 10, (hour * 13), 60)
|
|
display.set_pen(ORANGE_1)
|
|
display.rectangle(10, 85, (minute * 5), 60)
|
|
display.set_pen(ORANGE_2)
|
|
display.rectangle(10, 160, (second * 5), 60)
|
|
|
|
display.set_pen(WHITE)
|
|
display.text(hr, (hour * 13) - hr_width - hr_offset, 45, 10, 3)
|
|
display.text(min, (minute * 5) - minute_width - minute_offset, 120, 10, 3)
|
|
display.text(sec, (second * 5) - second_width - second_offset, 202, 10, 2)
|
|
|
|
display.set_pen(BLACK)
|
|
|
|
if set_clock:
|
|
|
|
if cursors[cursor] == "hour":
|
|
display.line(5, 10, 5, 70)
|
|
if cursors[cursor] == "minute":
|
|
display.line(5, 85, 5, 145)
|
|
|
|
display.update()
|
|
|
|
|
|
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
|
|
|
|
last_second = second
|
|
|
|
while True:
|
|
if not set_clock:
|
|
year, month, day, wd, hour, minute, second, _ = rtc.datetime()
|
|
if second != last_second:
|
|
draw_clock()
|
|
last_second = second
|
|
time.sleep(0.01)
|