Adafruit_Learning_System_Gu.../CircuitPython_Simple_Wordclock/code.py
2022-02-22 15:38:21 -05:00

163 lines
4.7 KiB
Python

# SPDX-FileCopyrightText: 2019 Anne Barela for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# Vertical Word Clock using the Adafruit Feather M4 and
# the Adafruit DS3231 real-time clock FeatherWing
import time
import board
import busio as io
import digitalio
import adafruit_ds3231
import neopixel
i2c = io.I2C(board.SCL, board.SDA)
# Create the RTC instance:
rtc = adafruit_ds3231.DS3231(i2c)
# Set up Feather M4 onboard LED for output
LED13 = digitalio.DigitalInOut(board.D13)
LED13.direction = digitalio.Direction.OUTPUT
# Set digital 6 as an input for slide switch
Slide_Switch = digitalio.DigitalInOut(board.D6)
Slide_Switch.switch_to_input(pull=digitalio.Pull.UP)
pixel_pin = board.D5
num_pixels = 21
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=1.0,
auto_write=False)
pixels.fill((0, 0, 0)) # Blanking Display
COLOR = (0, 200, 0) # Green for time later in code
# Bitmap values for each value. These can be OR'ed together
THREE = 1
EIGHT = 1 << 1
ELEVEN = 1 << 2
TWO = 1 << 3
SIX = 1 << 4
FOUR = 1 << 5
SEVEN = 1 << 6
NOON = 1 << 7
TEN = 1 << 8
ONE = 1 << 9
FIVE = 1 << 10
MIDNIGHT = 1 << 11
NINE = 1 << 12
PAST = 1 << 13
TO = 1 << 14
FIVEMIN = 1 << 15
QUARTER = 1 << 16
TENMIN = 1 << 17
HALF = 1 << 18
TWENTY = 1 << 19
# Pass in hour and minute, return LED bitmask
# pylint: disable=too-many-branches
# pylint: disable=too-many-statements
def writetime(the_hr, the_min):
value = 0 # Start with zero, which is no words
if (the_hr == 24) and (the_min == 0): # Special cases: Midnight and Noon
return MIDNIGHT
if (the_hr == 12) and (the_min == 0):
return NOON
# set minute
if (the_min > 3) and (the_min < 8):
value = value | FIVEMIN
if (the_min > 7) and (the_min < 13):
value = value | TENMIN
if (the_min > 12) and (the_min < 18):
value = value | QUARTER
if (the_min > 17) and (the_min < 23):
value = value | TWENTY
if (the_min > 22) and (the_min < 28):
value = value | TWENTY | FIVEMIN
if (the_min > 27) and (the_min < 33):
value = value | HALF
if (the_min > 32) and (the_min < 38):
value = value | TWENTY | FIVEMIN
if (the_min > 37) and (the_min < 43):
value = value | TWENTY
if (the_min > 42) and (the_min < 48):
value = value | QUARTER
if (the_min > 47) and (the_min <= 53):
value = value | TENMIN
if the_min >= 54:
value = value | FIVEMIN
# before or after
if (the_min > 3) and (the_min <= 32):
value = value | PAST
if the_min >= 33:
the_hr = the_hr + 1 # for the TO case
value = value | TO
# set hour
if the_hr > 12:
the_hr = the_hr - 12 # Convert 24 hour format to 12 hour
if the_hr == 1:
value = value | ONE
if the_hr == 2:
value = value | TWO
if the_hr == 3:
value = value | THREE
if the_hr == 4:
value = value | FOUR
if the_hr == 5:
value = value | FIVE
if the_hr == 6:
value = value | SIX
if the_hr == 7:
value = value | SEVEN
if the_hr == 8:
value = value | EIGHT
if the_hr == 9:
value = value | NINE
if the_hr == 10:
value = value | TEN
if the_hr == 11:
value = value | ELEVEN
if the_hr == 0:
value = value | MIDNIGHT
if the_hr == 12:
value = value | NOON
return value
# end def
# pylint: enable=too-many-branches
# pylint: enable=too-many-statements
# Main loop
LEDstate = 0
Write_Now = True
while True:
t = rtc.datetime
# print("The date is {} {}/{}/{}".format(days[int(t.tm_wday)],
# t.tm_mday, t.tm_mon, t.tm_year))
# print("The time is {}:{:02}:{:02}".format(t.tm_hour, t.tm_min, t.tm_sec))
hour = t.tm_hour
if not Slide_Switch.value: # Slide switch activate = Daylight savings
# print("Switch detected for daylight savings")
if hour == 24:
hour = 1
else:
hour += 1
Write_Now = True # Trigger a write
minute = t.tm_min
second = t.tm_sec
if second == 59 or Write_Now:
# print("The time is {}:{:02}".format(t.tm_hour, t.tm_min))
pixels.fill((0, 0, 0)) # blank all pixels for change
the_time = writetime(hour, minute)
for i in range(0, 21): # Check all bits
if the_time & 1 << i: # If the bit is true
pixels[i+1] = COLOR # set pixel on (shift up 2 for buried one)
pixels.show()
if LEDstate == 0: # Flash the D13 LED every other second for activity
LED13.value = True
LEDstate = 1
else:
LED13.value = False
LEDstate = 0
Write_Now = False
time.sleep(1) # wait a second