Go Down

Topic: Helligkeit einzelner WS2812B LEDS zu Musik (Read 86 times) previous topic - next topic

seebaer

Hallo, ich arbeite gerade an einem Musik reaktiven LED Streifen. Dafür nutze ich einen msgeq7 und einen ws2812b LED Streifen. Mein Ziel ist es gerade jede sechste LED zur Lautstärke des Basses blinken zu lassen. Wenn ich das mit allen LEDs versuche funktioniert alles problemlos, bei jeder sechsten ändert sich die Helligkeit der LEDs aber nur im Sekundentakt und es sieht so aus, als ob alles zeitverzögert geschieht.

Meine Vermutung ist, dass die von mir verwendete for Schleife zur Ansteuerung jeder sechsten LED jedes mal durchgegangen werden muss, was viel Zeit kostet. Allerdings fällt mir nicht ein, wie ich sonst jede sechste LED ansteuern kann. Vielleicht mit einem Array?

Ich würde mich sehr freuen, falls ihr mir helfen könnt!



Mein Code:
Code: [Select]
#include <FastLED.h>

// How many leds are in the strip?
#define NUM_LEDS 294

// Data pin that led data will be written out over
#define DATA_PIN 6

int strobePin  = 13;    // Strobe Pin on the MSGEQ7
int resetPin   = 12;    // Reset Pin on the MSGEQ7
int outPin     = A0;   // Output Pin on the MSGEQ7



// This is an array of leds.  One item for each led in your strip.
CRGB leds[NUM_LEDS];

// This function sets up the ledsand tells the controller about them
void setup() {
  // sanity check delay - allows reprogramming if accidently blowing power w/leds
    delay(2000);
 Serial.begin (9600);
 
  // Define our pin modes
  pinMode      (strobePin, OUTPUT);
  pinMode      (resetPin,  OUTPUT);
  pinMode      (outPin,    INPUT);
 
  // Create an initial state for our pins
  digitalWrite (resetPin,  LOW);
  digitalWrite (strobePin, LOW);
  delay        (1);
 
  // Reset the MSGEQ7 as per the datasheet timing diagram
  digitalWrite (resetPin,  HIGH);
  delay        (1);
  digitalWrite (resetPin,  LOW);
  digitalWrite (strobePin, HIGH);
  delay        (1);



  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
   
}


void loop() {
  digitalWrite (resetPin,  HIGH);
  delay        (1);
  digitalWrite (resetPin,  LOW);
  digitalWrite (strobePin, HIGH);
  delay        (1);


  digitalWrite(strobePin, LOW);          // output each DC value for each freq band
  delayMicroseconds(35); // to allow the output to settle
  int spectrumRead = analogRead(outPin);

  int PWMvalue = map(spectrumRead, 0, 1024, 0, 255);  // scale analogRead's value to Write's 255 max
  if (PWMvalue < 20)
          PWMvalue = PWMvalue / 10000;                // bit of a noise filter, so the LEDs turn off at low levels

             
  digitalWrite(strobePin, HIGH);

             
Serial.println (PWMvalue);


   for(int R = 0;        // Eigentlich erst ab hier relevant
   R < NUM_LEDS;
   R = R + 7)
   {
      leds[R]   = CRGB (250,0,0);

      FastLED.show();
   }         

if (PWMvalue>50)
{
      FastLED.setBrightness (PWMvalue);
      FastLED.show ();
}

else
{
   FastLED.setBrightness (20);
   FastLED.show ();
}



}

postmaster-ino

int PWMvalue=...
Wenn PWMvaluey<20 ist, keilst Du diesen Wert durch 10000 ... es mag durchaus noch langsamere Wege geben, eine Variable auf Null zu bekommen.
int hat keine Nachkommastellen und Division ist (wohl neben float) die teuerste Berechnung.

R=R+7 liest sich NICHT nach 'jeder 6.ten LED'.
Die Daten, Die Du den LEDs zuweist, verbleiben IM Arduino, bis Du .show() aufrufst.
Setze das .show() HINTER die FOR, dann muß nicht bei jedem Mückenfurz der gesammte Stripe neue Daten geschickt bekommen.
Du willst ja ALLE Bass-LED an haben - also ERST anmachen, DANN zum Stripe schicken.

Die ganzen .show() kannst Du raus nehmen - am Ende von loop() darf davon EINS stehen bleiben - es reicht komplett aus, wenn die Daten 1x zum Stripe geschickt werden - nämlich, wenn Sie komplett sind.

MfG

qualidat

#2
Feb 18, 2020, 02:08 am Last Edit: Feb 18, 2020, 02:10 am by qualidat
Um es nochmal deutlich zu sagen: Im RAM des Arduino gibt es einen Puffer, für jede LED im Strip 3 Byte (RGB). Mit "show" wird immer der gesamte Puffer auf den Strip geschoben, egal an wie vielen Speicherplätzen du etwas geändert hast.
Es spielt also keine Rolle, wie viele der LEDs nun anders aussehen sollen. Evtl. "trödelst" du bzw. dein Code aber dabei, die Pufferplätze im gewälten Muster zu beschreiben, dann sieht es so aus, als ob der Strip "langsam" ist ...

seebaer

Oh vielen Dank! Nur noch ein FastLED.show und es läuft perfekt! Dankeschön!

Go Up