IRlicht/source/irlicht.ino

217 lines
7.9 KiB
C++

#include <IRremote.h>
#include <simtronyx_RGB_LED.h>
#define LED_WHITE 5
#define LED_GREEN 6
#define LED_BLUE 10
#define LED_RED 9
#define IR_PIN 2
#define IR_PROTOCOL 1
#define IR_FILTER 0xF70000
#define IR_MASK 0xFF0000
#define IR_KEY_1 0xF720DF
#define IR_KEY_2 0xF710EF
#define IR_KEY_3 0xF730CF
#define IR_KEY_4 0xF70000 // key is broken :-(
#define IR_KEY_5 0xF728D7
#define IR_KEY_6 0xF7A05F
#define IR_KEY_7 0xF7906F
#define IR_KEY_8 0xF7B04F
#define IR_KEY_9 0xF78877
#define IR_KEY_FLASH 0xF7D02F
#define IR_KEY_STROBE 0xF7F00F
#define IR_KEY_FADE 0xF7C837
#define IR_KEY_SMOOTH 0xF7E817
#define IR_KEY_DIM 0xF7807F
#define IR_KEY_BRIGHT 0xF700FF
#define IR_KEY_ALLON 0xF7C03F
#define IR_KEY_ALLOFF 0xF740BF
#define IR_KEY_LIGHT10 0xF7A857
#define IR_KEY_LIGHT11 0xF7609F
#define IR_KEY_LIGHT12 0xF750AF
#define IR_KEY_LIGHT13 0xF7708F
#define IR_KEY_LIGHT14 0xF748B7
#define IR_KEY_LIGHT15 0xF76897
#define IR_KEY_LIGHT16 0xF7E01F
#define MODE_OFF 0x00
#define MODE_CONSTANT 0x01
#define MODE_FLASH 0x02
#define MODE_STROBE 0x03
#define MODE_FADE 0x04
#define MODE_SMOOTH 0x05
int levelRed = 0x00;
int levelGreen = 0x00;
int levelBlue = 0x00;
int levelWhite = 0x01;
int levelTotal = 0x80;
int mode = MODE_CONSTANT;
int modestep = 0;
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);
setRGBW(levelRed, levelGreen, levelBlue, levelWhite);
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
strip.loop();
if (irrecv.decode(&results)) {
if (results.decode_type == IR_PROTOCOL) {
if (results.value != 0xFFFFFFFF) {
//if (results.value & IR_MASK == IR_FILTER) {
Serial.println(results.value);
switch (results.value) {
case IR_KEY_1: mode = MODE_CONSTANT; levelRed += 51; if (levelRed > 0xff) { levelRed = 0x00; } break;
case IR_KEY_2: mode = MODE_CONSTANT; levelGreen += 51; if (levelGreen > 0xff) { levelGreen = 0x00; } break;
case IR_KEY_3: mode = MODE_CONSTANT; levelBlue += 51; if (levelBlue > 0xff) { levelBlue = 0x00; } break;
case IR_KEY_4: mode = MODE_CONSTANT; levelRed = levelBlue = levelGreen = levelWhite = 0xff; break;
case IR_KEY_5: mode = MODE_CONSTANT; levelWhite += 51; if (levelWhite > 0xff) { levelWhite = 0x00; } break;
case IR_KEY_6: mode = MODE_CONSTANT; levelRed = levelBlue = levelGreen = levelWhite = 0x00; break;
case IR_KEY_7:
mode = MODE_CONSTANT;
if (levelRed == levelGreen && levelBlue == 0) {
// we have the right color tone, just set brightness
levelRed += 51; if (levelRed > 0xff) { levelRed = 0x00; };
levelGreen += 51; if (levelGreen > 0xff) { levelGreen = 0x00; };
} else {
// select color tone
levelRed = levelGreen = 51;
levelBlue = 0;
}
break;
case IR_KEY_8:
mode = MODE_CONSTANT;
if (levelGreen == levelBlue && levelRed == 0) {
// we have the right color tone, just set brightness
levelGreen += 51; if (levelGreen > 0xff) { levelGreen = 0x00; };
levelBlue += 51; if (levelBlue > 0xff) { levelBlue = 0x00; };
} else {
// select color tone
levelGreen = levelBlue = 51;
levelRed = 0;
}
break;
case IR_KEY_9:
mode = MODE_CONSTANT;
if (levelBlue == levelRed && levelGreen == 0) {
// we have the right color tone, just set brightness
levelBlue += 51; if (levelBlue > 0xff) { levelBlue = 0x00; };
levelRed += 51; if (levelRed > 0xff) { levelRed = 0x00; };
} else {
// select color tone
levelBlue = levelRed = 51;
levelGreen = 0;
}
break;
case IR_KEY_FLASH:
strip.animateStop();
mode == MODE_FLASH ? mode = MODE_CONSTANT : mode = MODE_FLASH;
modestep = 0;
steplength = 0;
break;
case IR_KEY_STROBE:
strip.animateStop();
mode == MODE_STROBE ? mode = MODE_CONSTANT : mode = MODE_STROBE;
modestep = 0;
steplength = 0;
break;
case IR_KEY_FADE:
mode = MODE_FADE;
strip.animateColorsClear();
strip.animateColorAdd(255, 0, 0, 100);
strip.animateColorAdd( 0, 255, 0, 100);
strip.animateColorAdd( 0, 0, 255, 100);
strip.animateStart();
break;
case IR_KEY_SMOOTH:
mode == MODE_SMOOTH ? mode = MODE_CONSTANT : mode = MODE_SMOOTH;
strip.animateColorsClear();
strip.animateColorAdd(0x00, 0x00, 0x00, 100);
strip.animateColorAdd(levelRed, levelGreen, levelBlue, 100);
strip.animateStart();
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);
Serial.print(" code: ");
Serial.println(results.value, HEX);
break;
}
if (mode == MODE_CONSTANT) {
strip.animateStop();
setRGBW(levelRed, levelGreen, levelBlue, levelWhite);
}
}
}
irrecv.resume(); // Receive the next value
}
switch (mode) {
case MODE_CONSTANT:
// do nothing, it's constant after all...
break;
case MODE_STROBE:
steplength--;
if (steplength <= 0) {
if (modestep == 1) {
modestep = 0;
setRGBW(levelRed, levelGreen, levelBlue, levelWhite);
} else {
modestep = 1;
setRGBW(0x00, 0x00, 0x00, 0x00);
}
steplength = animationspeed * 10000L;
}
break;
case MODE_FLASH:
steplength--;
if (steplength <= 0) {
switch (modestep) {
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;
}
setRGBW(levelRed, levelGreen, levelBlue, levelWhite);
steplength = animationspeed * 10000L;
}
break;
default:
break;
}
}
// vim:filetype=c:ts=2