#include <IRremote.h>
const int IR_RECEIVE_PIN = 2;
const int NUM_LEDS = 16;
const int LED_PINS[NUM_LEDS] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, A0, A1, A2, A3, A4, A5};
const struct {
long code;
int ledIndex;
} BUTTON_MAP[] = {
{0x68, 0},
{0x30, 1},
{0x18, 2},
{0x7A, 3},
{0x10, 4},
{0x38, 5},
{0x5A, 6},
{0x42, 7},
{0x4A, 8},
{0x52, 9}
};
const int NUM_BUTTONS = sizeof(BUTTON_MAP) / sizeof(BUTTON_MAP[0]);
void setup() {
IrReceiver.begin(IR_RECEIVE_PIN);
for (int i = 0; i < NUM_LEDS; i++) {
pinMode(LED_PINS[i], OUTPUT);
digitalWrite(LED_PINS[i], LOW);
}
Serial.begin(9600);
}
void toggleLED(int ledIndex) {
if (ledIndex >= 0 && ledIndex < NUM_LEDS) {
boolean isLighted = digitalRead(LED_PINS[ledIndex]);
digitalWrite(LED_PINS[ledIndex], !isLighted);
}
}
void setAllLEDs(boolean state) {
for (int i = 0; i < NUM_LEDS; i++) {
digitalWrite(LED_PINS[i], state);
}
}
void garlandLEDs() {
setAllLEDs(LOW);
for (int i = 0; i < NUM_LEDS; i++) {
digitalWrite(LED_PINS[i], HIGH);
delay(100);
}
}
void loop() {
if (IrReceiver.decode()) {
long command = IrReceiver.decodedIRData.command;
Serial.println(command, HEX);
if (command == 0xA2) {
garlandLEDs();
} else if (command == 0xB0) {
setAllLEDs(LOW);
} else {
for (int i = 0; i < NUM_BUTTONS; i++) {
if (BUTTON_MAP[i].code == command) {
toggleLED(BUTTON_MAP[i].ledIndex);
break;
}
}
}
IrReceiver.resume();
}
}