comparison 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
comparison
equal deleted inserted replaced
23:8614a627888e 24:872d8155ed0c
1 '''
2 pin 11 = ws2812 ring
3 pin 39 = sw 4
4 pin 37 = sw 3
5 pin 35 = sw 2
6 pin 33 = sw 1
7 pin 40 = audio trigger 0
8 pin 38 = audio trigger 1
9 pin 36 = audio trigger 2
10 pin 34 = audio trigger 3
11
12 pdm run ampy -p /dev/ttyACM0 put ub-timer/ ./ && pdm run ampy -p /dev/ttyACM0 reset --hard
13 minicom -b 115200 -D /dev/ttyACM0
14 '''
15
16 import time
17 from machine import Pin
18 from neopixel import NeoPixel
19 import random
20
21 from colorsys_local import hsv_to_rgb
22
23
24 def rand_color():
25 value = .1
26 sat = 1
27 hue = random.random()
28 return tuple(int(x * 255) for x in hsv_to_rgb(hue, sat, value))
29
30
31 pin = Pin(11, Pin.OUT)
32 switch_pin = [
33 Pin(33, Pin.IN, Pin.PULL_UP),
34 Pin(35, Pin.IN, Pin.PULL_UP),
35 Pin(37, Pin.IN, Pin.PULL_UP),
36 Pin(39, Pin.IN, Pin.PULL_UP),
37 ]
38 audio_trigger = [
39 Pin(40, Pin.OUT, value=1),
40 Pin(38, Pin.OUT, value=1),
41 Pin(36, Pin.OUT, value=1),
42 Pin(34, Pin.OUT, value=1),
43 ]
44 song_duration = [
45 121.47,
46 2.16,
47 1,
48 1,
49 ]
50 num_leds = 12
51 np = NeoPixel(pin, num_leds)
52 audio_start_ms = 1
53 audio_end_ms = 0
54 last_sw_pressed = [0, 0, 0, 0]
55
56
57 def startAudio(index, now):
58 global audio_start_ms, audio_end_ms
59 audio_trigger[index].value(0)
60 audio_start_ms = now
61 audio_end_ms = now + song_duration[index] * 1000
62 for fr in range(num_leds):
63 np[fr] = rand_color()
64 np.write()
65 time.sleep(.02)
66 audio_trigger[index].value(1)
67
68
69 def rand_fill(start):
70 for fr in range(num_leds):
71 if fr > start:
72 np[fr] = rand_color()
73 else:
74 np[fr] = (0, 0, 0)
75 np.write()
76
77
78 def scan_buttons(now):
79 for index in range(4):
80 pressed = not switch_pin[index]()
81 if pressed != last_sw_pressed[index]:
82 last_sw_pressed[index] = pressed
83 if pressed:
84 startAudio(index, now)
85
86
87 def update_leds(now):
88 frac = (now - audio_start_ms) / (audio_end_ms - audio_start_ms)
89 if 0 < frac < 1:
90 cur = max(0, min(11, int(frac * num_leds)))
91 rand_fill(cur)
92 else:
93 np.fill((0, 0, 0))
94 np.write()
95
96
97 while True:
98 now = time.ticks_ms()
99 update_leds(now)
100 scan_buttons(now)
101 time.sleep(.05)