import machine
import neopixel
import time
# Constants
LED_PIN = 12
BUTTON_PIN = 13
POTENTIOMETER_PIN = 4
LED_COUNT = 16
# 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))
timer_active = False
start_time = 0
elapsed_time = 0
last_button_press_time = 0
current_player = 0 # Index of the current player
def show_player_colors(num_players):
segment_length = LED_COUNT // num_players
remainder_leds = LED_COUNT % num_players # Calculate remainder to distribute any extra LEDs evenly
start_index = 0
for i in range(num_players):
color = player_colors[i % len(player_colors)]
end_index = start_index + segment_length + (1 if i < remainder_leds else 0) # Add extra LED to some segments if needed
for j in range(start_index, end_index):
np[j] = color
start_index = end_index
np.write()
def update_timer(num_players):
global elapsed_time, timer_active, start_time, current_player
if timer_active:
current_time = time.time()
elapsed_time = current_time - start_time
if elapsed_time >= 20:
elapsed_time = 0 # Reset elapsed time
current_player = (current_player + 1) % num_players # Move to the next player
timer_active = False
show_player_colors(num_players) # Reset to show all players colors
else:
leds_on = LED_COUNT - int((elapsed_time / 20) * LED_COUNT)
player_segment_start = int((current_player * LED_COUNT) / num_players)
player_segment_end = int(((current_player + 1) * LED_COUNT) / num_players)
for i in range(LED_COUNT):
if player_segment_start <= i < player_segment_end:
np[i] = player_colors[current_player] if i < player_segment_start + leds_on else (0, 0, 0)
else:
np[i] = player_colors[i // (LED_COUNT // num_players)] # Maintain other colors
np.write()
def check_button():
global last_button_press_time, timer_active, start_time, elapsed_time
current_time = time.time()
if not button.value() and current_time - last_button_press_time > 0.5: # Simple debounce logic
last_button_press_time = current_time
if timer_active:
timer_active = False # Pause the timer
else:
if elapsed_time >= 20:
elapsed_time = 0 # Ensure timer is reset if it had previously finished
start_time = current_time - elapsed_time # Start or resume the timer
timer_active = True
def main():
last_num_players = 0
while True:
# Adjust number of players based on potentiometer reading
num_players = max(1, int(potentiometer.read() / 4096 * 4) + 1) # Scale from 1 to 4 players
global current_player
current_player = num_players - 1 # Adjust current player index based on the number of players
if num_players != last_num_players:
show_player_colors(num_players)
last_num_players = num_players
check_button()
if timer_active:
update_timer(num_players)
time.sleep(0.1)
if __name__ == "__main__":
main()