led-wolke/LEDWolke.ino

91 lines
2.5 KiB
Arduino
Raw Normal View History

2018-06-25 08:17:07 +02:00
/*
2018-06-27 16:57:18 +02:00
LED Fading mit NodeMCU v 1.0
2018-06-25 08:17:07 +02:00
*/
class RgbLed {
int ledRedPin;
int ledGreenPin;
int ledBluePin;
byte ledRedIntensity;
byte ledGreenIntensity;
byte ledBlueIntensity;
byte ledRedIntensityTo;
byte ledGreenIntensityTo;
byte ledBlueIntensityTo;
long durationLeft;
2018-06-27 16:57:18 +02:00
long previousMillis;
2018-06-25 08:17:07 +02:00
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;
2018-06-27 16:57:18 +02:00
previousMillis = 0;
2018-06-25 08:17:07 +02:00
}
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)
{
2018-06-27 16:57:18 +02:00
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;
2018-06-25 08:17:07 +02:00
}
2018-06-27 16:57:18 +02:00
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);
2018-06-25 08:17:07 +02:00
}
};
RgbLed ledStripe(5, 4, 0);
void setup() {
}
void loop()
{
ledStripe.ChangeColor(30, 200, 255, 1000);
ledStripe.Update(millis());
}