jandelgado / jled

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

Question/Feature: Get current brightness #117

Open arnolddej opened 11 months ago

arnolddej commented 11 months ago

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

jandelgado commented 11 months ago

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 commented 11 months ago

@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 ....
}
arnolddej commented 11 months ago

Thanks! I will try it asap.

arnolddej commented 11 months ago

@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);
}
aGGreSSiv commented 11 months ago

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

jandelgado commented 11 months ago

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

jandelgado commented 11 months ago

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

arnolddej commented 11 months ago

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

jandelgado commented 11 months ago

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

jandelgado commented 10 months ago

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

arnolddej commented 10 months ago

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