pimoroni-pico/micropython/examples/tufty2040/clock.py

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)