zurück zur Übersicht...
29.03.2019

Party-Beleuchtung

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.

Verwendete Bauteile

Aufbau

Schaltplan der Partybeleuchtung
Aufbau der Partybeleuchtung mit Breadboard
Abb.: Aufbau der Partybeleuchtung mit Breadboard

Sketch

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 Trimpotetiometer 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;
        }
    }
}