Skip to content

Commit

Permalink
adding clock code
Browse files Browse the repository at this point in the history
Adding clock code for the digital clock with circuitpython project
  • Loading branch information
BlitzCityDIY committed Feb 9, 2024
1 parent ae08e57 commit 21c0ae3
Showing 1 changed file with 143 additions and 0 deletions.
143 changes: 143 additions & 0 deletions Digital_Clock_with_CircuitPython/code.py
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

0 comments on commit 21c0ae3

Please sign in to comment.