Partylicht

Allgemeines

Auf der LED-Matrix sollen umso mehr LEDs leuchten, je lauter der Ton ist, der vom Mikrofon aufgezeichnet wird.
Überprüfe vor dem Start noch einmal die Verkabelung:

Programmcode

zurück

#include <Adafruit_NeoPixel.h>

// Mikrofon-Pin
const int MIC_PIN = A0;

// Pin für die WS2812 LEDs
#define DATA_PIN 13

// Anzahl der LEDs in der Matrix
#define NUM_LEDS 40

// Erstellen eines NeoPixel-Objekts
Adafruit_NeoPixel matrix = Adafruit_NeoPixel(NUM_LEDS, DATA_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  matrix.begin();           // Initialisieren der NeoPixel-Matrix
  matrix.show();            // Alle LEDs ausschalten
  Serial.begin(9600);      // Serielle Kommunikation starten
  randomSeed(analogRead(0)); // Zufallsgenerator initialisieren
}

// Verbesserte Funktion zum Auslesen des Mikrofon-Levels

int readMicLevel(int max) {
 
  unsigned long startMillis = millis();
  unsigned int peakToPeak = 0;
  unsigned int signalMax = 0;
  unsigned int signalMin = 4096;
  // 50 ms lang messen
  while (millis() - startMillis < 50) {
    int sample = analogRead(MIC_PIN);
    if (sample < 4096) {
      if (sample > signalMax) {
        signalMax = sample;
      } else if (sample < signalMin) {
        signalMin = sample;
      }
    }
  }
 
 
  peakToPeak = signalMax - signalMin;
 // Serial.print(peakToPeak);
 // Serial.print(" ");
  const int maxInput = 2500;
  const int schwelle = 400;
  peakToPeak=constrain(peakToPeak,schwelle,maxInput)-schwelle;
 // Serial.print(peakToPeak);
 // Serial.print(" ");
 
 
  int mapped = map(peakToPeak, 0, maxInput-schwelle, 0, max);
 // Serial.println(mapped);
  return mapped;
}

void loop() {
  int micValue = readMicLevel(1023); 
  Serial.print(micValue);
  Serial.print(": ");
  
   // Mikrofonwert lesen
  int ledCount = map(micValue, 0, 1023, 0, NUM_LEDS);  // Mikrofonwert auf LED-Anzahl abbilden
  Serial.println(ledCount);
  for (int i = 0; i < ledCount; i++) {
    // Zufällig RGB-Farbe erzeugen
    int red = random(0, 256);    
    int green = random(0, 256);
    int blue = random(0, 256);
    matrix.setPixelColor(i, matrix.Color(red, green, blue));  // LED einschalten mit zufälliger Farbe
  }
  for (int i=ledCount;i<NUM_LEDS;i++){
    matrix.setPixelColor(i, matrix.Color(0,0,0));  // LED einschalten mit zufälliger Farbe
    
  }

  matrix.show();  // Aktualisieren der LEDs
  delay(1);    // Kurze Pause
}

Erläuterung des Codes

int ledCount = map(micValue, 0, 1023, 0, NUM_LEDS);

Mit dem map-Befehl werden die Messwerte des Mikrofons (0-1023) in Werte für die LED-Matrix (0-39) umgeschrieben.

Teste das Programm durch Klatschen.

Verbesserungen

a) Ständig leuchtende Pixel

Abhängig vom Grundgeräusch-Pegel leuchten die ersten LEDs ständig.
Um dies zu beseitigen, sind folgende Schritte nötig:

  1. Ermittele in der setup-Methode durch 10 Messungen mit 10 ms Pause den Grund-Pegel.
  2. Speichere diesen Wert in einer globalen Variable.
  3. Ziehe diesen Wert von jedem Messwert ab.

b) Empfindlichkeit verändern.

Experimentiere mit den Messwerten oder der map-Funktion, damit die Matrix empfindlicher wird.

zurück