海爾空調遙控YR-M10解碼測試

家裏好幾個海爾空調,遙控器如下。它們協議並不相同,所以空調之間有的功能部分相通,有的完全不通。其中有一個YR-M13看起來跟淘來的YR-M10相似,但是很不幸。協議也是不一樣的。

 

看了前輩寫的貼

1、解讀海爾壁掛空調紅外遙控編碼之我見,有源碼啊!http://bbs.mydigit.cn/read.php?tid=1152024

2、海爾空調遙控編碼分析http://bbs.mydigit.cn/read.php?tid=2637581

 

Luckily,第一篇講的就是YR-M10的協議講解。細緻入微。打印下來依次驗證

 

寫個解碼的類

IRDataPkg.h

#ifndef _C_IRDATAPKG_H_
#define _C_IRDATAPKG_H_
#pragma once

class IRDataPkg
{
  public:    
    int pkgLen ;    
    unsigned char *buf ;    
    IRDataPkg( void); 
     ~IRDataPkg(void);
    //校驗字節   
    unsigned char checkCrc(); // 1 0校驗求和
    unsigned char first();//==0xA5// 1 0
    unsigned char dataok();//first()&&checkCrc()
    unsigned char temperature(); //溫度16-30   
    unsigned char button();//power狀態0關1開2模式3風速4?5?6上箭頭7下箭頭8睡眠9設定10?11電熱12健康13聰明風
    unsigned char wind_direction_v();//聰明風0關1上2下3擺
    unsigned char wind_speed();//0自動,3低 2中 1高
    unsigned char time_hh();//0-23
    unsigned char time_mm();//0-59
    unsigned char health();//0關1開
    unsigned char quiet();//==
    unsigned char sleep();//0關1開
    unsigned char mode();//0關1
    unsigned char electric_heat();//0關1

    
    void writeArrayToBuf(unsigned char arr[],unsigned int len);
    void writeToBuf(unsigned char byt, unsigned int id);
};
#endif // _C_IRDATAPKG_H_

IRDataPkg.cpp

#include "IRDataPkg.h"
IRDataPkg::IRDataPkg() {
  this->pkgLen = 9;
  this->buf = new unsigned char[pkgLen];//[0 for i in range(.bufLen)];
  for (int i = 0; i < this->pkgLen - 1; i++) {
    this->buf[i] = 0;
  }
}
IRDataPkg::~IRDataPkg() {
  delete []buf;

}

//校驗和
unsigned char  IRDataPkg::checkCrc() {
  unsigned char r = 0;
  //計算和
  for (int i = 0; i < this->pkgLen - 1; i++) {
    r += this->buf[i];
  }
  r = r & 0xff;
  return  r == buf[this->pkgLen - 1] ? 1 : 0;
}
unsigned char IRDataPkg::first() {
  return  0xA5 == buf[0] ? 1 : 0;
}
unsigned char IRDataPkg::dataok() {
  return (this->first()==1 && this->checkCrc()==1) ? 1 : 0;
};//first()&&checkCrc()
unsigned char IRDataPkg::temperature() {
  return (buf[1] >> 4) + 16;  //溫度16-30
}
unsigned char IRDataPkg::button() {
  return (buf[1] & 0x0f);
}//power狀態0關1開2模式3風速4?5?6上箭頭7下箭頭8睡眠9設定10?11電熱12健康13聰明風
unsigned char IRDataPkg::wind_direction_v() {
  return (buf[2] >> 6) & 0x03; //聰明風0關1上2下3擺
}
unsigned char IRDataPkg::wind_speed() {
  return (buf[5] >> 6) & 0x03; //0自動,3低 2中 1高
}
unsigned char IRDataPkg::time_hh() {
  return (buf[2] & 0x1f); //0-23
}
unsigned char IRDataPkg::time_mm() {
  return (buf[3] & 0x3f); //0-59
}
unsigned char IRDataPkg::health() {
  return (buf[4] >> 5) & 0x01; //0關1開
}
unsigned char IRDataPkg::quiet() {
  return (buf[7] >> 6) & 0x01;
} //==睡眠
unsigned char IRDataPkg::sleep() {
  return (buf[7] >> 6) & 0x01; //0關1開
}
unsigned char IRDataPkg::mode() {
  return (buf[6] >> 5);
}//0三角1雪花2水滴3太陽4風扇
unsigned char  IRDataPkg::electric_heat(){
  return ((buf[4] >> 6) & 0x03)?1:0; //0關1開
}
void IRDataPkg::writeToBuf(unsigned char byt, unsigned int id){
      if(id<this->pkgLen){
        this->buf[id]=byt;
      }
    }
void IRDataPkg::writeArrayToBuf(unsigned char arr[], unsigned int len) {
  for (int i = 0; i < len; i++) {
    this->writeToBuf(arr[i], i);
  }
}
//*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章