Adafruit_Learning_System_Gu.../Clue_Step_Counter/code.py
2022-02-22 15:24:56 -05:00

185 lines
5.7 KiB
Python

# SPDX-FileCopyrightText: 2020 Liz Clark for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import time
import board
import displayio
from adafruit_clue import clue
from simpleio import map_range
from adafruit_bitmap_font import bitmap_font
from adafruit_lsm6ds.lsm6ds33 import LSM6DS33
from adafruit_lsm6ds import Rate, AccelRange
from adafruit_progressbar.progressbar import ProgressBar
from adafruit_display_text.label import Label
# turns off onboard NeoPixel to conserve battery
clue.pixel.brightness = (0.0)
# accessing the Clue's accelerometer
sensor = LSM6DS33(board.I2C())
# step goal
step_goal = 10000
# onboard button states
a_state = False
b_state = False
# array to adjust screen brightness
bright_level = [0, 0.5, 1]
countdown = 0 # variable for the step goal progress bar
clock = 0 # variable used to keep track of time for the steps per hour counter
clock_count = 0 # holds the number of hours that the step counter has been running
clock_check = 0 # holds the result of the clock divided by 3600 seconds (1 hour)
last_step = 0 # state used to properly counter steps
mono = time.monotonic() # time.monotonic() device
mode = 1 # state used to track screen brightness
steps_log = 0 # holds total steps to check for steps per hour
steps_remaining = 0 # holds the remaining steps needed to reach the step goal
sph = 0 # holds steps per hour
# variables to hold file locations for background and fonts
clue_bgBMP = "/clue_bgBMP.bmp"
small_font = "/fonts/Roboto-Medium-16.bdf"
med_font = "/fonts/Roboto-Bold-24.bdf"
big_font = "/fonts/Roboto-Black-48.bdf"
# glyphs for fonts
glyphs = b'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-,.: '
# loading bitmap fonts
small_font = bitmap_font.load_font(small_font)
small_font.load_glyphs(glyphs)
med_font = bitmap_font.load_font(med_font)
med_font.load_glyphs(glyphs)
big_font = bitmap_font.load_font(big_font)
big_font.load_glyphs(glyphs)
# creating display and default brightness
clue_display = board.DISPLAY
clue_display.brightness = 0.5
# graphics group
clueGroup = displayio.Group()
# loading bitmap background
# CircuitPython 6 & 7 compatible
clue_bg = displayio.OnDiskBitmap(open(clue_bgBMP, "rb"))
clue_tilegrid = displayio.TileGrid(
clue_bg, pixel_shader=getattr(clue_bg, 'pixel_shader', displayio.ColorConverter())
)
clueGroup.append(clue_tilegrid)
# # CircuitPython 7+ compatible
# clue_bg = displayio.OnDiskBitmap(clue_bgBMP)
# clue_tilegrid = displayio.TileGrid(clue_bg, pixel_shader=clue_bg.pixel_shader)
# clueGroup.append(clue_tilegrid)
# creating the ProgressBar object
bar_group = displayio.Group()
prog_bar = ProgressBar(1, 1, 239, 25, bar_color=0x652f8f)
bar_group.append(prog_bar)
clueGroup.append(bar_group)
# text for step goal
steps_countdown = Label(small_font, text='%d Steps Remaining' % step_goal, color=clue.WHITE)
steps_countdown.x = 55
steps_countdown.y = 12
# text for steps
text_steps = Label(big_font, text="0 ", color=0xe90e8b)
text_steps.x = 45
text_steps.y = 70
# text for steps per hour
text_sph = Label(med_font, text=" -- ", color=0x29abe2)
text_sph.x = 8
text_sph.y = 195
# adding all text to the display group
clueGroup.append(text_sph)
clueGroup.append(steps_countdown)
clueGroup.append(text_steps)
# sending display group to the display at startup
clue_display.show(clueGroup)
# setting up the accelerometer and pedometer
sensor.accelerometer_range = AccelRange.RANGE_2G
sensor.accelerometer_data_rate = Rate.RATE_26_HZ
sensor.gyro_data_rate = Rate.RATE_SHUTDOWN
sensor.pedometer_enable = True
while True:
# button debouncing
if not clue.button_a and not a_state:
a_state = True
if not clue.button_b and not b_state:
b_state = True
# setting up steps to hold step count
steps = sensor.pedometer_steps
# creating the data for the ProgressBar
countdown = map_range(steps, 0, step_goal, 0.0, 1.0)
# actual counting of the steps
# if a step is taken:
if abs(steps-last_step) > 1:
step_time = time.monotonic()
# updates last_step
last_step = steps
# updates the display
text_steps.text = '%d' % steps
clock = step_time - mono
# logging steps per hour
if clock > 3600:
# gets number of hours to add to total
clock_check = clock / 3600
# logs the step count as of that hour
steps_log = steps
# adds the hours to get a new hours total
clock_count += round(clock_check)
# divides steps by hours to get steps per hour
sph = steps_log / clock_count
# adds the sph to the display
text_sph.text = '%d' % sph
# resets clock to count to the next hour again
clock = 0
mono = time.monotonic()
# adjusting countdown to step goal
prog_bar.progress = float(countdown)
# displaying countdown to step goal
if step_goal - steps > 0:
steps_remaining = step_goal - steps
steps_countdown.text = '%d Steps Remaining' % steps_remaining
else:
steps_countdown.text = 'Steps Goal Met!'
# adjusting screen brightness, a button decreases brightness
if clue.button_a and a_state:
mode -= 1
a_state = False
if mode < 0:
mode = 0
clue_display.brightness = bright_level[mode]
else:
clue_display.brightness = bright_level[mode]
# b button increases brightness
if clue.button_b and b_state:
mode += 1
b_state = False
if mode > 2:
mode = 2
clue_display.brightness = bright_level[mode]
else:
clue_display.brightness = bright_level[mode]
time.sleep(0.001)