-
Notifications
You must be signed in to change notification settings - Fork 778
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding clock code for the digital clock with circuitpython project
- Loading branch information
1 parent
ae08e57
commit 21c0ae3
Showing
1 changed file
with
143 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries | ||
# SPDX-License-Identifier: MIT | ||
|
||
import time | ||
import board | ||
import simpleio | ||
import adafruit_ds3231 | ||
from adafruit_ticks import ticks_ms, ticks_add, ticks_diff | ||
from adafruit_ht16k33 import segments | ||
from adafruit_debouncer import Button | ||
from adafruit_seesaw import seesaw, rotaryio, digitalio | ||
|
||
# min and max display brightness range | ||
# value must be 0.0 to 1.0 | ||
max_brightness = 1 | ||
min_brightness = 0.01 | ||
# weekday hours to have clock on max brightness | ||
# (24-hour time) | ||
weekday_wakeup = 8 | ||
weekday_sleep = 21 | ||
# weekend hours to have clock on max brightness | ||
# (24-hour time) | ||
weekend_wakeup = 9 | ||
weekend_sleep = 23 | ||
|
||
i2c = board.STEMMA_I2C() | ||
|
||
rtc = adafruit_ds3231.DS3231(i2c) | ||
seesaw = seesaw.Seesaw(i2c, addr=0x36) | ||
seesaw.pin_mode(24, seesaw.INPUT_PULLUP) | ||
ss_pin = digitalio.DigitalIO(seesaw, 24) | ||
button = Button(ss_pin, long_duration_ms=1000) | ||
|
||
encoder = rotaryio.IncrementalEncoder(seesaw) | ||
last_position = 0 | ||
|
||
# pylint: disable-msg=using-constant-test | ||
if False: # change to True if you want to set the time! | ||
# year, mon, date, hour, min, sec, wday, yday, isdst | ||
t = time.struct_time((2024, 1, 25, 15, 7, 0, 3, -1, -1)) | ||
# you must set year, mon, date, hour, min, sec and weekday | ||
# yearday is not supported, isdst can be set but we don't do anything with it at this time | ||
print("Setting time to:", t) # uncomment for debugging | ||
rtc.datetime = t | ||
print() | ||
# pylint: enable-msg=using-constant-test | ||
|
||
display = segments.BigSeg7x4(i2c) | ||
|
||
display.fill(0) | ||
display.brightness = max_brightness | ||
|
||
display.colon = True | ||
|
||
def clock_conversion(h, m, set_brightness): | ||
# pylint: disable-msg=simplifiable-if-expression | ||
am_pm = False if h < 12 else True | ||
hour_12 = h if h <= 12 else h - 12 | ||
if hour_12 == 0: | ||
hour_12 = 12 | ||
display.print(f"{(hour_12):02}:{m:02}") | ||
display.ampm = am_pm | ||
if set_brightness: | ||
if awake_hours[0] <= h <= awake_hours[1] - 1: | ||
display.brightness = max_brightness | ||
elif h is awake_hours[0] - 1: | ||
bright = simpleio.map_range(m, 0, 59, min_brightness, max_brightness) | ||
display.brightness = bright | ||
elif h is awake_hours[1]: | ||
bright = simpleio.map_range(m, 0, 59, max_brightness, min_brightness) | ||
display.brightness = bright | ||
else: | ||
display.brightness = min_brightness | ||
else: | ||
display.brightness = max_brightness | ||
|
||
clock_clock = ticks_ms() | ||
clock_timer = 1 * 1000 | ||
clock_mode = True | ||
set_hour = True | ||
power_up = True | ||
hour = 0 | ||
minute = 0 | ||
|
||
while True: | ||
|
||
if clock_mode: | ||
button.update() | ||
if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: | ||
t = rtc.datetime | ||
if t.tm_wday in range(5, 6): | ||
awake_hours = [weekend_wakeup, weekend_sleep] | ||
else: | ||
awake_hours = [weekday_wakeup, weekday_sleep] | ||
if t.tm_sec < 1 or power_up: | ||
power_up = False | ||
clock_conversion(t.tm_hour, t.tm_min, True) | ||
clock_clock = ticks_add(clock_clock, clock_timer) | ||
else: | ||
button.update() | ||
position = -encoder.position | ||
if position != last_position: | ||
if position > last_position: | ||
if set_hour: | ||
hour = (hour + 1) % 24 | ||
else: | ||
minute = (minute + 1) % 60 | ||
else: | ||
if set_hour: | ||
hour = (hour - 1) % 24 | ||
else: | ||
minute = (minute - 1) % 60 | ||
clock_conversion(hour, minute, False) | ||
last_position = position | ||
if button.short_count: | ||
set_hour = not set_hour | ||
# toggling dots with not did not seem to work consistantly | ||
# so setting manually | ||
if set_hour: | ||
display.top_left_dot = True | ||
display.bottom_left_dot = False | ||
else: | ||
display.top_left_dot = False | ||
display.bottom_left_dot = True | ||
if button.long_press: | ||
if not clock_mode: | ||
t = rtc.datetime | ||
new_t = time.struct_time((t.tm_year, t.tm_mon, t.tm_mday, | ||
hour, minute, t.tm_sec, t.tm_wday, | ||
t.tm_yday, t.tm_isdst)) | ||
print("Setting time to:", new_t) | ||
rtc.datetime = new_t | ||
clock_clock = ticks_add(clock_clock, clock_timer) | ||
power_up = True | ||
display.top_left_dot = False | ||
display.bottom_left_dot = False | ||
else: | ||
set_hour = True | ||
t = rtc.datetime | ||
hour = t.tm_hour | ||
minute = t.tm_min | ||
clock_mode = not clock_mode | ||
display.blink_rate = not display.blink_rate |