LedBars/RpiLedBars/main.py
2020-08-07 00:26:40 +02:00

75 lines
1.9 KiB
Python

#! /usr/bin/env python3
import alsaaudio
import audioop
import board
import math
import neopixel
import time
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
r = g = b = 0
elif pos < 85:
r = int(pos * 3)
g = int(255 - pos * 3)
b = 0
elif pos < 170:
pos -= 85
r = int(255 - pos * 3)
g = 0
b = int(pos * 3)
else:
pos -= 170
r = 0
g = int(pos * 3)
b = int(255 - pos * 3)
return (r, g, b)
def exec_neopixel(pixels, max):
for i in range(0, max):
pixels[i] = wheel(i * 255 / 300)
# pixels.show()
for i in range(max, 300):
pixels[i] = (0, 0, 0)
pixels.show()
def exec_audio():
lo = 1E6
hi = 5E8
log_lo = math.log(lo)
log_hi = math.log(hi)
print(alsaaudio.pcms(alsaaudio.PCM_CAPTURE))
pixels = neopixel.NeoPixel(board.D12, 300, brightness=0.1, auto_write=False)
pixels[0] = (100, 0, 0)
audioIn = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE, mode=alsaaudio.PCM_NORMAL, rate=48000, channels=1, format=alsaaudio.PCM_FORMAT_S32_LE, periodsize=640, device='plughw:CARD=sndrpii2scard,DEV=0')
while True:
length, data = audioIn.read()
if length > 0:
max_amp = max(audioop.max(data, 4), 1)
log_max = math.log(float(max_amp))
vu = (log_max - log_lo) / (log_hi - log_lo)
led_nb = min(max(int(vu*300),0),299)
print("max =", max_amp, ", log =", log_max, "vu = ", vu, "led =", led_nb)
exec_neopixel(pixels, led_nb)
def test_neopixel():
pixels = neopixel.NeoPixel(board.D12, 300, brightness=0.1, auto_write=False)
for i in range(0, 300):
print("Lighting", i)
pixels[i] = (100, 0, 0)
pixels.show()
input()
def main():
# test_neopixel()
exec_audio()
if __name__ == "__main__":
main()