from machine import Pin, ADC, Timer
import neopixel
import time
# Constants
BUTTON_PIN = 2
LED_PIN = 5
LED_COUNT = 16
BUZZER_PIN = 6
TIMER_SECONDS = 15 # Duration for each player's turn
# Setup
np = neopixel.NeoPixel(Pin(LED_PIN), LED_COUNT)
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
# Initial state
current_player = 0
player_colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] # Player colors
timer_start_time = None
timer_paused_time = None
def set_leds_color(color):
for i in range(LED_COUNT):
np[i] = color
np.write()
def display_timer(seconds_left):
if seconds_left < 0:
seconds_left = 0
leds_on = round((seconds_left / TIMER_SECONDS) * LED_COUNT)
for i in range(LED_COUNT):
if i < leds_on:
np[LED_COUNT - 1 - i] = (0, 128, 128) # Timer color
else:
np[LED_COUNT - 1 - i] = (0, 0, 0) # Off
np.write()
def update_timer():
global timer_start_time, current_player
if timer_start_time:
elapsed = time.ticks_diff(time.ticks_ms(), timer_start_time) // 1000
if elapsed >= TIMER_SECONDS:
# Timer finished, switch to next player
timer_start_time = None
current_player = (current_player + 1) % len(player_colors)
set_leds_color(player_colors[current_player])
else:
display_timer(TIMER_SECONDS - elapsed)
def button_pressed():
global timer_start_time, timer_paused_time, current_player
now = time.ticks_ms()
while button.value() == 0: # Wait for button release
if time.ticks_diff(time.ticks_ms(), now) > 2000: # Long press
current_player = (current_player + 1) % len(player_colors)
set_leds_color(player_colors[current_player])
timer_start_time = None
return
# Short press
if not timer_start_time: # Start or resume timer
timer_start_time = time.ticks_ms() - (timer_paused_time or 0)
timer_paused_time = None
else: # Pause timer
timer_paused_time = time.ticks_diff(time.ticks_ms(), timer_start_time)
timer_start_time = None
def main():
set_leds_color(player_colors[current_player]) # Show the first player's color
last_button_state = button.value()
while True:
current_button_state = button.value()
if current_button_state != last_button_state and current_button_state == 0:
button_pressed()
last_button_state = current_button_state
if timer_start_time:
update_timer()
time.sleep(0.1)
if __name__ == "__main__":
main()