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

news/2025/1/9 3:27:08/

一、工具

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;//Headermark(WHIRLPOOL_HDR_MARK);space(WHIRLPOOL_HDR_SPACE);// Datafor(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);}}}//checksumfor(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);}}//Footermark(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进制,填到协议数据响应的位中即可。

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

 

 


http://www.ppmy.cn/news/242711.html

相关文章

如何免开发打造智能空调?

MCU对接方案是目前家电类产品对接涂鸦平台最常用的方案之一。主要用于带有MCU主控的空调产品实现智能化&#xff0c;直接对接涂鸦模组串口协议即可实现联网。客户只需要关注产品本身的功能研发&#xff0c;联网智能化部分使用公版方案或者面板工作台&#xff0c;具体MCU方案通信…

基于51单片机的智能空调控制系统设计(仿真+代码+原理图+报告+视频讲解)

基于51单片机的智能空调控制系统 这里写目录标题 1 开发环境讲解演示视频2 功能说明介绍3 仿真图4 程序4.1 工程文件4.2 代码 5 原理图6 元器件清单7 视频讲解8 资料清单 1 开发环境 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图/PCB:AD 设计编号&#xff1a;A0003…

自己动手做智能家居之:智能空调控制

阅读本文需要 2 分钟。 夏天天气非常热的时候整晚吹空调经常会吹得整个人都不舒服&#xff0c;早上起来很疲惫&#xff0c;达不到轻松睡眠的效果。空调吹久了还是会感觉到冷&#xff0c;定时功能不能完全满足需求&#xff0c;半夜醒来开了关&#xff0c;关了开实在是太折磨人了…

CI130X智能语音芯片应用于空调伴侣,可实现离线语音控制空调,风扇,灯具,电视等,最多支持500条命令词

随着人们生活水平的提高&#xff0c;用户对产品的追求呈现多元化趋势&#xff0c;不仅仅只关注空调等家电产品带来的舒适&#xff0c;更注重产品的使用体验感。家电的控制也演变了多种方式&#xff0c;从机械开关&#xff0c;轻触按键&#xff0c;手持遥控器到手机端APP&#x…

如何进行有效的移动应用测试?10个步骤带你一战成神

移动应用的市场日益壮大&#xff0c;而随着这个市场的发展&#xff0c;如何有效地测试移动应用也成为了一个重要的问题。本文将为你提供一些关于如何进行有效的移动应用测试的建议&#xff0c;并提供一些实际测试例子。 1. 理解你的用户和使用场景 在进行移动应用测试之前&…

并发量、RT、QPS、TPS量化关系

一个公司有7200名员工,每天上班打卡时间是早上8点到8点30分,每次打卡时间系统执行时长5秒,那么RT、QPS、并发量分别是多少? RT表示响应时间,问题已经包含答案: RT = 5秒QPS表示每秒访问量,假设签到行为平均分布: QPS = 7200/(30*60) = 4并发量表示系统同时接受请求数:…

NLP实战:调用Gensim库训练Word2Vec模型

目录 一、准备工作 1. 安装Gensim库 2. 对原始语料分词 二、训练Word2Vec模型 三、模型应用 1.计算词汇相似度 ​编辑 2. 找出不匹配的词汇 3. 计算词汇的词频 四、总结 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学…

魅族支持鸿蒙机型,魅族怎么更新鸿蒙系统?魅族鸿蒙系统支持的手机型号列表大全[多图]...

魅族怎么更新鸿蒙系统&#xff1f;今天魅族宣布正式加盟鸿蒙系统&#xff0c;那么要如何进行升级呢&#xff1f;下面就让安卓乐园小编为大家带来&#xff0c;魅族鸿蒙系统支持的手机型号列表大全。 其实笔者我想给大家推荐的机型&#xff0c;屏幕前不少朋友应该都很熟悉&#x…