From f4c495662b9b763448025974b673c8eb98579a98 Mon Sep 17 00:00:00 2001 From: ToniA Date: Tue, 21 Feb 2017 19:07:59 +0200 Subject: [PATCH] Hitachi heatpump support --- HitachiHeatpumpIR.cpp | 146 +++++++++++++++++++++++++++++++++++++ HitachiHeatpumpIR.h | 48 ++++++++++++ examples/simple/simple.ino | 3 +- keywords.txt | 1 + 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 HitachiHeatpumpIR.cpp create mode 100644 HitachiHeatpumpIR.h diff --git a/HitachiHeatpumpIR.cpp b/HitachiHeatpumpIR.cpp new file mode 100644 index 0000000..531b575 --- /dev/null +++ b/HitachiHeatpumpIR.cpp @@ -0,0 +1,146 @@ +#include + +HitachiHeatpumpIR::HitachiHeatpumpIR() : HeatpumpIR() +{ + static const char PROGMEM model[] PROGMEM = "hitachi"; + static const char PROGMEM info[] PROGMEM = "{\"mdl\":\"hitachi\",\"dn\":\"Hitachi\",\"mT\":16,\"xT\":32,\"fs\":4}"; + + _model = model; + _info = info; +} + +void HitachiHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVcmd, uint8_t swingHcmd) +{ + // Sensible defaults for the heat pump mode + uint8_t operatingMode = HITACHI_AIRCON1_MODE_HEAT; + uint8_t fanSpeed = HITACHI_AIRCON1_FAN_AUTO; + uint8_t temperature = 23; + uint8_t powerMode; + uint8_t swingV = HITACHI_AIRCON1_VDIR_AUTO; + uint8_t swingH = HITACHI_AIRCON1_HDIR_AUTO; + + if (powerModeCmd == POWER_OFF) + { + powerMode = HITACHI_AIRCON1_POWER_OFF; + } + else + { + powerMode = HITACHI_AIRCON1_POWER_ON; + } + + switch (operatingModeCmd) + { + case MODE_AUTO: + operatingMode = HITACHI_AIRCON1_MODE_AUTO; + break; + case MODE_HEAT: + operatingMode = HITACHI_AIRCON1_MODE_HEAT; + break; + case MODE_COOL: + operatingMode = HITACHI_AIRCON1_MODE_COOL; + break; + case MODE_DRY: + operatingMode = HITACHI_AIRCON1_MODE_DRY; + fanSpeedCmd = FAN_2; //Only speed 1 & 2 in dry mode + break; + case MODE_FAN: + operatingMode = HITACHI_AIRCON1_MODE_FAN; + temperatureCmd = 64; //Temperature = 64 in fan mode + if (fanSpeedCmd == FAN_AUTO) + { + fanSpeedCmd = FAN_2; //No auto fan in fan mode + } + break; + } + + switch (fanSpeedCmd) + { + case FAN_AUTO: + fanSpeed = HITACHI_AIRCON1_FAN_AUTO; + break; + case FAN_1: + fanSpeed = HITACHI_AIRCON1_FAN1; + break; + case FAN_2: + fanSpeed = HITACHI_AIRCON1_FAN2; + break; + case FAN_3: + fanSpeed = HITACHI_AIRCON1_FAN3; + break; + case FAN_4: + fanSpeed = HITACHI_AIRCON1_FAN4; + break; + case FAN_5: + fanSpeed = HITACHI_AIRCON1_FAN4; + break; + } + + if ((temperatureCmd > 15 && temperatureCmd < 33) || temperatureCmd == 64) + { + temperature = temperatureCmd; + } + + switch (swingV) + { + case HDIR_AUTO: + swingV = HITACHI_AIRCON1_VDIR_AUTO; + break; + case HDIR_SWING: + swingV = HITACHI_AIRCON1_VDIR_SWING; + break; + } + + switch (swingH) + { + case HDIR_AUTO: + swingH = HITACHI_AIRCON1_HDIR_AUTO; + break; + case HDIR_SWING: + swingH = HITACHI_AIRCON1_HDIR_SWING; + break; + } + + sendHitachi(IR, powerMode, operatingMode, fanSpeed, temperature, swingV, swingH); +} + +// Send the Hitachi code +void HitachiHeatpumpIR::sendHitachi(IRSender& IR, uint8_t powerMode, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH) +{ + + uint8_t hitachiTemplate[28] = { + 0x01, 0x10, 0x30, 0x40, 0xBF, 0x01, 0xFE, 0x11, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00 }; + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + + if(temperature == 16){ + hitachiTemplate[9] = 0x09; + } + hitachiTemplate[10] = operatingMode; + hitachiTemplate[11] = temperature; + hitachiTemplate[11] = (hitachiTemplate[11] << 1); + hitachiTemplate[13] = fanSpeed; + hitachiTemplate[14] |= swingV; + hitachiTemplate[15] |= swingH; + hitachiTemplate[17] = powerMode; + //hitachiTemplate[25] = ecoMode; + + //Checksum calculation + int checksum = 1086; + for (byte i = 0; i < 27; i++) { + checksum -= hitachiTemplate[i]; + } + hitachiTemplate[27] = checksum; + + // 38 kHz PWM frequency + IR.setFrequency(38); + + // Header + IR.mark(HITACHI_AIRCON1_HDR_MARK); + IR.space(HITACHI_AIRCON1_HDR_SPACE); + + // Data + for (int i=0; i<28; i++) { + IR.sendIRbyte(hitachiTemplate[i], HITACHI_AIRCON1_BIT_MARK, HITACHI_AIRCON1_ZERO_SPACE, HITACHI_AIRCON1_ONE_SPACE); + } + IR.mark(HITACHI_AIRCON1_BIT_MARK); + IR.space(0); +} diff --git a/HitachiHeatpumpIR.h b/HitachiHeatpumpIR.h new file mode 100644 index 0000000..124d433 --- /dev/null +++ b/HitachiHeatpumpIR.h @@ -0,0 +1,48 @@ +/* + Hitachi RAR-5E1 remote +*/ +#ifndef HitachiHeatpumpIR_h +#define HitachiHeatpumpIR_h + +#include + +// Hitachi remote timing constants +#define HITACHI_AIRCON1_HDR_MARK 3436 +#define HITACHI_AIRCON1_HDR_SPACE 1640 +#define HITACHI_AIRCON1_BIT_MARK 420 +#define HITACHI_AIRCON1_ONE_SPACE 1250 +#define HITACHI_AIRCON1_ZERO_SPACE 500 + +// Hitachi codes +#define HITACHI_AIRCON1_MODE_AUTO 0x02 // Operating mode +#define HITACHI_AIRCON1_MODE_HEAT 0x03 +#define HITACHI_AIRCON1_MODE_COOL 0x04 +#define HITACHI_AIRCON1_MODE_DRY 0x05 +#define HITACHI_AIRCON1_MODE_FAN 0x0C + +#define HITACHI_AIRCON1_POWER_OFF 0x00 // Power OFF +#define HITACHI_AIRCON1_POWER_ON 0x80 + +#define HITACHI_AIRCON1_FAN_AUTO 0x01 // Fan speed +#define HITACHI_AIRCON1_FAN1 0x02 +#define HITACHI_AIRCON1_FAN2 0x03 +#define HITACHI_AIRCON1_FAN3 0x04 +#define HITACHI_AIRCON1_FAN4 0x05 + +#define HITACHI_AIRCON1_VDIR_AUTO 0x00 +#define HITACHI_AIRCON1_VDIR_SWING 0x01 + +#define HITACHI_AIRCON1_HDIR_AUTO 0x00 +#define HITACHI_AIRCON1_HDIR_SWING 0x01 + +class HitachiHeatpumpIR : public HeatpumpIR +{ + public: + HitachiHeatpumpIR(); + void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVcmd, uint8_t swingHcmd); + + private: + void sendHitachi(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH); +}; + +#endif diff --git a/examples/simple/simple.ino b/examples/simple/simple.ino index 8b62eb0..e2eefbd 100644 --- a/examples/simple/simple.ino +++ b/examples/simple/simple.ino @@ -17,6 +17,7 @@ #include #include #include +#include #ifndef ESP8266 @@ -38,7 +39,7 @@ HeatpumpIR *heatpumpIR[] = {new PanasonicCKPHeatpumpIR(), new PanasonicDKEHeatpu new HyundaiHeatpumpIR(), new HisenseHeatpumpIR(), new GreeGenericHeatpumpIR(), new GreeYANHeatpumpIR(), new FuegoHeatpumpIR(), new ToshibaHeatpumpIR(), new ToshibaDaiseikaiHeatpumpIR(), - new IVTHeatpumpIR(), + new IVTHeatpumpIR(), new HitachiHeatpumpIR(), NULL}; void setup() diff --git a/keywords.txt b/keywords.txt index 5b5286c..b474ddc 100644 --- a/keywords.txt +++ b/keywords.txt @@ -29,6 +29,7 @@ GreeYANHeatpumpIR KEYWORD1 FuegoHeatpumpIR KEYWORD1 ToshibaHeatpumpIR KEYWORD1 IVTHeatpumpIR KEYWORD1 +HitachiHeatpumpIR KEYWORD1 IRSender KEYWORD1 IRSenderPWM KEYWORD1