arduino-heatpumpir/MitsubishiMSCHeatpumpIR.cpp

155 lines
4.1 KiB
C++

#include <MitsubishiMSCHeatpumpIR.h>
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<templateSize; i++) {
checksum += MitsubishiTemplate[i];
}
MitsubishiTemplate[templateSize - 1] = checksum;
#ifdef IR_DEBUG_PACKET
char pbyte[16];
for (int i=0; i<templateSize; i++) {
checksum += MitsubishiTemplate[i];
sprintf_P(pbyte, PSTR(",%02x"),(int) MitsubishiTemplate[i]);
LOG(pbyte);
}
LOGLN("");
#endif
// 38 kHz PWM frequency
IR.setFrequency(38);
// Header
IR.mark(MITSUBISHIMSC_AIRCON1_HDR_MARK);
IR.space(MITSUBISHIMSC_AIRCON1_HDR_SPACE);
// Data
for (unsigned int i=0; i<templateSize; i++) {
IR.sendIRbyte(MitsubishiTemplate[i], MITSUBISHIMSC_AIRCON1_BIT_MARK, MITSUBISHIMSC_AIRCON1_ZERO_SPACE, MITSUBISHIMSC_AIRCON1_ONE_SPACE);
}
// End mark
IR.mark(MITSUBISHIMSC_AIRCON1_BIT_MARK);
IR.space(0);
}