diff --git a/SimpLedRGB.cpp b/SimpLedRGB.cpp index f02e37b..702356d 100644 --- a/SimpLedRGB.cpp +++ b/SimpLedRGB.cpp @@ -1,6 +1,7 @@ #include "SimpLedRGB.h" -SimpLedRGB::SimpLedRGB(int pinRed, int pinGreen, int pinBlue) { +SimpLedRGB::SimpLedRGB(int pinRed, int pinGreen, int pinBlue) +{ this->pin_red = pinRed; this->pin_green = pinGreen; this->pin_blue = pinBlue; @@ -75,19 +76,29 @@ void SimpLedRGB::rainbowCycle(int cycleDurationMillis) translateToColor(COLOR_RED, cycleDurationMillis); } -void SimpLedRGB::candle(const Color &color) +void SimpLedRGB::candle(const Color &color, float wind = 0.5) { - float brightness = (float)random(300, 1000) / 1000.0; - int duration = random(100, 1000); + int duration = random(250, 6000 - 5000 * wind); + float intensity = (float)random(100 + 400 * wind, 300 + 600 * wind) / 1000.0; - translateToColor( - { - color.red * brightness, - color.green * brightness, - color.blue * brightness - }, - duration - ); + unsigned long start = millis(); + unsigned long finish = start + duration; + + float progress = 0.0; + + while (progress < 1.0) { + progress = (float)(millis() - start) / (float)duration; + + float brightness = (1.0 - intensity) + (1.0 + cos(PI * 2 * progress)) * 0.5 * intensity; + + setColor( + { + color.red * brightness, + color.green * brightness, + color.blue * brightness, + } + ); + } } void SimpLedRGB::pulse(const Color &color, float timesPerSecond = 1.0, float amplitudeMin = 0.0, float amplitudeMax = 1.0) diff --git a/SimpLedRGB.h b/SimpLedRGB.h index 930e838..161abf2 100644 --- a/SimpLedRGB.h +++ b/SimpLedRGB.h @@ -39,7 +39,7 @@ class SimpLedRGB void rainbowCycle(int cycleDurationMillis); - void candle(const Color &color); + void candle(const Color &color, float wind = 0.5); void pulse(const Color &color, float timesPerSecond = 1.0, float amplitudeMin = 0.0, float amplitudeMax = 1.0); };