极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 47671|回复: 25

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

[复制链接]
发表于 2013-8-17 15:01:26 | 显示全部楼层 |阅读模式
本帖最后由 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_SPACE  560
#define MIDEA_STOP_SPACE  4500

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
因为我的空调没有显示屏,不能验证能否一一对应上,只是试了几个都能听到“滴”的一声响,应该是生效了。 欢迎有显示屏的验证一下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +2 收起 理由
幻生幻灭 + 2 感谢分享

查看全部评分

回复

使用道具 举报

发表于 2013-8-17 15:21:30 | 显示全部楼层
顶楼主一个   回头试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-17 15:27:51 | 显示全部楼层
记得把结果告知一下
回复 支持 反对

使用道具 举报

发表于 2013-8-17 15:48:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-17 15:58:46 | 显示全部楼层
多谢版主
回复 支持 反对

使用道具 举报

发表于 2013-8-17 16:18:20 | 显示全部楼层
我测试了下,遥控器是R51D的,基本好用

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

另外,要是楼主能补充 decodeMIDEA 就更完美啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-17 17:32:08 | 显示全部楼层
你是说用遥控器将空调关机,然后用Arduino无法遥控开机? 你是用哪几个温度测试呢   我试了17度和23度都能开启空调的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-17 17:34:24 | 显示全部楼层
decodeMIDEA 还没时间去弄  等有时间看看能不能搞出来
回复 支持 反对

使用道具 举报

发表于 2013-8-18 16:11:29 | 显示全部楼层
支持!!一下!!!
回复 支持 反对

使用道具 举报

发表于 2013-8-18 23:48:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 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[offset], MIDEA_HDR_MARK)) {
        return ERR;
    }
    offset++;
    if (!MATCH_MARK(results->rawbuf[offset], MIDEA_HDR_SPACE)) {
        return ERR;
    }
    offset++;
   
    // decode address
    for (int i = 0; i < MIDEA_BITS; i++) {
        if (!MATCH_MARK(results->rawbuf[offset++], MIDEA_BIT_MARK)) {
            return ERR;
        }
        if (MATCH_SPACE(results->rawbuf[offset],MIDEA_ONE_SPACE)) {
            data = (data << 1) | 1;
        } else if (MATCH_SPACE(results->rawbuf[offset],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);
关机指令无效,空调没有反应
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);
回复 支持 反对

使用道具 举报

发表于 2013-8-27 09:28:55 | 显示全部楼层
楼主能否将74位的解释一下
回复 支持 反对

使用道具 举报

发表于 2013-10-29 18:02:41 | 显示全部楼层
好像不行吧,我看了美的空调的红外协议。和实际检验。它有48个bit 192个0,1脉冲。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 15:06 , Processed in 0.047048 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表