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
