jandelgado / jled

Non-blocking LED controlling library for Arduino and friends.
MIT License
324 stars 51 forks source link

Update MaxBrightness Dynamically? #82

Closed RossAWaddell closed 2 years ago

RossAWaddell commented 2 years ago

Apart from the incremental functions, is there a way to update the MaxBrightness value dynamically?

auto ledStrbLts = JLed(9).Breathe(110, 113, 110)
                    .MaxBrightness(200).DelayAfter(500).Forever();

void loop()  
{

// int newBrightness = random(20, 255);
//ledStrbLits.MaxBrightness(newBrightness); ??????
  ledStrbLts.Update();

}
jandelgado commented 2 years ago

Did you try your code? I think

#include <jled.h>

auto ledStrbLts = JLed(9).Breathe(110, 113, 110)
                    .MaxBrightness(200).DelayAfter(500).Forever();

void setup() {}

void loop()  {
  ledStrbLts.MaxBrightness(random(20, 255));
  ledStrbLts.Update();
}

should work.

RossAWaddell commented 2 years ago

Genius! Thanks again!

RossAWaddell commented 2 years ago

Is the Breathe method supposed to flicker like this? I wanted to test to see if I could view the brightness level changes with the above code on my Uno so I changed the code to:

#include <jled.h>

auto ledStrbLts = JLed(10).Breathe(500, 1000, 500)
                    .MaxBrightness(200).DelayAfter(500).Forever();

void setup() {}

void loop()  {
  ledStrbLts.MaxBrightness(random(7, 255));
  ledStrbLts.Update();
}

With this, there is a definite flicker.

EDIT: this only happens with this line in the loop:

ledStrbLts.MaxBrightness(random(7, 255));

The effect I'm after is for each 'blink' the brightness it fades up to is different, not to change the brightness during the on phase.

https://user-images.githubusercontent.com/29708900/145437869-2a01f7cd-93a3-4e9e-8bc1-a3fd7ffaa81f.mp4

jandelgado commented 2 years ago

The loop() function is executed over and over again with a very high frequency. There we call the JLed::Update method, which iteratively updates the LED's output according to the chosen effect. Because you are changing the MaxBrightness also over and over again, not synchronized with the JLed effect running, it is flickering.

You need something like this (Serial stuff just added for debugging):

auto ledStrbLts = JLed(10).Breathe(500, 1000, 500)
                    .MaxBrightness(200).DelayAfter(500);  // note: .Forever() removed

void setup() {
    Serial.begin(9600);
}

void loop()  {
  // Update() returns false when the effect is done 'playing'
  if (!ledStrbLts.Update()) {
    const auto brightness= random(20,255);
    Serial.print("New brightness: ");
    Serial.println(brightness);
    ledStrbLts.MaxBrightness(brightness);
    // start over
    ledStrbLts.Reset();
  }
}
RossAWaddell commented 2 years ago

That did it - thanks heaps!