/* LED Fading mit NodeMCU v 1.0 */ class RgbLed { int ledRedPin; int ledGreenPin; int ledBluePin; byte ledRedIntensity; byte ledGreenIntensity; byte ledBlueIntensity; byte ledRedIntensityTo; byte ledGreenIntensityTo; byte ledBlueIntensityTo; long durationLeft; long previousMillis; public: RgbLed(int redPin, int greenPin, int bluePin) { ledRedPin = redPin; ledGreenPin = greenPin; ledBluePin = bluePin; pinMode(ledRedPin, OUTPUT); pinMode(ledGreenPin, OUTPUT); pinMode(ledBluePin, OUTPUT); ledRedIntensity = 0; ledGreenIntensity = 0; ledBlueIntensity = 0; ledRedIntensityTo = ledRedIntensity; ledGreenIntensityTo = ledGreenIntensity; ledBlueIntensityTo = ledBlueIntensity; durationLeft = 0; previousMillis = 0; } public: void ChangeColor(int redIntesity, int greenIntensity, int blueIntensity, long duration) { if (ledRedIntensityTo == ledRedIntensity && ledGreenIntensityTo == ledGreenIntensity && ledBlueIntensityTo == ledBlueIntensity && ledRedIntensity != redIntesity && ledGreenIntensity != greenIntensity && ledBlueIntensity != blueIntensity) { durationLeft = duration; ledRedIntensityTo = ledRedIntensity; ledGreenIntensityTo = ledGreenIntensity; ledBlueIntensityTo = ledBlueIntensity; } } public: void Update(long currentMillis) { if (ledRedIntensityTo != ledRedIntensity && ledGreenIntensityTo != ledGreenIntensity && ledBlueIntensityTo != ledBlueIntensity) { ledRedIntensity = lerp(ledRedIntensity, ledRedIntensityTo, previousMillis, previousMillis + durationLeft, currentMillis); ledGreenIntensity = lerp(ledGreenIntensity, ledGreenIntensityTo, previousMillis, previousMillis + durationLeft, currentMillis); ledBlueIntensity = lerp(ledBlueIntensity, ledBlueIntensityTo, previousMillis, previousMillis + durationLeft, currentMillis); UpdateLEDs(); } durationLeft = durationLeft - (currentMillis - previousMillis); previousMillis = currentMillis; } byte lerp(byte intensityStart, byte intensityEnd, long timeStart, long timeEnd, long timeCurrent) { return ( ( timeCurrent - timeStart )( intensityEnd - intensityStart) / ( timeEnd - timeStart) ) + intensityStart; } void UpdateLEDs() { digitalWrite(ledRedPin, ledRedIntensity); digitalWrite(ledGreenPin, ledGreenIntensity); digitalWrite(ledBluePin, ledBlueIntensity); } }; RgbLed ledStripe(5, 4, 0); void setup() { } void loop() { ledStripe.ChangeColor(30, 200, 255, 1000); ledStripe.Update(millis()); }