#include <IRremote.h>
#define PIN_RECEIVER 2
struct IntBoolPair {
int key;
bool value;
};
IntBoolPair ledState[16] = {
{0, false}, {1, false}, {2, false}, {3, false},
{4, false}, {5, false}, {6, false}, {7, false},
{8, false}, {9, false}, {10, false}, {11, false},
{12, false}, {13, false}, {14, false}, {15, false}
};
IRrecv receiver(PIN_RECEIVER);
int datapin = 7;
int clockpin = 3;
int latchpin = 4;
byte data = 0;
int datapin2 = 8;
int clockpin2 = 11;
int latchpin2 = 12;
byte data2 = 0;
void setup()
{
receiver.enableIRIn();
pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(datapin2, OUTPUT);
pinMode(clockpin2, OUTPUT);
pinMode(latchpin2, OUTPUT);
}
void loop()
{
if (receiver.decode()) {
translateIR();
receiver.resume();
}
}
void lcdPrint(char* text)
{
Serial.println(text);
}
void translateIR()
{
switch (receiver.decodedIRData.command) {
case 162:
switchOnAll();
break;
case 104:
ledControl(0, 0);
break;
case 176:
switchOffAll();
break;
case 48:
ledControl(1, 0);
break;
case 24:
ledControl(2, 0);
break;
case 122:
ledControl(3, 0);
break;
case 16:
ledControl(4, 0);
break;
case 56:
ledControl(5, 0);
break;
case 90:
ledControl(6, 0);
break;
case 66:
ledControl(7, 0);
break;
case 74:
ledControl(8, 0);
break;
case 82:
ledControl(9, 0);
break;
default:
lcdPrint("Other button");
}
}
void switchOnAll() {
for (int i = 0; i < 16; i++) {
delay(500);
ledControl(i, 2);
}
}
void switchOffAll() {
for (int i = 0; i < 16; i++) {
ledControl(i, 1);
}
}
void ledControl(int ledNum, int forceState) {
if (ledState[ledNum].value == true) {
ledState[ledNum].value = false;
} else {
ledState[ledNum].value = true;
}
if (forceState == 1) {
ledState[ledNum].value = false;
} else if (forceState == 2) {
ledState[ledNum].value = true;
}
shiftWrite(ledNum, ledState[ledNum].value);
}
void shiftWrite(int desiredPin, boolean desiredState){
if (desiredPin < 8) {
bitWrite(data2,desiredPin,desiredState);
shiftOut(datapin2, clockpin2, MSBFIRST, data2);
digitalWrite(latchpin2, HIGH);
digitalWrite(latchpin2, LOW);
} else {
bitWrite(data,desiredPin-8,desiredState);
shiftOut(datapin, clockpin, LSBFIRST, data);
digitalWrite(latchpin, HIGH);
digitalWrite(latchpin, LOW);
}
}