timer-bar/colorbar-sleep.py

136 lines
4.6 KiB
Python

import time
import board
import neopixel
####
# Neopixel setup
# Set Constants
pixel_pin = board.GP5
num_pixels = 144
brightness = 0.1
# Create neopixel object named pixels
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness = brightness, auto_write=False, pixel_order="GRBW")
# Colors used in this script
# FORMAT: (R, G, B, W)
RED = (255, 0, 0, 0)
YELLOW = (255, 150, 0, 0)
GREEN = (0, 255, 0, 0)
BLANK = (0, 0, 0, 0)
# Turn all pixels off
pixels.fill(BLANK)
pixels.show()
# END Neopixel setup
####
# Count down from the given total seconds, using the chosen
# colormode (how the colors are filled into each pixel),
# and the given yellowtime (seconds before timer has elapsed
# that the bar should show yellow), and redtime (same as
# yellowtime). The colormode determines what happens at
# yellowtime and redtime.
def countdown(seconds, colormode="fill", yellowtime=120, redtime=60):
# Turn all pixels off
pixels.fill(BLANK)
pixels.show()
# Init the loop tracking variable
elapsed_seconds = 0
# Pre-calculate rtime and ytime
rtime = seconds - redtime
ytime = seconds - yellowtime
# Loop until timer has expired
while elapsed_seconds <= seconds:
# Convert the elapsed time into a percentage
percent_complete = elapsed_seconds / seconds
# Convert the percentage complete to percentage of num_pixels,
# rounded to the nearest integer.
pixels_to_light = round(percent_complete * num_pixels)
# Loop once for every pixel that should be lit in our progress bar.
# The logic contained within will determine what color the pixel
# in question is set to.
for i in range(pixels_to_light):
# Set the current pixel in the loop to the appropriate color
# based on the selected colormode
if colormode == "fill":
# Fill the entire elapsed bar with GREEN, YELLOW, or RED
# based on the specified yellowtime and redtime.
# Decide what to do based on whether
# redtime or yellowtime has been reached
if elapsed_seconds >= rtime:
# When redtime has been reached
# Set all pixels that should be lit to RED
pixels[i] = RED
elif elapsed_seconds >= ytime:
# When yellowtime has been reached
# Set all pixels that should be lit to YELLOW
pixels[i] = YELLOW
else:
# When neither yellowtime or redtime has been reached yet
# Set all pixels that should be lit to GREEN
pixels[i] = GREEN
elif colormode == "candybar":
# Turn on only the next pixel with the appropriate color. Leave
# all pixels that have already been written alone
if pixels[i] == BLANK:
# If the pixel hasn't had any value written to it already
if elapsed_seconds >= rtime:
# When redtime has been reached
# Set just the next pixel or group of pixels to RED
pixels[i] = RED
elif elapsed_seconds >= ytime:
# When yellowtime has been reached
# Set just the next pixel or group of pixels to YELLOW
pixels[i] = YELLOW
else:
# When neither yellowtime or redtime has been reached yet
# Set just the next pixel or group of pixels to GREEN
pixels[i] = GREEN
else:
# If the pixel has already been written to before this point
# Do nothing
pass
else:
# Invalid colormodes end up here
raise Exception("Invalid colormode: " + colormode)
# Display the result IRL
pixels.show()
# Sleep for 1 second
time.sleep(1)
# Increment the tracking variable
elapsed_seconds += 1