惠而浦空调遥控协议分析及使用Arduino遥控空调

一、工具

1、红外接收头(HS1838);

2、940nm红外发光二极管及限流电阻100Ω左右;

3、Arduino及Prototype Shield;

4、Saleae Logic兼容逻辑分析仪(价格二三十元,可选,可用IRremote Library的RawDump分析);

5、工具软件:Saleae Logic、Excel、Arduino、Notepad++;

6、Arduino库:IRremote(下载地址:https://github.com/z3t0/Arduino-IRremote);

二、解析惠而浦空调遥控协议

①如下图,将接收头和逻辑分析仪连接好,记录遥控器发送的信号;

 

②记录的报文如图所示(逻辑分析仪采样率选择12Msps);

(采样率设为12Msps)

(采集到的一帧数据(接收头已过滤了遥控的38kHz载波))

③多次尝试和分析可知一帧数据的大致结构:

导引头(载波约6.2ms,空隙间隔约7.4ms)+数据块+结束块(约0.56ms载波+7.4ms空隙+0.56ms载波+7.4ms空隙)

中间数据块波形有两种形式,根据网上搜索的NEC遥控协议,我们可以暂定如下:

数值0:载波0.56ms,空隙0.56ms

数值1:载波0.56ms,空隙1.69ms

波形解析

④接着分析比较复杂的数据块,由于一帧数据块包含的位数很多(后面分析可知:多达12个字节(96位)),不可能对着分析仪一个一个的数波形,故打算使用以下方法:

1)先使用分析仪的游标大致找到波形的起始和结束时间(如下图所示);

2)导出波形数据,设置如下图(需要设置起始时间、结束时间、使用采样点数)

3)点击Export按钮,给定名字(如开机.csv),保存;

4)将开机.csv文件用Excel打开,如下图,删除多余的通道(如我的接收头连接在Channel0,所以删除Channel1到Channel7);

5)接下来需要翻译出数据块中的数值0和数值1了。

6)CSV数据中的0,1并不是实际遥控的数据,根据第③点的分析,我们可以根据高电平的时长来区分数值0和数值1。在C2单元格,我们输入如下公式,得出每个电平的宽度(基于采样数);

7)使用填充柄填充所有行,如下图;

8)接下来,需要判定B列的1的时长了,采样数小于一定的数值,则表示发送的是0,否则发送的是1;(B列所有值为0的行可以忽略了,在数据块部分,他们都是固定时长的)。在D2中输入如下公式,以判定发送的数值;注,公式中的10000与当初逻辑分析仪所设置的采样率有关联的,12Msps的使用10000正好;

9)使用填充柄填充所有行

10)筛选出B列数值为1的行。操作如下①全选B列,②按Ctrl+Shift+L,③在下拉箭头中单击,去掉0前面的勾,点确定。

11)现在剩下的差不多就是数据块了,如下图,选中并复制出除导引头和结束块外的数据块(一般是从D6开始,向下选择96个单元格),粘贴到新的表格中即可。

12)可以得到数据块的数据了,那么剩下的就是使用控制变量法,一个一个测试遥控器的按键,并找到有变更的数据,分析下即可知道,不同功能在数据块中对应的位。

⑤附件是我整理的惠而浦空调,部分功能对应的位(定时功能比较复杂,且有了自制遥控器后,作用也不大,所以没分析,应该是在前几个字节定义。)

 

三、使用Arduino遥控空调

有了逆向的协议后,就可以尝试使用Arduino来控制空调了。其中,我们使用IRremote 库来发射信号。

下载IRremote库,并复制到ArduinoLibraries 文件夹下(请上网查找Arduino安装库的方法)。

先使用我们解析出来的数据来测试下,分析是否正确。

①搭好发射电路如下图所示:把红外发射管串接到 Arduino数字PIN3和GND之间(注意二甲管正负极,实际测试发现取消限流电阻,发射距离更远。)

②使用IRremote的sendRaw函数来测试,在这之前,我们需要准备好提供给sendRaw函数的数组,即最底层38kHz载波打开与关闭的时长序列;

1)先把之前得到的96bits的数据块复制出来,并使用转置粘贴为横向数据,如下两图:

 

2)再将横向的数据复制并粘贴到NotePad++中,

3)删除第二行,接着使用“替换”功能,先后将“        ”(制表符)替换为“,”(英文的逗号);将“0”替换成“550,550”;将“1”替换成“550,1690”。并在行首添加导引头“6200,7400,”,行尾添加结束块“,560,7400,560,7400”结果如图:

③运行Arduino程序,并打开IRremote库的IrsendRawDemo示例,如下图

④清除irSignal数组中的内容,使用我们刚处理的Notepad++中的数据;

⑤编译并下载到Arduino中,将Prototype板上的红外LED靠近并正对空调,观察效果(空调发出“哔”并进入待机);

 

四、使用sendWhirlpool函数控制空调

虽然可以控制空调了,但为了关个机,还得输入一大串的数据,有点麻烦。接下来,我们将往IRremote库添加自己刚分析好的惠而浦遥控底层协议。

①打开 IRremote库所在文件夹(如C:\arduinotool\arduino-1.0.5\libraries\IRremote),复制并粘贴“ir_NEC.cpp”,重命名为“ir_Whirlpool.cpp”。这就是我们要修改的模板了。

②打开ir_Whirlpool.cpp,修改#define部分如下图(这部分定义了各时间参数,以μs为单位)

 

 

#defineWHIRLPOOL_BITS          96
#defineWHIRLPOOL_HDR_MARK    6200
#defineWHIRLPOOL_HDR_SPACE   7400
#defineWHIRLPOOL_BIT_MARK     560
#defineWHIRLPOOL_ONE_SPACE   1690
#defineWHIRLPOOL_ZERO_SPACE   560
#defineWHIRLPOOL_RPT_SPACE   2250  


 

 

③修改发射函数如下(实测载波设为36kHz,遥控距离更远):

 

 
//+=============================================================================
#if SEND_WHIRLPOOL
void  IRsend::sendWhirlpool(unsignedchar* data)
{
    enableIROut(36);
    unsigned char checksum = 0;
    for(unsignedchar i =0;i<11;i++)
    {
        checksum += data[i];
    }
    data[11]= checksum;
   
    //Header
    mark(WHIRLPOOL_HDR_MARK);
    space(WHIRLPOOL_HDR_SPACE);
 
    // Data
    for(unsignedchar bytecnt =0;bytecnt<11;bytecnt++)
    {
        for(unsignedchar bitcnt =0;bitcnt<=7;bitcnt++)
        {
            if(data[bytecnt]& (1<< bitcnt))
            {
                mark(WHIRLPOOL_BIT_MARK);
                space(WHIRLPOOL_ONE_SPACE);
            }
            else
            {
                mark(WHIRLPOOL_BIT_MARK);
                space(WHIRLPOOL_ZERO_SPACE);
            }
       
        }
    }
    //checksum
    for(unsignedchar bitcnt =0;bitcnt<=7;bitcnt++)
    {
        if(checksum& (1<< bitcnt))
        {
            mark(WHIRLPOOL_BIT_MARK);
            space(WHIRLPOOL_ONE_SPACE);
        }
        else
        {
            mark(WHIRLPOOL_BIT_MARK);
            space(WHIRLPOOL_ZERO_SPACE);
        }
   
    }
   
   
    //Footer
    mark(WHIRLPOOL_BIT_MARK);
    space(WHIRLPOOL_HDR_SPACE);
    mark(WHIRLPOOL_BIT_MARK);
    space(WHIRLPOOL_HDR_SPACE);
   
    space(0); // Always end with the LED off
}
#endif


 

 

④接着修改“irRecv.cpp”和“IRremote.h”,方法见IRremote库的文件“ir_Template.cpp”中相关注释。

 

⑤完成以上动作后,重启ArduinoIDE,打开IRremote的示例文件:IrsendDemo

⑥修改turnoff数组为以下内容(这些就是抓取的关机报文,按字节整理好,并去掉最后的校验和(CheckSum)字节),代码如下:

 

/*
 * IRremote: IRsendDemo - demonstrates sendingIR codes with IRsend
 * An IR LED must be connected to Arduino PWMpin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */
 
 
#include<IRremote.h>
 
IRsend irsend;
unsigned char turnoff[]={0,0,0,0,0,0,0,0x08,0,0x28,0xa5};
 
void setup()
{
}
 
void loop(){
    irsend.sendWhirlpool(turnoff);
while(1);
}
 

 

 

 

 

 

 

⑦再测试下,应该还是可以遥控空调的。

 

五、结束语

       有了以上数据后,可以再添加一个函数,将实际的功能转换成对应的协议数据,并交由sendWhirlpool发送。

以上,大家可以举一反三,做出适合自己空调的遥控器,或者将Arduino联网,使用手机远程控制家里的空调,在回家前,先营造舒适的室内温度。

文中并没有说明如何调节温度,模式等,其实调节温度就是把期望的温度值减去16,转换为16进制,填到协议数据响应的位中即可。

另外,需要注意的是,惠而浦空调发送的先后顺序是低位先发,高位后发。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值