Skip to content

Commit

Permalink
Hitachi heatpump support
Browse files Browse the repository at this point in the history
  • Loading branch information
ToniA committed Feb 21, 2017
1 parent f18571c commit f4c4956
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 1 deletion.
146 changes: 146 additions & 0 deletions HitachiHeatpumpIR.cpp
@@ -0,0 +1,146 @@
#include <HitachiHeatpumpIR.h>

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);
}
48 changes: 48 additions & 0 deletions HitachiHeatpumpIR.h
@@ -0,0 +1,48 @@
/*
Hitachi RAR-5E1 remote
*/
#ifndef HitachiHeatpumpIR_h
#define HitachiHeatpumpIR_h

#include <HeatpumpIR.h>

// 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
3 changes: 2 additions & 1 deletion examples/simple/simple.ino
Expand Up @@ -17,6 +17,7 @@
#include <ToshibaHeatpumpIR.h>
#include <ToshibaDaiseikaiHeatpumpIR.h>
#include <IVTHeatpumpIR.h>
#include <HitachiHeatpumpIR.h>


#ifndef ESP8266
Expand All @@ -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()
Expand Down
1 change: 1 addition & 0 deletions keywords.txt
Expand Up @@ -29,6 +29,7 @@ GreeYANHeatpumpIR KEYWORD1
FuegoHeatpumpIR KEYWORD1
ToshibaHeatpumpIR KEYWORD1
IVTHeatpumpIR KEYWORD1
HitachiHeatpumpIR KEYWORD1

IRSender KEYWORD1
IRSenderPWM KEYWORD1
Expand Down

0 comments on commit f4c4956

Please sign in to comment.