24
|
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)
|