I'm math from france (so sorry for my poor english).
I have to pilot my AC Mitsubishi (MSZ-HJ50VA) by arduino. I have decodate IR frames and did this code :
Code: Select all
typedef enum HvacMode {
HVAC_HOT,
HVAC_COLD,
HVAC_DRY,
HVAC_FAN,
HVAC_AUTO // used for Toshiba only
} HvacMode_t; // HVAC MODE
typedef enum HvacFanMode {
FAN_SPEED_1,
FAN_SPEED_2,
FAN_SPEED_3,
FAN_SPEED_4,
FAN_SPEED_5,
FAN_SPEED_AUTO
} HvacFanMode_; // HVAC FAN MODE
typedef enum HvacVanneMode {
VANNE_AUTO,
VANNE_H1,
VANNE_H2,
VANNE_H3,
VANNE_H4,
VANNE_H5,
VANNE_AUTO_MOVE
} HvacVanneMode_; // HVAC VANNE MODE
// HVAC MITSUBISHI_
#define HVAC_MITSUBISHI_HDR_MARK 3400
#define HVAC_MITSUBISHI_HDR_SPACE 1700
#define HVAC_MITSUBISHI_BIT_MARK 433
#define HVAC_MITSUBISHI_ONE_SPACE 1299
#define HVAC_MITSUBISHI_ZERO_SPACE 433
#define HVAC_MITSUBISHI_RPT_MARK 433
#define HVAC_MITSUBISHI_RPT_SPACE 12980
/****************************************************************************
/* Send IR command to Mitsubishi HVAC - sendHvacMitsubishi
/***************************************************************************/
void sendHvacMitsubishi(
HvacMode HVAC_Mode, // Example HVAC_HOT HvacMitsubishiMode
int HVAC_Temp, // Example 21 (°c)
HvacFanMode HVAC_FanMode, // Example FAN_SPEED_AUTO HvacMitsubishiFanMode
HvacVanneMode HVAC_VanneMode, // Example VANNE_AUTO_MOVE HvacMitsubishiVanneMode
int ON // Example false
)
{
#define HVAC_MITSUBISHI_DATALEN 18
byte mask = 1; //our bitmask
byte data[HVAC_MITSUBISHI_DATALEN] = { B11000100, B11010011, B01100100, B10000000, B00000000, B00000100, B00010000, B10100000, B00001100, B10000010, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B11001101 };
// data array is a valid trame, only byte to be chnaged will be updated.
byte i;
// Byte 6 - On / Off
if (ON) {
data[5] = (byte) B00000100; // Turn OFF HVAC
} else {
data[5] = (byte) B00000000; // Turn ON HVAC
}
// Byte 7 et 9 - Mode
switch (HVAC_Mode)
{
case HVAC_HOT: data[6] = (byte) B00010000; data[8] = (byte) B00001100; break;
case HVAC_COLD: data[6] = (byte) B00011000; data[8] = (byte) B01101100; break;
case HVAC_FAN: data[6] = (byte) B00011100; data[8] = (byte) B00001100; break;
case HVAC_DRY: data[6] = (byte) B00001000; data[8] = (byte) B01001100; break;
default: break;
}
// Byte 8 - Temperature
// Check Min Max For Hot Mode
byte Temp;
if (HVAC_Temp > 31) { Temp = 31;}
else if (HVAC_Temp < 16) { Temp = 16; }
else { Temp = HVAC_Temp; };
switch (HVAC_Temp)
{
case 16: data[7] = (byte) B00000000; break;
case 17: data[7] = (byte) B10000000; break;
case 18: data[7] = (byte) B01000000; break;
case 19: data[7] = (byte) B11000000; break;
case 20: data[7] = (byte) B00100000; break;
case 21: data[7] = (byte) B10100000; break;
case 22: data[7] = (byte) B01100000; break;
case 23: data[7] = (byte) B11100000; break;
case 24: data[7] = (byte) B00010000; break;
case 25: data[7] = (byte) B10010000; break;
case 26: data[7] = (byte) B01010000; break;
case 27: data[7] = (byte) B11010000; break;
case 28: data[7] = (byte) B00110000; break;
case 29: data[7] = (byte) B10110000; break;
case 30: data[7] = (byte) B01110000; break;
case 31: data[7] = (byte) B11110000; break;
default: break;
}
// Byte 10 - FAN / VANNE
switch (HVAC_FanMode)
{
case FAN_SPEED_1: data[9] = (byte) B10000010; break;
case FAN_SPEED_2: data[9] = (byte) B01000010; break;
case FAN_SPEED_3: data[9] = (byte) B11000010; break;
case FAN_SPEED_4: data[9] = (byte) B00100010; break;
case FAN_SPEED_5: data[9] = (byte) B00100010; break; //No FAN speed 5 for MITSUBISHI so it is consider as Speed 4
case FAN_SPEED_AUTO: data[9] = (byte) B00000010; break;
default: break;
}
switch (HVAC_VanneMode)
{
case VANNE_AUTO: data[9] = (byte) data[9] | B00000000; break;
case VANNE_H1: data[9] = (byte) data[9] | B00010000; break;
case VANNE_H2: data[9] = (byte) data[9] | B00001000; break;
case VANNE_H3: data[9] = (byte) data[9] | B00011000; break;
case VANNE_H4: data[9] = (byte) data[9] | B00000100; break;
case VANNE_H5: data[9] = (byte) data[9] | B00010100; break;
case VANNE_AUTO_MOVE: data[9] = (byte) data[9] | B00011100; break;
default: break;
}
if (HVAC_VanneMode==VANNE_AUTO && HVAC_FanMode==FAN_SPEED_AUTO){
data[9] = (byte) B00000001;
}
// Byte 18 - CRC
data[17] = 0;
//need help
enableIROut(38); // 38khz
space(0);
for (int j = 0; j < 2; j++) { // For Mitsubishi IR protocol we have to send two time the packet data
// Header for the Packet
mark(HVAC_MITSUBISHI_HDR_MARK);
space(HVAC_MITSUBISHI_HDR_SPACE);
for (i = 0; i < 18; i++) {
// Send all Bits from Byte Data in Reverse Order
for (mask = 00000001; mask > 0; mask <<= 1) { //iterate through bit mask
if (data[i] & mask) { // Bit ONE
mark(HVAC_MITSUBISHI_BIT_MARK);
space(HVAC_MITSUBISHI_ONE_SPACE);
}
else { // Bit ZERO
mark(HVAC_MITSUBISHI_BIT_MARK);
space(HVAC_MITSUBISHI_ZERO_SPACE);
}
//Next bits
}
}
// End of Packet and retransmission of the Packet
mark(HVAC_MITSUBISHI_RPT_MARK);
space(HVAC_MITSUBISHI_RPT_SPACE);
space(0);
}
}

Thanks for help.
Math