From 76f34c4e47d8aebd7ecfa85612f1cdd05cfd01c4 Mon Sep 17 00:00:00 2001 From: ToniA Date: Fri, 30 Sep 2016 19:56:42 +0300 Subject: [PATCH] Support for Toshiba RAS-10PKVP-ND --- ToshibaHeatpumpIR.cpp | 118 +++++++++++++++++++++++++++++++++++++ ToshibaHeatpumpIR.h | 41 +++++++++++++ examples/simple/simple.ino | 3 +- keywords.txt | 1 + 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 ToshibaHeatpumpIR.cpp create mode 100644 ToshibaHeatpumpIR.h diff --git a/ToshibaHeatpumpIR.cpp b/ToshibaHeatpumpIR.cpp new file mode 100644 index 0000000..50c40bb --- /dev/null +++ b/ToshibaHeatpumpIR.cpp @@ -0,0 +1,118 @@ +#include + + +ToshibaHeatpumpIR::ToshibaHeatpumpIR() +{ + static const char PROGMEM model[] PROGMEM = "toshiba"; + static const char PROGMEM info[] PROGMEM = "{\"mdl\":\"toshiba\",\"dn\":\"Toshiba\",\"mT\":17,\"xT\":30,\"fs\":5}"; + + _model = model; + _info = info; +} + + +void ToshibaHeatpumpIR::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 = TOSHIBA_AIRCON1_MODE_HEAT; + uint8_t fanSpeed = TOSHIBA_AIRCON1_FAN_AUTO; + uint8_t temperature = 23; + + (void)swingVCmd; + (void)swingHCmd; + + + if (powerModeCmd == POWER_OFF) + { + operatingMode = TOSHIBA_AIRCON1_MODE_OFF; + } + else + { + switch (operatingModeCmd) + { + case MODE_AUTO: + operatingMode = TOSHIBA_AIRCON1_MODE_AUTO; + break; + case MODE_COOL: + operatingMode = TOSHIBA_AIRCON1_MODE_COOL; + break; + case MODE_DRY: + operatingMode = TOSHIBA_AIRCON1_MODE_DRY; + break; + case MODE_FAN: + operatingMode = TOSHIBA_AIRCON1_MODE_COOL; + temperatureCmd = 30; + break; + } + } + + switch (fanSpeedCmd) + { + case FAN_AUTO: + fanSpeed = TOSHIBA_AIRCON1_FAN_AUTO; + break; + case FAN_1: + fanSpeed = TOSHIBA_AIRCON1_FAN1; + break; + case FAN_2: + fanSpeed = TOSHIBA_AIRCON1_FAN2; + break; + case FAN_3: + fanSpeed = TOSHIBA_AIRCON1_FAN3; + break; + case FAN_4: + fanSpeed = TOSHIBA_AIRCON1_FAN4; + break; + case FAN_5: + fanSpeed = TOSHIBA_AIRCON1_FAN5; + break; + } + + if (temperatureCmd > 16 && temperatureCmd < 31) + { + temperature = temperatureCmd; + } + + sendToshiba(IR, operatingMode, fanSpeed, temperature, 0, 0); +} + + +void ToshibaHeatpumpIR::sendToshiba(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH) +{ + uint8_t ToshibaTemplate[] = { 0x4F, 0xB0, 0xC0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00 }; + // 0 1 2 3 4 5 6 7 8 + + uint8_t checksum = 0x00; + (void)swingV; + (void)swingH; + + // Set the operatingmode on the template message + ToshibaTemplate[6] |= operatingMode | fanSpeed; + + // Set the temperature on the template message + ToshibaTemplate[5] |= (IR.bitReverse(temperature - 17)) >> 4; + + // Calculate the checksum + for (uint8_t i = 0; i < 8; i++) { + checksum ^= ToshibaTemplate[i]; + } + + ToshibaTemplate[8] = checksum; + + // 38 kHz PWM frequency + IR.setFrequency(38); + + // Header + IR.mark(TOSHIBA_AIRCON1_HDR_MARK); + IR.space(TOSHIBA_AIRCON1_HDR_SPACE); + + // Data + for (unsigned int i=0; i + + +//Toshiba timing constants +#define TOSHIBA_AIRCON1_HDR_MARK 4400 +#define TOSHIBA_AIRCON1_HDR_SPACE 4400 +#define TOSHIBA_AIRCON1_BIT_MARK 550 +#define TOSHIBA_AIRCON1_ONE_SPACE 1600 +#define TOSHIBA_AIRCON1_ZERO_SPACE 550 + + +// Toshiba codes +#define TOSHIBA_AIRCON1_MODE_AUTO 0x00 // Operating mode +#define TOSHIBA_AIRCON1_MODE_HEAT 0xC0 +#define TOSHIBA_AIRCON1_MODE_COOL 0x80 +#define TOSHIBA_AIRCON1_MODE_DRY 0x40 +#define TOSHIBA_AIRCON1_MODE_OFF 0xE0 +#define TOSHIBA_AIRCON1_FAN_AUTO 0x00 // Fan speed +#define TOSHIBA_AIRCON1_FAN1 0x02 +#define TOSHIBA_AIRCON1_FAN2 0x06 +#define TOSHIBA_AIRCON1_FAN3 0x01 +#define TOSHIBA_AIRCON1_FAN4 0x05 +#define TOSHIBA_AIRCON1_FAN5 0x03 + +class ToshibaHeatpumpIR : public HeatpumpIR +{ + public: + ToshibaHeatpumpIR(); + void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd); + + private: + void sendToshiba(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingVCmd, uint8_t swingHCmd); +}; + +#endif diff --git a/examples/simple/simple.ino b/examples/simple/simple.ino index 87f265c..a3c69fc 100644 --- a/examples/simple/simple.ino +++ b/examples/simple/simple.ino @@ -14,6 +14,7 @@ #include #include #include +#include #ifndef ESP8266 @@ -32,7 +33,7 @@ HeatpumpIR *heatpumpIR[] = {new PanasonicCKPHeatpumpIR(), new PanasonicDKEHeatpu new SamsungHeatpumpIR(), new SharpHeatpumpIR(), new DaikinHeatpumpIR(), new MitsubishiHeavyZJHeatpumpIR(), new MitsubishiHeavyZMHeatpumpIR(), new HyundaiHeatpumpIR(), new HisenseHeatpumpIR(), new GreeHeatpumpIR(), - new FuegoHeatpumpIR(), + new FuegoHeatpumpIR(), new ToshibaHeatpumpIR(), NULL}; void setup() diff --git a/keywords.txt b/keywords.txt index 1fdea33..f1ac4a2 100644 --- a/keywords.txt +++ b/keywords.txt @@ -23,6 +23,7 @@ HyundaiHeatpumpIR KEYWORD1 HisenseHeatpumpIR KEYWORD1 GreeHeatpumpIR KEYWORD1 FuegoHeatpumpIR KEYWORD1 +ToshibaHeatpumpIR KEYWORD1 IRSender KEYWORD1 IRSenderPWM KEYWORD1