Mercurial > code > home > repos > micro
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) |