Skip to content

Commit 312914c

Browse files
ToniAToniA
ToniA
authored and
ToniA
committedNov 9, 2015
First attempt to support Daikin heatpumps
1 parent 9c1b812 commit 312914c

File tree

3 files changed

+191
-0
lines changed

3 files changed

+191
-0
lines changed
 

‎DaikinHeatpumpIR.cpp

+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include <DaikinHeatpumpIR.h>
2+
3+
DaikinHeatpumpIR::DaikinHeatpumpIR() : HeatpumpIR()
4+
{
5+
static const char PROGMEM model[] PROGMEM = "daikin";
6+
static const char PROGMEM info[] PROGMEM = "{\"mdl\":\"daikin\",\"dn\":\"Daikin\",\"mT\":18,\"xT\":30,\"fs\":6,\"maint\":[10,11,12,13,14,15,16,17]}}}";
7+
8+
_model = model;
9+
_info = info;
10+
}
11+
12+
13+
// Daikin numeric values to command bytes
14+
void DaikinHeatpumpIR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd)
15+
{
16+
// Sensible defaults for the heat pump mode
17+
18+
uint8_t operatingMode = DAIKIN_AIRCON_MODE_OFF | DAIKIN_AIRCON_MODE_AUTO;
19+
uint8_t fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
20+
uint8_t temperature = 23;
21+
22+
switch (powerModeCmd)
23+
{
24+
case POWER_ON:
25+
operatingMode |= DAIKIN_AIRCON_MODE_ON;
26+
break;
27+
}
28+
29+
switch (operatingModeCmd)
30+
{
31+
case MODE_AUTO:
32+
operatingMode |= DAIKIN_AIRCON_MODE_AUTO;
33+
break;
34+
case MODE_HEAT:
35+
operatingMode |= DAIKIN_AIRCON_MODE_HEAT;
36+
break;
37+
case MODE_COOL:
38+
operatingMode |= DAIKIN_AIRCON_MODE_COOL;
39+
break;
40+
case MODE_DRY:
41+
operatingMode |= DAIKIN_AIRCON_MODE_DRY;
42+
temperatureCmd = 0x24;
43+
break;
44+
case MODE_FAN:
45+
operatingMode |= DAIKIN_AIRCON_MODE_FAN;
46+
temperatureCmd = 0xC0;
47+
break;
48+
}
49+
50+
switch (fanSpeedCmd)
51+
{
52+
case FAN_AUTO:
53+
fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
54+
break;
55+
case FAN_1:
56+
fanSpeed = DAIKIN_AIRCON_FAN1;
57+
break;
58+
case FAN_2:
59+
fanSpeed = DAIKIN_AIRCON_FAN2;
60+
break;
61+
case FAN_3:
62+
fanSpeed = DAIKIN_AIRCON_FAN3;
63+
break;
64+
case FAN_4:
65+
fanSpeed = DAIKIN_AIRCON_FAN4;
66+
break;
67+
case FAN_5:
68+
fanSpeed = DAIKIN_AIRCON_FAN5;
69+
break;
70+
}
71+
72+
if ((operatingModeCmd == DAIKIN_AIRCON_MODE_HEAT && temperatureCmd >= 10 && temperatureCmd <= 30) ||
73+
(temperatureCmd >= 18 && temperatureCmd <= 30))
74+
{
75+
temperature = temperatureCmd << 1;
76+
}
77+
78+
sendDaikin(IR, operatingMode, fanSpeed, temperature, swingVCmd, swingHCmd);
79+
}
80+
81+
82+
// Send the Daikin code
83+
void DaikinHeatpumpIR::sendDaikin(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH)
84+
{
85+
(void)swingV;
86+
(void)swingH;
87+
88+
uint8_t daikinTemplate[35] = {
89+
0x11, 0xDA, 0x27, 0x00, 0xC5, 0x00, 0x00, 0xD7, // First header
90+
// 0 1 2 3 4 5 6 7
91+
0x11, 0xDA, 0x27, 0x00, 0x42, 0x49, 0x05, 0xA2, // Second header, this seems to have the wall clock time (bytes 12 & 13 are changing)
92+
// 8 9 10 11 12 13 14 15
93+
0x11, 0xDA, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00 };
94+
// 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
95+
96+
daikinTemplate[21] = operatingMode;
97+
daikinTemplate[22] = temperature;
98+
daikinTemplate[24] = fanSpeed;
99+
100+
// Checksum calculation
101+
// * Checksums at bytes 7 and 15 are calculated the same way
102+
uint8_t checksum = 0x00;
103+
104+
for (int i=16; i<34; i++) {
105+
checksum += daikinTemplate[i];
106+
}
107+
108+
daikinTemplate[34] = checksum;
109+
110+
// 38 kHz PWM frequency
111+
IR.setFrequency(38);
112+
113+
// Header
114+
IR.mark(DAIKIN_AIRCON_HDR_MARK);
115+
IR.space(DAIKIN_AIRCON_HDR_SPACE);
116+
117+
// First header
118+
for (int i=0; i<8; i++) {
119+
IR.sendIRbyte(daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
120+
}
121+
122+
// Pause + new header
123+
IR.mark(DAIKIN_AIRCON_BIT_MARK);
124+
IR.space(DAIKIN_AIRCON_MSG_SPACE);
125+
IR.mark(DAIKIN_AIRCON_HDR_MARK);
126+
IR.space(DAIKIN_AIRCON_HDR_SPACE);
127+
128+
// Second header - this probably has the wall clock time
129+
for (int i=8; i<16; i++) {
130+
IR.sendIRbyte(daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
131+
}
132+
133+
// Pause + new header
134+
IR.mark(DAIKIN_AIRCON_BIT_MARK);
135+
IR.space(DAIKIN_AIRCON_MSG_SPACE);
136+
IR.mark(DAIKIN_AIRCON_HDR_MARK);
137+
IR.space(DAIKIN_AIRCON_HDR_SPACE);
138+
139+
// Last 19 bytes - the actual payload
140+
for (int i=16; i<35; i++) {
141+
IR.sendIRbyte(daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
142+
}
143+
144+
IR.mark(DAIKIN_AIRCON_BIT_MARK);
145+
IR.space(0);
146+
}

‎DaikinHeatpumpIR.h

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
Daikin heatpump control (Daikin remote control P/N ARC433B50)
3+
*/
4+
#ifndef DaikinHeatpumpIR_h
5+
#define DaikinHeatpumpIR_h
6+
7+
#include <HeatpumpIR.h>
8+
9+
10+
// Daikin timing constants
11+
#define DAIKIN_AIRCON_HDR_MARK 3360 // 3300
12+
#define DAIKIN_AIRCON_HDR_SPACE 1760 // 1600
13+
#define DAIKIN_AIRCON_BIT_MARK 360 // 310
14+
#define DAIKIN_AIRCON_ONE_SPACE 1370 // 1220
15+
#define DAIKIN_AIRCON_ZERO_SPACE 520 // 400
16+
#define DAIKIN_AIRCON_MSG_SPACE 32300 // 30800
17+
18+
// Daikin codes
19+
#define DAIKIN_AIRCON_MODE_AUTO 0x00 // Operating mode
20+
#define DAIKIN_AIRCON_MODE_HEAT 0x40
21+
#define DAIKIN_AIRCON_MODE_COOL 0x30
22+
#define DAIKIN_AIRCON_MODE_DRY 0x20
23+
#define DAIKIN_AIRCON_MODE_FAN 0x60
24+
#define DAIKIN_AIRCON_MODE_OFF 0x00 // Power OFF
25+
#define DAIKIN_AIRCON_MODE_ON 0x01
26+
#define DAIKIN_AIRCON_FAN_AUTO 0xA0 // Fan speed
27+
#define DAIKIN_AIRCON_FAN1 0x30
28+
#define DAIKIN_AIRCON_FAN2 0x40
29+
#define DAIKIN_AIRCON_FAN3 0x50
30+
#define DAIKIN_AIRCON_FAN4 0x60
31+
#define DAIKIN_AIRCON_FAN5 0x70
32+
33+
34+
class DaikinHeatpumpIR : public HeatpumpIR
35+
{
36+
public:
37+
DaikinHeatpumpIR();
38+
void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd);
39+
40+
private:
41+
void sendDaikin(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH);
42+
};
43+
44+
#endif

‎keywords.txt

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ MitsubishiFDHeatpumpIR KEYWORD1
1212
MitsubishiFEHeatpumpIR KEYWORD1
1313
SamsungHeatpumpIR KEYWORD1
1414
SharpHeatpumpIR KEYWORD1
15+
DaikinHeatpumpIR KEYWORD1
1516

1617
IRSender KEYWORD1
1718

0 commit comments

Comments
 (0)
Please sign in to comment.