#include <IRremote.hpp>
#define IR_RECEIVE_PIN 2
struct Command {
IRRawDataType code; // the raw IR code
void (*callback)(); // the function to run
};
enum ActiveColor {
GREEN,
RED
};
void onPower();
void onIncreaseBrightness();
void onDecreaseBrightness();
void onChangeRed();
void onChangeGreen();
void onOff();
Command commandList[] = {
{0x5DA2FF00, onPower},
{0xFD02FF00, onIncreaseBrightness},
{0x6798FF00, onDecreaseBrightness},
{0x1FE0FF00, onChangeRed},
{0x6F90FF00, onChangeGreen},
{0x4FB0FF00, onOff}
};
const int commandCount = sizeof(commandList) / sizeof(commandList[0]);
byte redPin = 12;
byte greenPin = 9;
int brightness = 255;
ActiveColor currentColor = GREEN;
bool isOn = false;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
Serial.begin(115520);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
}
void loop() {
if (IrReceiver.decode()) {
IRRawDataType incoming = IrReceiver.decodedIRData.decodedRawData;
// Look for matching command
for (int i = 0; i < commandCount; i++) {
if (incoming == commandList[i].code) {
commandList[i].callback();
}
}
IrReceiver.resume();
}
}
void applyBrightness() {
if (!isOn) {
return;
}
if (currentColor == RED) {
analogWrite(greenPin, brightness); // PWM ON for red mode?
digitalWrite(redPin, LOW); // LOW = ON (common anode)
} else {
digitalWrite(redPin, HIGH); // HIGH = OFF (common anode)
analogWrite(greenPin, 255 - brightness); // invert PWM
}
}
void onPower() {
isOn = true;
currentColor = GREEN;
Serial.println("POWER callback");
applyBrightness();
}
void onIncreaseBrightness() {
Serial.println("INCREASE BRIGHTNESS");
if (!isOn) {
return;
}
if (brightness < 255)
brightness++;
applyBrightness();
}
void onDecreaseBrightness() {
Serial.println("DECREASE BRIGHTNESS");
if (!isOn) {
return;
}
if (brightness > 0)
brightness--;
applyBrightness();
}
void onChangeRed() {
Serial.println("Change to Red");
if(!isOn) {
return;
}
currentColor = RED;
applyBrightness();
}
void onChangeGreen() {
Serial.println("Change to Green");
if (!isOn) {
return;
}
currentColor = GREEN;
applyBrightness();
}
void onOff() {
isOn = false;
Serial.println("Change to off");
digitalWrite(redPin, HIGH);
analogWrite(greenPin, 255);
}