#include <IRremote.hpp>
/*
http://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/diy-do-it-yourself/37790-hob2hood-ir-protokoll-arduino/page2
*/
// IR commands from AEG hob2hood device
#define IRCMD_VENT_1 0xE3C01BE2
#define IRCMD_VENT_2 0xD051C301
#define IRCMD_VENT_3 0xC22FFFD7
#define IRCMD_VENT_4 0xB9121B29
#define IRCMD_VENT_OFF 0x55303A3
#define IRCMD_LIGHT_ON 0xE208293C
#define IRCMD_LIGHT_OFF 0x24ACF947
// Pins for the output which controls relais which control the hood
#define PIN_OUT_OFF A3
#define PIN_OUT_VENT_1 4
#define PIN_OUT_VENT_2 7
#define PIN_OUT_VENT_3 8
#define PIN_OUT_LIGHT 9
// IR Receiver PIN
#define PIN_IR_RECEIVER 2
#define MODE_HOB2HOOD 0
#define MODE_MANUAL 1
// ventilation, light and mode status
int ventilation = 0;
int last_ventilation = 0;
int light = 0;
int last_light = 0;
int mode = 0; // 0 = hob2hood control, 1 = manual control
IRrecv irrecv(PIN_IR_RECEIVER); // create instance of 'irrecv'
decode_results results;
#define OFF HIGH
#define ON LOW
void setup() {
// Setup relay-outputs
pinMode(PIN_OUT_VENT_1, OUTPUT);
pinMode(PIN_OUT_VENT_2, OUTPUT);
pinMode(PIN_OUT_VENT_3, OUTPUT);
pinMode(PIN_OUT_LIGHT, OUTPUT);
// define startup-state
digitalWrite(PIN_OUT_VENT_1, OFF);
digitalWrite(PIN_OUT_VENT_2, OFF);
digitalWrite(PIN_OUT_VENT_3, OFF);
digitalWrite(PIN_OUT_LIGHT, OFF);
Serial.begin(9600); // for serial monitor output
Serial.println("Hob2Hood Starting ...");
Serial.println(" ... Setup IR receiver");
IrReceiver.begin(PIN_IR_RECEIVER, ENABLE_LED_FEEDBACK);
Serial.println("Hob2Hood ready ...");
}
void loop() {
// read manual control telegram
int inCommand = -1;
// if any of the manual control inputs is IN USE (analog value >512) --> manual mode
if (inCommand >= 0) {
if (mode == MODE_HOB2HOOD) {
mode = MODE_MANUAL;
Serial.println("Switching to manual mode");
}
switch (inCommand) {
case 0:
// set ventilation off
last_ventilation = ventilation;
ventilation = 0;
break;
case 1:
// set ventilation speed 1
last_ventilation = ventilation;
ventilation = 1;
break;
case 2:
// set ventilation speed 2
last_ventilation = ventilation;
ventilation = 2;
break;
case 3:
// set ventilation speed 3
last_ventilation = ventilation;
ventilation = 3;
break;
case 4:
// set ventilation turbo speed
last_ventilation = ventilation;
ventilation = 4;
break;
case 5:
// set light on
last_light = light;
light = 1;
break;
case 6:
// set light off
last_light = light;
light = 0;
break;
}
controlHood();
} else {
// now we are in HOB2HOOD-mode, because no manual control is in use
// check for previous mode
if (mode == MODE_MANUAL) {
Serial.println("Switching to Hob2Hood mode");
// set to initial state
ventilation = 0;
light = 0;
controlHood();
// and switch to hob2hood mode
mode = MODE_HOB2HOOD;
irrecv.resume();
}
receiveIRCommand();
}
}
// Receive and decode IR commands and control hood upon received command
void receiveIRCommand() {
// have we received an IR signal?
if (irrecv.decode(&results)) {
Serial.println("Received IR command: ");
Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
switch (results.value) {
case IRCMD_LIGHT_ON:
light = 1;
break;
case IRCMD_LIGHT_OFF:
light = 0;
break;
case IRCMD_VENT_1:
ventilation = 1;
break;
case IRCMD_VENT_2:
ventilation = 2;
break;
case IRCMD_VENT_3:
ventilation = 3;
break;
case IRCMD_VENT_4:
ventilation = 4;
break;
case IRCMD_VENT_OFF:
ventilation = 0;
break;
default:
break;
}
controlHood();
irrecv.resume(); // receive the next value
}
}
// control hood based on 'light' and 'ventilation' variables
void controlHood() {
bool logLight = light!=last_light;
bool logVent = ventilation!=last_ventilation;
// control light
switch (light) {
// Light OFF
case 0:
if (logLight) Serial.println("Light: OFF");
digitalWrite(PIN_OUT_LIGHT, OFF);
delay(10);
break;
// Light ON
case 1:
if (logLight) Serial.println("Light: ON");
digitalWrite(PIN_OUT_LIGHT, ON);
delay(10);
break;
default:
break;
}
// control ventilation
switch (ventilation) {
// Ventilation OFF
case 0:
if (logVent) Serial.println("Ventilation: OFF");
digitalWrite(PIN_OUT_VENT_1, OFF);
digitalWrite(PIN_OUT_VENT_2, OFF);
digitalWrite(PIN_OUT_VENT_3, OFF);
delay(10);
break;
// Ventilation Speed 1
case 1:
if (logVent) Serial.println("Ventilation: 1");
digitalWrite(PIN_OUT_VENT_2, OFF);
digitalWrite(PIN_OUT_VENT_3, OFF);
delay(100);
digitalWrite(PIN_OUT_VENT_1, ON);
delay(10);
delay(10);
break;
// Ventilation Speed 2
case 2:
if (logVent) Serial.println("Ventilation: 2");
digitalWrite(PIN_OUT_VENT_1, OFF);
digitalWrite(PIN_OUT_VENT_3, OFF);
delay(100);
digitalWrite(PIN_OUT_VENT_2, ON);
delay(10);
break;
// Ventilation Speed 3
case 3:
if (logVent) Serial.println("Ventilation: 3");
digitalWrite(PIN_OUT_VENT_1, OFF);
digitalWrite(PIN_OUT_VENT_2, OFF);
delay(100);
digitalWrite(PIN_OUT_VENT_3, ON);
delay(10);
break;
// Ventilation Speed 4
case 4:
if (logVent) Serial.println("Ventilation: turbo");
digitalWrite(PIN_OUT_VENT_1, OFF);
digitalWrite(PIN_OUT_VENT_2, OFF);
delay(100);
digitalWrite(PIN_OUT_VENT_3, ON);
delay(2000);
break;
default:
break;
}
last_light = light;
last_ventilation = ventilation;
}