Page 1 of 1

Toggle LED strip effects

Toggle LED strip effects

Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!

Topics for particular software or systems: Start your topic link with the name of the application or system.
Examples: "MacOS X - Your question", "MS Word - Your Tip or Trick".

Please note that switching to another language when reading a post will not work!
Posts will not have a translated counterpart.




RSS Feed

Home Forums Hardware Arduino Toggle LED strip effects

This topic contains 1 reply, has 1 voice, and was last updated by  hans 3 years, 1 month ago.

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • 6380

    hans
    Keymaster

    From the original comment:

    Does anyone know how to program these effects so that you can select a button for each or one button to scroll thru each with a random selector as well?

    I built a crosley type jukebox with digital screen and Kodi with 4 pairs of WS2811 LED’s. 10 LED’s on 2 strings vertical and 9 LED’s on 2 strings horizontal.

    I have tried piecing together Fastled Multiple string code with Fastled DEMO100 code but only the first effect lights up.

    #include <Button.h>
    #include “FastLED.h”
    #define NUM_LEDS_MIRROR_FIRST 10
    #define NUM_LEDS_MIRROR_SECOND 9
    #define MAX_EFFECTS 7
    #define COLOR_ORDER RGB
    #define LED_TYPE WS2811
    CRGB leds[NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND];
    int effectsCounter = 1;
    int effectsButton = 8;
    void setup() {
       delay( 3000 );
     // set up buttons
    pinMode(effectsButton, INPUT_PULLUP);
      // tell FastLED there’s 10 NEOPIXEL leds on pin 4
      FastLED.addLeds<NEOPIXEL, 4>(leds, NUM_LEDS_MIRROR_FIRST);
      // tell FastLED there’s 10 NEOPIXEL leds on pin 5
      FastLED.addLeds<NEOPIXEL, 5>(leds, NUM_LEDS_MIRROR_FIRST);
      // tell FastLED there’s 9 NEOPIXEL leds on pin 6
      FastLED.addLeds<NEOPIXEL, 6>(leds, NUM_LEDS_MIRROR_SECOND);
      // tell FastLED there’s 9 NEOPIXEL leds on pin 7
      FastLED.addLeds<NEOPIXEL, 7>(leds, NUM_LEDS_MIRROR_SECOND);
    #define BRIGHTNESS 96
    #define FRAMES_PER_SECOND 120
      delay(3000); // 3 second delay for recovery
      // tell FastLED about the LED strip configuration
      FastLED.addLeds<LED_TYPE,COLOR_ORDER>(leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND).setCorrection(TypicalLEDStrip);
      //FastLED.addLeds<LED_TYPE,COLOR_ORDER>(leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND).setCorrection(TypicalLEDStrip);
      // set master brightness control
      FastLED.setBrightness(BRIGHTNESS);
    }
    // List of patterns to cycle through. Each is defined as a separate function below.
    typedef void (*SimplePatternList[])();
    SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };
    uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
    uint8_t gHue = 0; // rotating “base color” used by many of the patterns
    void loop() {
      // Call the current pattern function once, updating the ‘leds’ array
      gPatterns[gCurrentPatternNumber]();
      // send the ‘leds’ array out to the actual LED strip
      FastLED.show();
      // insert a delay to keep the framerate modest
      FastLED.delay(1000/FRAMES_PER_SECOND); 
      // do some periodic updates
      EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the “base color” through the rainbow
      EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
    }
    #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
    void nextPattern()
    {
      // add one to the current pattern number, and wrap around at the end
      gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
    }
    void rainbow() 
    {
      // FastLED’s built-in rainbow generator
      fill_rainbow( leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND, gHue, 7);
    }
    void rainbowWithGlitter() 
    {
      // built-in FastLED rainbow, plus some random sparkly glitter
      rainbow();
      addGlitter(80);
    }
    void addGlitter( fract8 chanceOfGlitter) 
    {
      if( random8() < chanceOfGlitter) {
        leds[ random8(NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND) ] += CRGB::White;
      }
    }
    void confetti() 
    {
      // random colored speckles that blink in and fade smoothly
      fadeToBlackBy( leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND, 10);
      int pos = random16(NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND);
      leds[pos] += CHSV( gHue + random8(64), 200, 255);
    }
    void sinelon()
    {
      // a colored dot sweeping back and forth, with fading trails
      fadeToBlackBy( leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND, 20);
      int pos = beatsin16(13,0,NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND);
      leds[pos] += CHSV( gHue, 255, 192);
    }
    void bpm()
    {
      // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
      uint8_t BeatsPerMinute = 10;
      CRGBPalette16 palette = PartyColors_p;
      uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
      for( int i = 0; i < NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND; i++) { //9948
        leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
      }
    }
    void juggle() {
      // eight colored dots, weaving in and out of sync with each other
      fadeToBlackBy( leds, NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND, 20);
      byte dothue = 0;
      for( int i = 0; i < 8; i++) {
        leds[beatsin16(i+7,0,NUM_LEDS_MIRROR_FIRST/NUM_LEDS_MIRROR_SECOND)] |= CHSV(dothue, 200, 255);
        dothue += 32;
      }
    }
    void ChangePalettePeriodically()
    {  
        if( effectsCounter == 0) { nextPattern(); }
        if( effectsCounter == 1) { rainbow(); }
        if( effectsCounter == 2) { rainbowWithGlitter(); }
        if( effectsCounter == 4) { confetti(); }
        if( effectsCounter == 5) { sinelon(); }
        if( effectsCounter == 6) { bpm(); }
        if( effectsCounter == 7) { juggle(); }
    6382

    hans
    Keymaster

    Hi Imdr5534!

    The code is a little hard to read (but I’m not an expert either).

    In loop() the function nextPattern() should switch pattern by changing the gCurrentPatternNumber variable.
    I had not yet seen the “EVERY_N_SECONDS” function (part of the FastLED library), so I’d make sure that works to begin with.

    If that works, then you could add in the nextPattern() function something that catches the button press (see also Arduino Button). But since that function only occurs every n seconds (where n=10), this might not be the best way to do it.

    Instead you could (simplified code), by changing the “EVERY_N_MILLISECONDS” line to something like this (assuming the Arduino Button example code):

    EVERY_N_MILLISECONDS( 20 ) { 
      gHue++; 
      if (buttonState == HIGH) { nextPattern(); } // button press = toggle to next pattern

    The line with EVERY_N_SECONDS can then be removed.

    I’m not even sure if EVERY_N_SECONDS and EVERY_N_MILLISECONDS conflict or not. But by the sound of it, it doesn’t work to begin with?
    Temporary comment out the line with EVERY_N_MILLISECONDS, and see if it changes effects.

    Since I’m not a person that works with pointers often, you could also try rewriting the loop() and nextPattern() functions like this to just test the switching of patterns:

    void loop() {
      // Call the current pattern function once, updating the ‘leds’ array
      gPatterns[gCurrentPatternNumber]();
      // send the ‘leds’ array out to the actual LED strip
      FastLED.show();
      // insert a delay to keep the framerate modest
      FastLED.delay(1000/FRAMES_PER_SECOND); 
      // do some periodic updates
      //EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the “base color” through the rainbow
      EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
    }
    void nextPattern()
    { // select next pattern or go to the first one if(gCurrentPatternNumber<=6) { gCurrentPatternNumber=gCurrentPatternNumber+1; } else { gCurrentPatternNumber=0; }
      // add one to the current pattern number, and wrap around at the end switch(gCurrentPatternNumber) { case 0: rainbow; break; case 1: rainbowWithGlitter; break; case 2: confetti; break; case 3: sinelon; break; case 4: juggle; break; case 6: bpm; break;
    }

    It’s a less advanced way of doing it, but much more readable …

Viewing 2 posts - 1 through 2 (of 2 total)



You must be logged in to reply to this topic.