/* * LED Fading mit NodeMCU v 1.0 * * (c) Nikos Papagiannopoulos * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ class RgbLed { int ledRedPin; int ledGreenPin; int ledBluePin; byte ledRedIntensityStart; byte ledGreenIntensityStart; byte ledBlueIntensityStart; byte ledRedIntensityCur; byte ledGreenIntensityCur; byte ledBlueIntensityCur; byte ledRedIntensityTo; byte ledGreenIntensityTo; byte ledBlueIntensityTo; long timeStart; long timeEnd; public: RgbLed(int redPin, int greenPin, int bluePin) { ledRedPin = redPin; ledGreenPin = greenPin; ledBluePin = bluePin; pinMode(ledRedPin, OUTPUT); pinMode(ledGreenPin, OUTPUT); pinMode(ledBluePin, OUTPUT); ledRedIntensityStart = 0; ledGreenIntensityStart = 0; ledBlueIntensityStart = 0; ledRedIntensityCur = ledRedIntensityStart; ledGreenIntensityCur = ledGreenIntensityStart; ledBlueIntensityCur = ledBlueIntensityStart; ledRedIntensityTo = ledRedIntensityStart; ledGreenIntensityTo = ledGreenIntensityStart; ledBlueIntensityTo = ledBlueIntensityStart; timeStart = 0; timeEnd = 0; } public: void ChangeColor(byte redIntesity, byte greenIntensity, byte blueIntensity, long duration) { if (millis() > timeEnd) { timeStart = millis(); timeEnd = timeStart + duration; ledRedIntensityStart = ledRedIntensityCur; ledGreenIntensityStart = ledGreenIntensityCur; ledBlueIntensityStart = ledBlueIntensityCur; ledRedIntensityTo = redIntesity; ledGreenIntensityTo = greenIntensity; ledBlueIntensityTo = blueIntensity; } } public: void Update(long currentMillis) { if (currentMillis <= timeEnd) { ledRedIntensityCur = lerp(ledRedIntensityStart, ledRedIntensityTo, timeStart, timeEnd, currentMillis); ledGreenIntensityCur = lerp(ledGreenIntensityStart, ledGreenIntensityTo, timeStart, timeEnd, currentMillis); ledBlueIntensityCur = lerp(ledBlueIntensityStart, ledBlueIntensityTo, timeStart, timeEnd, currentMillis); UpdateLEDs(); } } bool Finished() { return millis() > timeEnd; } byte lerp(byte intensityStart, byte intensityEnd, long timeStart, long timeEnd, long timeCurrent) { long result = ( ( timeCurrent - timeStart ) * ( intensityEnd - intensityStart) / ( timeEnd - timeStart) ) + intensityStart; return (byte) result; } void UpdateLEDs() { analogWrite(ledRedPin, ledRedIntensityCur * 4); // correction for NodeMCU 0 - 1023 analogWrite(ledGreenPin, ledGreenIntensityCur * 4); analogWrite(ledBluePin, ledBlueIntensityCur * 4); } }; RgbLed ledStripe(5, 4, 0); int foo = 0; void setup() { Serial.begin(115200); } void loop() { if (ledStripe.Finished() && foo == 0) { foo = 1; ledStripe.ChangeColor(0, 0, 0, 2000); } if (ledStripe.Finished() && foo == 1) { foo = 0; ledStripe.ChangeColor(255, 255, 255, 2000); } ledStripe.Update(millis()); }