view ub-timer/main.py @ 24:872d8155ed0c default tip

start ub-timer
author drewp@bigasterisk.com
date Tue, 24 Dec 2024 21:36:53 -0800
parents
children
line wrap: on
line source

'''
pin 11 = ws2812 ring
pin 39 = sw 4
pin 37 = sw 3
pin 35 = sw 2
pin 33 = sw 1
pin 40 = audio trigger 0
pin 38 = audio trigger 1
pin 36 = audio trigger 2
pin 34 = audio trigger 3

pdm run ampy -p /dev/ttyACM0 put ub-timer/ ./ && pdm run ampy -p /dev/ttyACM0 reset --hard
minicom -b 115200 -D /dev/ttyACM0
'''

import time
from machine import Pin
from neopixel import NeoPixel
import random

from colorsys_local import hsv_to_rgb


def rand_color():
    value = .1
    sat = 1
    hue = random.random()
    return tuple(int(x * 255) for x in hsv_to_rgb(hue, sat, value))


pin = Pin(11, Pin.OUT)
switch_pin = [
    Pin(33, Pin.IN, Pin.PULL_UP),
    Pin(35, Pin.IN, Pin.PULL_UP),
    Pin(37, Pin.IN, Pin.PULL_UP),
    Pin(39, Pin.IN, Pin.PULL_UP),
]
audio_trigger = [
    Pin(40, Pin.OUT, value=1),
    Pin(38, Pin.OUT, value=1),
    Pin(36, Pin.OUT, value=1),
    Pin(34, Pin.OUT, value=1),
]
song_duration = [
    121.47,
    2.16,
    1,
    1,
]
num_leds = 12
np = NeoPixel(pin, num_leds)
audio_start_ms = 1
audio_end_ms = 0
last_sw_pressed = [0, 0, 0, 0]


def startAudio(index, now):
    global audio_start_ms, audio_end_ms
    audio_trigger[index].value(0)
    audio_start_ms = now
    audio_end_ms = now + song_duration[index] * 1000
    for fr in range(num_leds):
        np[fr] = rand_color()
        np.write()
        time.sleep(.02)
    audio_trigger[index].value(1)


def rand_fill(start):
    for fr in range(num_leds):
        if fr > start:
            np[fr] = rand_color()
        else:
            np[fr] = (0, 0, 0)
    np.write()


def scan_buttons(now):
    for index in range(4):
        pressed = not switch_pin[index]()
        if pressed != last_sw_pressed[index]:
            last_sw_pressed[index] = pressed
            if pressed:
                startAudio(index, now)


def update_leds(now):
    frac = (now - audio_start_ms) / (audio_end_ms - audio_start_ms)
    if 0 < frac < 1:
        cur = max(0, min(11, int(frac * num_leds)))
        rand_fill(cur)
    else:
        np.fill((0, 0, 0))
        np.write()


while True:
    now = time.ticks_ms()
    update_leds(now)
    scan_buttons(now)
    time.sleep(.05)