jled icon indicating copy to clipboard operation
jled copied to clipboard

Question/Feature: Get current brightness

Open d3jong opened this issue 1 year ago • 11 comments

Currently building a cabinet light using this library. Absolutely fantastic. But I have one question. Is it possible to get the current brightness level.

It's not a first world problem, but whenever the doors of the cabinet opens/closes too fast it start at the max or min brightness level while its for example only half way. I'm using only FadeOn and FadeOff functions btw. When I could get the current brightness this can be fixed using the Fade function.

It is basically a follow up question on #66

d3jong avatar Jul 19 '23 22:07 d3jong

The "current" brightness level is a function of time, and calculated on-demand. JLed does not store the lastly written level, since this would require an additional byte in the internal state, which I want to keep as small as possible. I'll check if it's possible to return the current level with the Update method, then the client can decide to use/store the value.

jandelgado avatar Jul 29 '23 20:07 jandelgado

@arnolddej, On the return_current_level_from_update branch I added experimental support for the Update() method returning also the brightness level written, while keeping compatibility with old code. Have a look at the new UpdateResult class. Use it as follows:

auto result = led.Update();    // returns now an `UpdateResult` object that can be cast to a `bool`

// signals that a new value was written out to the LED
if (result.WasChanged()) {
    auto level = result.Value();
    // do something with the level ....
}

jandelgado avatar Jul 30 '23 12:07 jandelgado

Thanks! I will try it asap.

d3jong avatar Jul 30 '23 14:07 d3jong

@jandelgado I've tested it.

It seems like the value not always correspond to the actual brightness whenever you interrupt the running Fade() command with another Fade() command. Also whenever you interrupt the running cmd it sometimes will start at the minimum/maximum brightness level while its current value is only half for example.

Is it even possible to call Fade() with another Fade() on the same object while the first cmd isn't finished yet.

My current turn on/off code:

void turn_on() {
if (ledstrip1.IsRunning()) {
   ledstrip1.Stop();
}
ledstrip1.Fade(current_value_ledstrip1, 255, DURATION);
}

void turn_off() {
if (ledstrip1.IsRunning()) {
   ledstrip1.Stop();
}
ledstrip1.Fade(current_value_ledstrip1, 0, DURATION);
}

d3jong avatar Aug 03 '23 18:08 d3jong

Hello. I have the same problem. I follow your correspondence silently. :)

aGGreSSiv avatar Aug 04 '23 12:08 aGGreSSiv

@arnolddej Could you please post a complete sketch. Especially the part where current_value_ledstrip1 is obtained is of interest here

jandelgado avatar Aug 05 '23 12:08 jandelgado

@aGGreSSiv please open another issue with your question and don't post code with secrets!

jandelgado avatar Aug 06 '23 15:08 jandelgado

@arnolddej Could you please post a complete sketch. Especially the part where current_value_ledstrip1 is obtained is of interest here

I am currently on holiday for a week. Will share the code when I'm back. Basically, I assign a global uint8_t variable like your example. I then use this variable in the Fade() function.

d3jong avatar Aug 06 '23 15:08 d3jong

No problem - me too :-) Anyway, I think i found the problem in the meantime ...

jandelgado avatar Aug 07 '23 15:08 jandelgado

@arnolddej I did a few changes, please test again.

jandelgado avatar Aug 18 '23 19:08 jandelgado

@jandelgado Unfortunately I already had to build in the lighting. Will test the circuit on a breadboard soon.

d3jong avatar Aug 23 '23 19:08 d3jong