diff --git a/source/irlicht.ino b/source/irlicht.ino index 1db5704..9fcfb1f 100644 --- a/source/irlicht.ino +++ b/source/irlicht.ino @@ -46,21 +46,37 @@ int levelRed = 0x00; int levelGreen = 0x00; int levelBlue = 0x00; int levelWhite = 0x01; +int levelTotal = 0x80; int mode = MODE_CONSTANT; int modestep = 0; -int animationspeed = 10; +int animationspeed = 5; long steplength = 0; IRrecv irrecv(IR_PIN); decode_results results; simtronyx_RGB_LED strip(LED_RED, LED_GREEN, LED_BLUE); +void setRGBW(int red, int green, int blue, int white) { + // dim all channels according to levelTotal + red = map(red, 0x00, 0xff, 0x00, levelTotal); + green = map(green, 0x00, 0xff, 0x00, levelTotal); + blue = map(blue, 0x00, 0xff, 0x00, levelTotal); + white = map(white, 0x00, 0xff, 0x00, levelTotal); + // keep output at least at 0x01 if channel is not turned off + if (levelRed > 0) { red = constrain(red, 0x01, 0xff); } + if (levelGreen > 0) { green = constrain(green, 0x01, 0xff); } + if (levelBlue > 0) { blue = constrain(blue, 0x01, 0xff); } + if (levelWhite > 0) { white = constrain(white, 0x01, 0xff); } + // set output + strip.setRGB(red, green, blue); + analogWrite(LED_WHITE, white); +} + void setup() { Serial.begin(9600); pinMode(LED_WHITE, OUTPUT); - analogWrite(LED_WHITE, levelWhite); - strip.setRGB(levelRed, levelGreen, levelBlue); + setRGBW(levelRed, levelGreen, levelBlue, levelWhite); irrecv.enableIRIn(); // Start the receiver } @@ -135,30 +151,16 @@ void loop() { strip.animateStart(); break; case IR_KEY_SMOOTH: - mode = MODE_SMOOTH; + mode == MODE_SMOOTH ? mode = MODE_CONSTANT : mode = MODE_SMOOTH; strip.animateColorsClear(); - strip.animateColorAdd(255, 0, 0, 100); - strip.animateColorAdd(255, 255, 0, 100); - strip.animateColorAdd( 0, 255, 0, 100); - strip.animateColorAdd( 0, 255, 255, 100); - strip.animateColorAdd( 0, 0, 255, 100); - strip.animateColorAdd(255, 0, 255, 100); + strip.animateColorAdd(0x00, 0x00, 0x00, 100); + strip.animateColorAdd(levelRed, levelGreen, levelBlue, 100); strip.animateStart(); break; - case IR_KEY_DIM: - levelWhite -= 0x10; - if (levelWhite < 0x00) { - levelWhite = 0x00; - } - analogWrite(LED_WHITE, levelWhite); - break; - case IR_KEY_BRIGHT: - levelWhite += 0x10; - if (levelWhite > 0xFF) { - levelWhite = 0xFF; - } - analogWrite(LED_WHITE, levelWhite); - break; + case IR_KEY_DIM: levelTotal = constrain(levelTotal-0x10, 0x01, 0xff); break; + case IR_KEY_BRIGHT: levelTotal = constrain(levelTotal+0x10, 0x01, 0xff); break; + case IR_KEY_ALLON: animationspeed = constrain(animationspeed+1, 1, 15); break; + case IR_KEY_ALLOFF: animationspeed = constrain(animationspeed-1, 1, 15); break; default: Serial.print("proto: "); Serial.print(results.decode_type, DEC); @@ -168,8 +170,7 @@ void loop() { } if (mode == MODE_CONSTANT) { strip.animateStop(); - analogWrite(LED_WHITE, levelWhite); - strip.setRGB(levelRed, levelGreen, levelBlue); + setRGBW(levelRed, levelGreen, levelBlue, levelWhite); } } } @@ -184,12 +185,10 @@ void loop() { if (steplength <= 0) { if (modestep == 1) { modestep = 0; - analogWrite(LED_WHITE, levelWhite); - strip.setRGB(levelRed, levelGreen, levelBlue); + setRGBW(levelRed, levelGreen, levelBlue, levelWhite); } else { modestep = 1; - analogWrite(LED_WHITE, 0x00); - strip.setRGB(0x00, 0x00, 0x00); + setRGBW(0x00, 0x00, 0x00, 0x00); } steplength = animationspeed * 10000L; } @@ -198,12 +197,14 @@ void loop() { steplength--; if (steplength <= 0) { switch (modestep) { - case 0: levelRed = 0xff; levelGreen = levelBlue = 0x00; modestep = 1; break; - case 1: levelGreen = 0xff; levelBlue = levelRed = 0x00; modestep = 2; break; - case 2: levelBlue = 0xff; levelRed = levelGreen = 0x00; modestep = 0; break; + case 0: levelRed = 0xff; levelGreen = 0x00; levelBlue = 0x00; modestep = 1; break; + case 1: levelRed = 0xff; levelGreen = 0xff; levelBlue = 0x00; modestep = 2; break; + case 2: levelRed = 0x00; levelGreen = 0xff; levelBlue = 0x00; modestep = 3; break; + case 3: levelRed = 0x00; levelGreen = 0xff; levelBlue = 0xff; modestep = 4; break; + case 4: levelRed = 0x00; levelGreen = 0x00; levelBlue = 0xff; modestep = 5; break; + case 5: levelRed = 0xff; levelGreen = 0x00; levelBlue = 0xff; modestep = 0; break; } - analogWrite(LED_WHITE, levelWhite); - strip.setRGB(levelRed, levelGreen, levelBlue); + setRGBW(levelRed, levelGreen, levelBlue, levelWhite); steplength = animationspeed * 10000L; } break;