Adafruit_Learning_System_Gu.../CircuitPython_Sound_Box_2/code.py
Noe Ruiz 8de5b7a9fe update soundbox code and sounds
updating soundbox code and sounds
2024-06-10 15:40:43 -04:00

102 lines
3 KiB
Python
Executable file

# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import time
import os
import random
import board
from digitalio import DigitalInOut, Direction
import neopixel
import audiocore
import audiobusio
import keypad
import adafruit_lis3dh
from rainbowio import colorwheel
# enable external power pin
# provides power to the external components
external_power = DigitalInOut(board.EXTERNAL_POWER)
external_power.direction = Direction.OUTPUT
external_power.value = True
# external neopixels
num_pixels = 24
pixels = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels, brightness=0.4, auto_write=True)
delta_hue = 256//num_pixels
speed = 10 # higher numbers = faster rainbow spinning
i=0
# external button
switch = keypad.Keys((board.EXTERNAL_BUTTON,), value_when_pressed=False, pull=True)
colors = [
{'label': "BLUE", 'color': 0x0000FF},
{'label': "RED", 'color': 0xFF0000},
{'label': "GREEN", 'color': 0x00FF00},
{'label': "YELLOW", 'color': 0xFFFF00},
{'label': "AQUA", 'color': 0x00FFFF},
{'label': "PURPLE", 'color': 0xFF00FF},
{'label': "PINK", 'color': 0xFF0055},
{'label': "ORANGE", 'color': 0xFF5500},
{'label': "WHITE", 'color': 0x555555},
]
shake_wavs = []
color_wavs = []
for filename in os.listdir('/wavs'):
if filename.lower().endswith('.wav') and not filename.startswith('.'):
if "SHAKE" in filename:
shake_wavs.append("/wavs/" + filename)
else:
for color in colors:
if color['label'] in filename:
color_wavs.append("/wavs/" + filename)
break
audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA)
num_colors = len(color_wavs)
num_shakes = len(shake_wavs)
wav_index = 0
def open_audio(num, wavs):
n = wavs[num]
f = open(n, "rb")
w = audiocore.WaveFile(f)
# wn = wav_names[num]
return w, n
wave, wave_name = open_audio(wav_index, color_wavs)
i2c = board.I2C()
int1 = DigitalInOut(board.ACCELEROMETER_INTERRUPT)
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
lis3dh.range = adafruit_lis3dh.RANGE_2_G
while True:
event = switch.events.get()
if event:
if event.pressed:
wave, wave_name = open_audio(random.randint(0, num_colors - 1), color_wavs)
audio.play(wave)
for color in colors:
if color['label'] in wave_name:
pixels.fill(color['color'])
else:
pass
time.sleep(1)
pixels.fill((0, 0, 0))
print('pressed')
if event.released:
pass
if lis3dh.shake(shake_threshold=12):
wave, wave_name = open_audio(random.randint(0, num_shakes - 1), shake_wavs)
audio.play(wave)
for l in range(len(pixels)):
pixels[l] = colorwheel( int(i*speed + l * delta_hue) % 255 )
pixels.show()
time.sleep(1)
pixels.fill((0, 0, 0))
print('shake')