diff --git a/MitsubishiMSCHeatpumpIR.cpp b/MitsubishiMSCHeatpumpIR.cpp new file mode 100644 index 0000000..d453ab7 --- /dev/null +++ b/MitsubishiMSCHeatpumpIR.cpp @@ -0,0 +1,155 @@ +#include + + +MitsubishiMSCHeatpumpIR::MitsubishiMSCHeatpumpIR() : HeatpumpIR() +{ + static const char model[] PROGMEM = "mitsubishi_msc"; + static const char info[] PROGMEM = "{\"mdl\":\"mitsubishi_msc\",\"dn\":\"Mitsubishi MSC\",\"mT\":17,\"xT\":30,\"fs\":3}"; + + _model = model; + _info = info; +} + + +void MitsubishiMSCHeatpumpIR::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 powerMode = MITSUBISHIMSC_AIRCON1_MODE_ON; + uint8_t operatingMode = MITSUBISHIMSC_AIRCON1_MODE_AUTO; + uint8_t fanSpeed = MITSUBISHIMSC_AIRCON1_FAN_AUTO; + uint8_t temperature = 23; + uint8_t swingV = MITSUBISHIMSC_AIRCON1_VS_AUTO; + uint8_t swingH = 0x00; + + switch (powerModeCmd) + { + case POWER_OFF: + powerMode = MITSUBISHIMSC_AIRCON1_MODE_OFF; + } + + switch (operatingModeCmd) + { + case MODE_AUTO: + operatingMode = MITSUBISHIMSC_AIRCON1_MODE_AUTO; + break; + case MODE_HEAT: + operatingMode = MITSUBISHIMSC_AIRCON1_MODE_HEAT; + break; + case MODE_COOL: + operatingMode = MITSUBISHIMSC_AIRCON1_MODE_COOL; + break; + case MODE_DRY: + operatingMode = MITSUBISHIMSC_AIRCON1_MODE_DRY; + break; + case MODE_FAN: + operatingMode = MITSUBISHIMSC_AIRCON1_MODE_FAN; + break; + } + + switch (fanSpeedCmd) + { + case FAN_AUTO: + fanSpeed = MITSUBISHIMSC_AIRCON1_FAN_AUTO; + break; + case FAN_1: + fanSpeed = MITSUBISHIMSC_AIRCON1_FAN1; + break; + case FAN_2: + fanSpeed = MITSUBISHIMSC_AIRCON1_FAN2; + break; + case FAN_3: + fanSpeed = MITSUBISHIMSC_AIRCON1_FAN3; + break; + } + + switch (swingVCmd) + { + case VDIR_SWING: + swingV = MITSUBISHIMSC_AIRCON1_VS_SWING; + break; + case VDIR_AUTO: + swingV = MITSUBISHIMSC_AIRCON1_VS_AUTO; + break; + case VDIR_UP: + swingV = MITSUBISHIMSC_AIRCON1_VS_UP; + break; + case VDIR_MUP: + swingV = MITSUBISHIMSC_AIRCON1_VS_MUP; + break; + case VDIR_MIDDLE: + swingV = MITSUBISHIMSC_AIRCON1_VS_MIDDLE; + break; + case VDIR_MDOWN: + swingV = MITSUBISHIMSC_AIRCON1_VS_MDOWN; + break; + case VDIR_DOWN: + swingV = MITSUBISHIMSC_AIRCON1_VS_DOWN; + break; + } + + if ( temperatureCmd >= 16 && temperatureCmd <= 31) + { + temperature = temperatureCmd; + } + + sendMitsubishiMSC(IR, powerMode, operatingMode, fanSpeed, temperature, swingV, swingH); +} + + +void MitsubishiMSCHeatpumpIR::sendMitsubishiMSC(IRSender& IR, uint8_t powerMode, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH) +{ + uint8_t MitsubishiTemplate[] = { 0x23, 0xCB, 0x26, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + + uint8_t templateSize = sizeof(MitsubishiTemplate); + uint8_t checksum = 0x00; + + // Set the power mode on the template message + MitsubishiTemplate[5] = powerMode; + + // Set the operating mode on the template message + MitsubishiTemplate[6] = operatingMode; + + // Set the temperature on the template message + MitsubishiTemplate[7] = 31 - temperature; + + // Set the fan speed and vertical air direction on the template message + MitsubishiTemplate[8] = fanSpeed | swingV; + + // Checksum + + for (int i=0; i + +// Mitsubishi MSC timing constants +#define MITSUBISHIMSC_AIRCON1_HDR_MARK 3060 +#define MITSUBISHIMSC_AIRCON1_HDR_SPACE 1580 +#define MITSUBISHIMSC_AIRCON1_BIT_MARK 350 +#define MITSUBISHIMSC_AIRCON1_ONE_SPACE 1150 +#define MITSUBISHIMSC_AIRCON1_ZERO_SPACE 390 +#define MITSUBISHIMSC_AIRCON1_MSG_SPACE 0 + +// Mitsubishi MSC codes +#define MITSUBISHIMSC_AIRCON1_MODE_AUTO 0x08 // Operating mode +#define MITSUBISHIMSC_AIRCON1_MODE_HEAT 0x01 +#define MITSUBISHIMSC_AIRCON1_MODE_COOL 0x03 +#define MITSUBISHIMSC_AIRCON1_MODE_DRY 0x02 +#define MITSUBISHIMSC_AIRCON1_MODE_FAN 0x07 +#define MITSUBISHIMSC_AIRCON1_MODE_OFF 0x20 // Power OFF +#define MITSUBISHIMSC_AIRCON1_MODE_ON 0x24 // Power ON +#define MITSUBISHIMSC_AIRCON1_FAN_AUTO 0x00 // Fan speeds +#define MITSUBISHIMSC_AIRCON1_FAN1 0x02 +#define MITSUBISHIMSC_AIRCON1_FAN2 0x03 +#define MITSUBISHIMSC_AIRCON1_FAN3 0x05 +#define MITSUBISHIMSC_AIRCON1_VS_SWING 0x38 // Vertical swing +#define MITSUBISHIMSC_AIRCON1_VS_AUTO 0x00 +#define MITSUBISHIMSC_AIRCON1_VS_UP 0x08 +#define MITSUBISHIMSC_AIRCON1_VS_MUP 0x10 +#define MITSUBISHIMSC_AIRCON1_VS_MIDDLE 0x18 +#define MITSUBISHIMSC_AIRCON1_VS_MDOWN 0x20 +#define MITSUBISHIMSC_AIRCON1_VS_DOWN 0x28 + + +class MitsubishiMSCHeatpumpIR : public HeatpumpIR +{ + public: + MitsubishiMSCHeatpumpIR(); + void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd); + + private: + void sendMitsubishiMSC(IRSender& IR, uint8_t powerMode, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingVCmd, uint8_t swingHCmd); +}; + +#endif diff --git a/README.md b/README.md index e272147..85726c0 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ An Arduino library to control pump/split unit air conditioner. Currently support * Mitsubishi Heavy FDTCxxVF (Remote Control P/N PJA502A704AA) * Mitsubishi MSZ FD-25, probably also FD-35 (remote control P/N KM09D 0052376) * Also FH series has been confirmed to work +* Mitsubishi Electric MSC-GA20VB, MSC-GA25VB, MSC-GA35VB (remote control P/N KP1A) * Panasonic E9/E12-CKP (Panasonic remote control P/N A75C2295) * Panasonic E9/E12-DKE (Panasonic remote control P/N A75C2616) * Panasonic E9/E12-JKE and E9/E12-NKE