Vor kurzem hatte ich die Idee für den Musikraum eine dynamische Beleuchtung zusammenzubauen. Das Resultat ist eine Beleuchtung mit drei Modi: Blitzer, Farbenwechsel und dynamischer Farbenwechsel nach Lautstärke.
Hier wird zum ansteuern der WS2812-LED-Matrix die Library
Adafruit_NeoPixel
verwendet.
Die Mappings des Potentiometers muss evtl. noch angepasst werden, ebenso die Empfindlichkeit des
Mikrofon-Moduls. Dafür ist ein Trim-Potentiometer auf dem Modul verantwortlich.
#include <Adafruit_NeoPixel.h>
#define PIN_LED_MATRIX 6
#define PIN_BUTTON 11
#define PIN_TE136_ANALOG A0
#define PIN_POTENTIOMETER A2
#define POTI_SENSITIVITY 5
#define LED_AMOUNT 64
#define LED_BRIGHTNESS 25
#define MODE_SOUND 0
#define MODE_COLOR 1
#define MODE_FLASH 2
bool isButtonPressed = false;
int potiValue = 0, oldPotiValue = 0, audioValue, myDelay = 0;
byte colorCount = 0, flash = 0, mode = MODE_SOUND, r, g, b;
uint32_t color, colors[6];
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LED_AMOUNT, PIN_LED_MATRIX, NEO_GRB + NEO_KHZ800);
void setup()
{
pinMode(PIN_TE136_ANALOG, INPUT);
pinMode(PIN_BUTTON, INPUT);
Serial.begin(9600);
pixels.begin();
colors[0] = pixels.Color(LED_BRIGHTNESS, 0, 0);
colors[1] = pixels.Color(0, LED_BRIGHTNESS, 0);
colors[2] = pixels.Color(0, 0, LED_BRIGHTNESS);
colors[3] = pixels.Color(LED_BRIGHTNESS, LED_BRIGHTNESS, 0);
colors[4] = pixels.Color(0, LED_BRIGHTNESS, LED_BRIGHTNESS);
colors[5] = pixels.Color(LED_BRIGHTNESS, 0, LED_BRIGHTNESS);
}
void loop()
{
switch (mode) {
case MODE_SOUND:
audioValue = analogRead(PIN_TE136_ANALOG);
if (audioValue > 500) {
color = colors[colorCount++ % 6];
}
myDelay = 5;
break;
case MODE_COLOR:
color = colors[colorCount++ % 6];
myDelay = map(oldPotiValue, 0, 1023, 35, 350);
break;
case MODE_FLASH:
if (flash++ % 2 == 1) {
color = pixels.Color(LED_BRIGHTNESS, LED_BRIGHTNESS, LED_BRIGHTNESS);
} else {
color = pixels.Color(0, 0, 0);
}
myDelay = map(oldPotiValue, 0, 1023, 10, 100);
break;
}
for (byte i = 0; i < LED_AMOUNT; i++) {
pixels.setPixelColor(i, color);
}
pixels.show();
delay(myDelay);
potiValue = analogRead(PIN_POTENTIOMETER);
if (abs(oldPotiValue - potiValue) >= POTI_SENSITIVITY) {
oldPotiValue = potiValue;
}
if (!isButtonPressed) {
if (digitalRead(PIN_BUTTON) == LOW) {
isButtonPressed = true;
mode++;
mode %= 3;
}
} else {
if (digitalRead(PIN_BUTTON) == HIGH) {
isButtonPressed = false;
}
}
}
zurück