#define DECODE_NEC // DECODE_NEC
#include <IRremote.hpp> // Do not change header order.
class FanTimer {
public:
void start() { timeStamp = millis(); }
bool operator()(const unsigned long duration) {
return (millis() - timeStamp >= duration) ? true : false;
}
private:
unsigned long timeStamp{0};
};
FanTimer fanTimer;
constexpr uint32_t S1_ACTIVE_DURATION_MS {5000}; // 5 Sekunden
constexpr uint32_t S3_START_DURATION_MS {5000}; // 5 Sekunden
constexpr uint32_t S3_ACTIVE_DURATION_MS {5000}; // 5 Sekunden
constexpr uint8_t RECV_PIN {2};
constexpr uint8_t FAN_PIN {12};
constexpr uint16_t S1 {0x30}; // Taste 1
constexpr uint16_t S2 {0x18}; // Taste 2
constexpr uint16_t S3 {0x7A}; // Taste 3
enum class FanState : uint8_t {OFF, WAIT_S1_OFF, WAIT_S3_ON, WAIT_S3_OFF};
struct FanData {
const uint8_t pin{FAN_PIN};
FanState state {FanState::OFF};
FanTimer fanTimer;
};
FanData fanData;
void checkIrSwitch(uint16_t, FanData &);
void checkState(FanData &);
void setup()
{
Serial.begin(9600);
pinMode (fanData.pin, OUTPUT); // Lüfter
digitalWrite (fanData.pin, LOW);
IrReceiver.begin(RECV_PIN);
Serial.print(F("Ready to receive IR signals at pin "));
Serial.println(RECV_PIN);
}
void loop()
{
checkIrSwitch(irReceive(), fanData);
checkState(fanData);
}
void checkIrSwitch(uint16_t irSw, FanData &fd) {
switch (irSw) {
case S1:
if (fd.state == FanState::OFF) {
digitalWrite (fd.pin, HIGH);
Serial.println(F("Taste 1: gestartet. Warte auf Ablauf"));
fd.state = FanState::WAIT_S1_OFF;
fd.fanTimer.start();
}
break;
case S2:
if (fd.state != FanState::OFF) {
fd.state = FanState::OFF;
digitalWrite (fd.pin, LOW);
Serial.println(F("Taste 2: Vorgang abgebrochen"));
}
break;
case S3:
//if (state == FanState::OFF) {
digitalWrite(fd.pin,LOW);
fd.state = FanState::WAIT_S3_ON;
Serial.println(F("Taste 3: Anlaufzeit gestartet"));
fd.fanTimer.start();
//}
break;
}
}
void checkState(FanData &fd) {
switch (fd.state) {
case FanState::OFF: break;
case FanState::WAIT_S3_ON:
if (fd.fanTimer(S3_START_DURATION_MS)) {
digitalWrite (fd.pin, HIGH);
fd.state = FanState::WAIT_S3_OFF;
Serial.println(F("Taste 3: Warte auf Ablauf"));
fd.fanTimer.start();
}
break;
case FanState::WAIT_S3_OFF:
if (fd.fanTimer(S3_ACTIVE_DURATION_MS)) {
digitalWrite (fd.pin, LOW);
fd.state = FanState::OFF;
Serial.println(F("Taste 3: Vorgang beendet"));
}
break;
case FanState::WAIT_S1_OFF:
if (fd.fanTimer(S1_ACTIVE_DURATION_MS)) {
digitalWrite (fd.pin, LOW);
fd.state = FanState::OFF;
Serial.println(F("Taste 1: Vorgang beendet"));
}
break;
}
}
uint16_t irReceive() {
uint16_t received{0};
if (IrReceiver.decode()) {
//IrReceiver.printIRResultShort(&Serial);
// if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
// // We have an unknown protocol here, print more info
// IrReceiver.printIRResultRawFormatted(&Serial, true);
// }
if (IrReceiver.decodedIRData.protocol == NEC) {
received = IrReceiver.decodedIRData.command;
//Serial.print("Command: 0x");
//Serial.println(received, HEX);
}
IrReceiver.resume();
}
return received;
}