[gelöst] Problem Led Streifen + msgeq7 Farbwechsel auf Bass

Hey, ich arbeite gerade an einem musikreaktivem Led Streifen. Es klappt auch alles ganz gut, nur weiß ich leider nicht wie ich programmieren kann, dass bei jedem Bass der Led Streifen die Farbe wechselt und bis zum nächsten gemessenen Bass diese beibehält. Es soll hier nur immer wieder zwischen rot-grün-blau gewechselt werden.
Den Bass kann ich wunderbar messen und ein Aufflackern auf den Bass ist auch kein Problem, jedoch kriege ich es eben leider nicht hin, das eine der Grundfarben bis zur Ablösung duch die nächste bleibt.
Könnt ihr mir da weiterhelfen?

Der Code:

#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);                  // reset the MSGEQ7's counter
        delay(5);
        digitalWrite(resetPin, LOW);


       
                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
                         Serial.println (PWMvalue);
             
                digitalWrite(strobePin, HIGH);

 

      //Erst ab hier relevant für die Fragestellung

   if (PWMvalue > 170)
   {
      fill_solid( leds, NUM_LEDS, CRGB(250,0,0));
      FastLED.setBrightness (PWMvalue);
      FastLED.show ();
      delay (60);
      }
      
   if (PWMvalue > 170)
   {
      fill_solid( leds, NUM_LEDS, CRGB(0,250,0));
      FastLED.setBrightness (PWMvalue);
      FastLED.show ();
      delay (60);
      }
      
    if (PWMvalue > 170)
   {
      fill_solid( leds, NUM_LEDS, CRGB(0,0,250));
      FastLED.setBrightness (PWMvalue);
      FastLED.show ();
      delay (60);
      }

      
    else
      {
             fill_solid( leds, NUM_LEDS, CRGB::Red);
             FastLED.setBrightness (80);
             FastLED.show ();
             delay (50);
      }
      
      
    }

Schonmal danke im Voraus :slight_smile:

Hi

Was sollen die vielen delay() in dem Code?
Versuche Mal Das:

if (PWMvalue > 170)   {
   static byte takt=-1;  //Variable um mitzuhalten, der wievielte Bass Das war - als 'alle Bits gesetzt' initialisieren
   takt++;  //Bass-Zahl +1 ... ergibt beim ersten Aufruf 0 ;)
   takt%=3; // Bass-Zahl auf 3 begrenzen 0..1..2..0..1..2..
      fill_solid( leds, NUM_LEDS, CRGB(takt==0?250:0,takt==1?250:0,takt==3?250:0));
      FastLED.setBrightness (PWMvalue);
      FastLED.show ();
}

:grin:

So schön kompakt, da könnte man das

 takt++;  //Bass-Zahl +1 ... ergibt beim ersten Aufruf 0 ;)
   takt%=3; // Bass-Zahl auf 3 begrenzen 0..1..2..0..1..2..

kürzen auf das

 ++takt %= 3; // Bass-Zahl auf 3 begrenzen 0..1..2..0..1..2..

:grin:

Dankeschön, es klappt jetzt! Ich musste an dem Code nur noch eine Kleinigkeit ändern:

von

fill_solid( leds, NUM_LEDS, CRGB(takt==0?250:0,takt==1?250:0,takt==3?250:0));

zu

fill_solid( leds, NUM_LEDS, CRGB(takt==0?250:0,takt==1?250:0,takt==2?250:0));

Die 3 musste da durch eine 2 ersetzt werden.
Vielen Dank!

Hi

Hoppala - die 3 sollte auch eine 2 sein - gut aufgepasst!
Schön, daß Es klappt!

@agmue
Ja, Das kann man in einer Zeile schreiben und Es funktioniert wohl auch - allerdings hatte combie Bedenken angemeldet, da Das nicht garantiert funktionieren MUSS.

Da Beides den gleichen Speicherplatz braucht, gebe ich davon aus, daß 'unterm Rock' das Gleiche ankommt - aber bei zwei getrennten Zeilen ist die Reihenfolge wohl definiert.
Re: Warnung bei ++index % maxwert, nicht aber bei (index +1) % maxwert, combie #13
Du hattest sogar direkt drunter gepostet :wink:

MfG