#include <IRremote.hpp>
//
// Datentypen definieren
//
enum class State : byte { unknown, ledcode, controlcode };
struct CheckResult {
State state;
int8_t index;
};
struct IRLedCode {
const IRRawDataType irCode;
const uint8_t pin;
};
struct IRControlCode {
const IRRawDataType irCode;
void (*fp)();
};
//
// Globale Daten initialisieren
//
constexpr uint8_t irReceiverPin {12};
// Sollte eine LED dazukommen oder entfernt werden, einfach die Daten hier hinzufügen oder löschen.
// Keine Änderung im folgenden Code nötig.
const IRLedCode irLedCodes[] {
{0x9768FF00, 2}, // Taste 0
{0xCF30FF00, 3}, // Taste 1
{0xE718FF00, 4}, // Taste 2
{0x857AFF00, 5}, // Taste 3
{0xEF10FF00, 6} // Taste 4
};
// Sollte eine Kontrollfunktion dazukommen oder entfernt werden, einfach Code und
// die dazugehörige Lambda-Funktion hier hinzufügen oder löschen.
const IRControlCode irControlCodes[] {
{0x57A8FF00,
[]() {
for (auto const& led : irLedCodes) { digitalWrite(led.pin, HIGH); } // Alle LEDs an
} },
{0x4FB0FF00,
[]() {
for (auto const& led : irLedCodes) { digitalWrite(led.pin, LOW); } // Alle LEDs aus
} },
{0xDD22FF00, []() { // nur jede zweite LED anschalten.
irControlCodes[1].fp();
size_t i {0};
for (auto const& led : irLedCodes) {
if (!(i++ & 1)) { digitalWrite(led.pin, HIGH); }
} // Alle LEDs aus
}}
};
//
// Funktionen
//
int8_t getLedIndex(const IRRawDataType code) {
size_t i {0};
for (auto const& led : irLedCodes) {
if (led.irCode == code) { return i; }
++i;
}
return -1;
}
int8_t getControlIndex(const IRRawDataType code) {
size_t i {0};
for (auto const& control : irControlCodes) {
if (control.irCode == code) { return i; }
++i;
}
return -1;
}
CheckResult checkStatus(const IRRawDataType code) {
int8_t index = getControlIndex(code);
if (index > -1) { return {State::controlcode, index}; }
index = getLedIndex(code);
if (index > -1) { return {State::ledcode, index}; }
return {State::unknown, -1};
}
//
// Hauptprogramm
//
void setup() {
Serial.begin(115200);
IrReceiver.begin(irReceiverPin, DISABLE_LED_FEEDBACK);
for (auto const& led : irLedCodes) { pinMode(led.pin, OUTPUT); }
}
void loop() {
if (IrReceiver.decode()) {
CheckResult result = checkStatus(IrReceiver.decodedIRData.decodedRawData);
switch (result.state) {
case State::controlcode: irControlCodes[result.index].fp(); break;
case State::ledcode: digitalWrite(irLedCodes[result.index].pin, HIGH); break;
default: Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); break;
}
IrReceiver.resume();
delay(500);
}
}