Page 1 of 1
Forum

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.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.

Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!




Toggle LED strip ef...
 
Share:
Notifications
Clear all

[Solved] Toggle LED strip effects

2 Posts
1 Users
0 Likes
3,175 Views
 Hans
(@hans)
Famed Member Admin
Joined: 11 years ago
Posts: 2660
Topic starter  

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 = 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(); }

   
ReplyQuote
 Hans
(@hans)
Famed Member Admin
Joined: 11 years ago
Posts: 2660
Topic starter  

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 ...


   
ReplyQuote

Like what you see and you'd like to help out? 

The best way to help is of course by assisting others with their questions here in the forum, but you can also help us out in other ways:

- Do your shopping at Amazon, it will not cost you anything extra but may generate a small commission for us,
- send a cup of coffee through PayPal ($5, $10, $20, or custom amount),
- become a Patreon,
- donate BitCoin (BTC), or BitCoinCash (BCH).

Share: