led-wolke/LEDWolke.ino

91 lines
2.5 KiB
C++

/*
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());
}