doublelook 发表于 2013-8-17 15:01:26

修改Arduino-IRremote-master库,增加美的空调红外发射协议

本帖最后由 doublelook 于 2013-8-17 15:02 编辑

说明:新增美的空调的协议是根据 型号:R51D/C 的遥控器来解码的。至于美的的其他遥控器能否适用并不清楚,大家可以试试。
下面修改IRremote的库文件

1. 修改IRremoteInt.h 文件,第164行后插入如下代码:
#define MIDEA_HDR_MARK    4500
#define MIDEA_HDR_SPACE   4500
#define MIDEA_BIT_MARK    560
#define MIDEA_ONE_SPACE   1680
#define MIDEA_ZERO_SPACE560
#define MIDEA_STOP_SPACE4500

2. 修改IRremote.h 在第101行后插入如下代码:
void sendMIDEA(unsigned long data, int nbits);

3. 修改IRremote.cpp 在第223行后插入如下代码:
void IRsend::sendMIDEA(unsigned long data, int nbits)
{
unsigned long address = 45645;   
enableIROut(38);
//leader code
mark(MIDEA_HDR_MARK);
space(MIDEA_HDR_SPACE);
//address code
for (int i = 0; i < 16; i++) {         
    if (address & 0x8000) {   
    mark(MIDEA_BIT_MARK);
      space(MIDEA_ONE_SPACE);
    }
    else {
      mark(MIDEA_BIT_MARK);
      space(MIDEA_ZERO_SPACE);
    }
    address <<= 1;
}
//data code
for (int i = 0; i < nbits; i++) {
    if (data & 0x80000000) {      
    mark(MIDEA_BIT_MARK);
      space(MIDEA_ONE_SPACE);
    }
    else {
      mark(MIDEA_BIT_MARK);
      space(MIDEA_ZERO_SPACE);
    }
    data <<= 1;
}
//stop code
mark(MIDEA_BIT_MARK);
space(MIDEA_STOP_SPACE);
}

修改完后,保存即可。
可以通过如下例子调用:
#include <IRremote.h>

IRsend irsend;
void setup()
{
Serial.begin(9600);
}

void loop() {
irsend.sendMIDEA(0x7B84E01F, 32);
irsend.sendMIDEA(0x7B84E01F, 32);
delay(5000);
}

注: 上面的例子有两行相同的 irsend.sendMIDEA(0x7B84E01F, 32);这个是因为美的空调(R51D)协议 一次按键重复发两次,所以要执行两次。

例子中的0x7B84E01F 这个是关闭按键的数据码和数据反码的十六进制值,32是表示数据码和数据反码总共32bit
下面说说修改库文件时,几个数值的意思
修改IRremote.cpp 文件时里有 45645,16,0x8000,0x80000000 这几个数值
45645 是地址码的十进制值,它的十六进制值为:B24D
16 是因为地址码总共16 bit
0x8000 这个也是因为地址码总共16 bit的关系,可以将它转成二进制看看,然后体会一下它的作用
0x80000000 这个是因为数据码总共32 bit的关系,也可以将它转成二进制看看,然后体会一下它的作用
后面附上一些遥控器按键的16进制值
关闭 0x7B84E01F
摆风 0x6B94E01F
强劲 0xF50AA25D
清新 0xF50AA35C
数显 0xF50AA55A
风向 0x1FE044BB
开:根据温度不同数据码不同,下面一一列表:
17度 0x1FE008F7
18度 0x1FE018E7
19度 0x1FE038C7
20度 0x1FE028D7
21度 0x1FE06897
22度 0x1FE07887
23度 0x1FE058A7
24度 0x1FE048B7
25度 0x1FE0C837
26度 0x1FE0D827
27度 0x1FE09867
28度 0x1FE08877
29度 0x1FE0A857
30度 0x1FE0B847
因为我的空调没有显示屏,不能验证能否一一对应上,只是试了几个都能听到“滴”的一声响,应该是生效了。 欢迎有显示屏的验证一下。

iRobot 发表于 2013-8-17 15:21:30

顶楼主一个   回头试试

doublelook 发表于 2013-8-17 15:27:51

记得把结果告知一下

幻生幻灭 发表于 2013-8-17 15:48:22

感谢分享,已更新到wiki
http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:irremote_code_cooler

doublelook 发表于 2013-8-17 15:58:46

:lol 多谢版主

幻生幻灭 发表于 2013-8-17 16:18:20

我测试了下,遥控器是R51D的,基本好用

不过有个奇怪的小现象,用遥控器关机后,Arduino发送的红外命令无效
但遥控器开机后,Arduino可以正常发送各个温度,关机,再次发送温度开机(我测试了4个温度)

另外,要是楼主能补充 decodeMIDEA 就更完美啦

doublelook 发表于 2013-8-17 17:32:08

你是说用遥控器将空调关机,然后用Arduino无法遥控开机? 你是用哪几个温度测试呢   我试了17度和23度都能开启空调的

doublelook 发表于 2013-8-17 17:34:24

decodeMIDEA 还没时间去弄等有时间看看能不能搞出来

瘦网虫 发表于 2013-8-18 16:11:29

支持!!一下!!!

Randy 发表于 2013-8-18 23:48:32

:o:o:o:o:o

为友 发表于 2013-8-21 08:45:42

美的 R51D/C 解码
long IRrecv::decodeMIDEA(decode_results *results){
        unsigned long long data = 0;
    int offset = 1;
   
    if (!MATCH_MARK(results->rawbuf, MIDEA_HDR_MARK)) {
      return ERR;
    }
    offset++;
    if (!MATCH_MARK(results->rawbuf, MIDEA_HDR_SPACE)) {
      return ERR;
    }
    offset++;
   
    // decode address
    for (int i = 0; i < MIDEA_BITS; i++) {
      if (!MATCH_MARK(results->rawbuf, MIDEA_BIT_MARK)) {
            return ERR;
      }
      if (MATCH_SPACE(results->rawbuf,MIDEA_ONE_SPACE)) {
            data = (data << 1) | 1;
      } else if (MATCH_SPACE(results->rawbuf,MIDEA_ZERO_SPACE)) {
            data <<= 1;
      } else {
            return ERR;
      }
      offset++;
    }
    results->value = (unsigned long)data;
    results->panasonicAddress = (unsigned int)(data >> 32);
    results->decode_type = MIDEA;
    results->bits = MIDEA_BITS;
    return DECODED;

}

为友 发表于 2013-8-21 08:47:41

irsend.sendMIDEA(0x7B84E01F,32);
    delay(10000);
    delay(10000);   
   
    irsend.sendMIDEA(0x1FE044BB,32);
    delay(10000);
    delay(10000);
关机指令无效,空调没有反应

doublelook 发表于 2013-8-21 10:21:34


irsend.sendMIDEA(0x7B84E01F,32);
irsend.sendMIDEA(0x7B84E01F,32);
delay(10000);
delay(10000);   
   
irsend.sendMIDEA(0x1FE044BB,32);
irsend.sendMIDEA(0x1FE044BB,32);
delay(10000);
delay(10000);

HeartRain 发表于 2013-8-27 09:28:55

楼主能否将74位的解释一下

jifukui 发表于 2013-10-29 18:02:41

好像不行吧,我看了美的空调的红外协议。和实际检验。它有48个bit 192个0,1脉冲。
页: [1] 2
查看完整版本: 修改Arduino-IRremote-master库,增加美的空调红外发射协议