import machine
import neopixel
import time
# Constants
LED_PIN = 12
BUTTON_PIN = 13
POTENTIOMETER_PIN = 4
LED_COUNT = 16
HOLD_TIME = 2 # Time in seconds to hold the button to skip to the next player
# Player colors (RGB tuples)
player_colors = [
(255, 0, 0), # Red
(0, 255, 0), # Green
(0, 0, 255), # Blue
(255, 255, 0) # Yellow
]
# Setup
np = neopixel.NeoPixel(machine.Pin(LED_PIN), LED_COUNT)
button = machine.Pin(BUTTON_PIN, machine.Pin.IN, machine.Pin.PULL_UP)
potentiometer = machine.ADC(machine.Pin(POTENTIOMETER_PIN))
current_player = 0
timer_active = False
start_time = 0
paused_time = 0
elapsed_time = 0
last_button_press_time = 0
last_leds_on = LED_COUNT
def show_player_color(player_index, leds_on):
global last_leds_on
if leds_on != last_leds_on:
color = player_colors[player_index]
for i in range(leds_on):
np[i] = color
for i in range(leds_on, LED_COUNT):
np[i] = (0, 0, 0)
np.write()
last_leds_on = leds_on # Update the last known LEDs on count
def update_timer():
global elapsed_time, timer_active, start_time
if timer_active:
current_time = time.time()
elapsed_time = current_time - start_time
if elapsed_time >= 20:
timer_active = False
elapsed_time = 0 # Reset elapsed time for a fresh start
show_player_color(current_player, LED_COUNT) # Reset display
else:
# Calculate how many LEDs to turn off based on the elapsed time
leds_off = int((elapsed_time / 20) * LED_COUNT)
leds_on = LED_COUNT - leds_off
show_player_color(current_player, leds_on)
def skip_to_next_player():
global current_player, start_time, elapsed_time
current_player = (current_player + 1) % len(player_colors)
start_time = time.time()
elapsed_time = 0
show_player_color(current_player, LED_COUNT)
def check_button():
global last_button_press_time, timer_active, start_time, paused_time, elapsed_time
current_time = time.time()
if not button.value(): # Button is pressed
if last_button_press_time == 0 or (current_time - last_button_press_time) > 0.2: # Debounce the button
last_button_press_time = current_time
if not timer_active:
if paused_time > 0:
# Resume the timer from where it was paused
start_time = current_time - elapsed_time
paused_time = 0
else:
# Start the timer from the beginning
start_time = current_time
elapsed_time = 0
timer_active = True
else:
# Pause the timer
paused_time = current_time
timer_active = False
else:
last_button_press_time = 0 # Reset last button press time when button is released
def divide_ring_into_segments(num_players):
segment_length = LED_COUNT // len(player_colors)
for i in range(len(player_colors)):
color = player_colors[i]
for j in range(segment_length * i, min(segment_length * (i + 1), num_players * segment_length)):
np[j] = color
for i in range(num_players * segment_length, LED_COUNT):
np[i] = (0, 0, 0)
np.write()
def main():
global timer_active
while True:
if not timer_active:
# Only allow player color selection if the timer is not active
num_players = int(potentiometer.read() / 256) + 1
divide_ring_into_segments(num_players)
check_button()
update_timer()
time.sleep(0.1)
if __name__ == "__main__":
main()