红外发射模块的IOT物联网应用探索

今天和伍树研究了红外发射管控制家电。

刚开始研究空调遥控,研究伍树的之前搜索到并且成功控制格力空调的代码,但很快发现空调的控制要复杂许多,主要原因是遥控上也有显示屏,为了使空调和遥控的数据同步,每次按键需要发送遥控端所有的数据,因此数据量很大,无法用普通的十六进制码表示,因此就更换目标,开始尝试控制投影仪。

我使用的是arduino uno板,在面包板上直接用io口驱动红外管,使用IRremote库,

使用IRrecvDemo的example sketch读取到了遥控器控制投影仪的开机键的六位十六进制码,然后利用IRsendDemo驱动红外发射管发射出来,成功开关投影仪。比较简单。

然后给红外发射管增加了一个三极管,通过三极管控制后控制距离明显加长好多。

接下来研究了格力空调的红外遥控协议,参考了这篇文章《格力空调红外编码分析》开始研究了红外空调的时序,开始研究直接用刚才的程序捕捉遥控的发送数据,再用相同的方式发出来,但是发现不行,

发现无法通过简单的六位十六进制的码表示后,我们便更换为了IRrecvDump来检测遥控发射的数据,但是经过一番折腾后发现在我的这边读出来的源码内容直接用IRsendRawDemo发送出去还是无法控制空调


Encoding  : NEC
Code      : 98D0050A (32 bits)
Timing[73]:
+8950, -4300     + 650, -1550     + 700, - 500     + 700, - 500
+ 700, -1500     + 700, -1550     + 700, - 450     + 750, - 450
+ 700, - 500     + 700, -1500     + 750, -1500     + 700, - 500
+ 700, -1500     + 700, - 500     + 700, - 500     + 700, - 450
+ 700, - 500     + 700, - 500     + 700, - 450     + 750, - 450
+ 700, - 500     + 700, - 500     + 700, -1500     + 700, - 500
+ 700, -1500     + 750, - 450     + 700, - 500     + 700, - 500
+ 700, - 450     + 700, -1500     + 750, - 450     + 750, -1500
+ 700, - 500     + 700, - 450     + 750, -1500     + 700, - 500
+ 700

重读协议,发现了一个秘密,其实接收到的数据中,那些奇怪的还带正负号的内容其实是接收头经过处理后返回的信号高低电平的时间,根据协议:

 

0的电平宽度为:600us低电平+600us高电平,

1的电平宽度为:600us低电平+1600us高电平,

起始码S电平宽度为:9000us低电平+4500us高电平

连接码C电平宽度为:600us低电平+20000us高电平

起始码(S)+35位数据码+连接码(C)+32位数据码

 

一正一负的两个数字组成一组,代表1或者0,再根据协议里的内容,我们是可以读出内容的

后面发现主要是因为空调遥控发送的数据不同于其他遥控器,开始有起始码,中间有连接码,后面还有校验码,但是编码后会自动忽略这些内容,因此不准确

每次按下按钮都会出来两行8位十六进制的结果,返回去再读协议,发现当我们改变某些参数比如温度,根据协议里的规定换算十六进制码,其实是可以推出来同样的温度值的,说明确实独到了数据内容,可能就是不全


uint16_t rawData[279] = {9012, 4492,  650, 1658,  648, 558,  648, 558,  648, 1658,  644, 1662,  648, 1658,  644, 1660,  648, 560,  646, 1660,  644, 1662,  648, 1658,  648, 558,  646, 558,  646, 560,  646, 558,  648, 558,  644, 560,  646, 558,  644, 562,  648, 558,  646, 1660,  648, 1660,  642, 560,  644, 562,  646, 558,  646, 562,  640, 564,  640, 566,  640, 1664,  644, 562,  644, 1664,  642, 564,  644, 562,  642, 1664,  644, 560,  642, 19996,  644, 1666,  642, 564,  640, 566,  642, 564,  638, 568,  640, 566,  644, 560,  642, 564,  638, 566,  638, 566,  640, 566,  644, 562,  640, 566,  644, 562,  638, 566,  644, 562,  640, 564,  642, 566,  636, 566,  640, 564,  638, 568,  638, 568,  638, 568,  640, 566,  636, 568,  640, 566,  636, 568,  640, 566,  642, 564,  640, 1668,  638, 568,  640, 1666,  640, 40006,  8982, 4494,  642, 1666,  642, 566,  640, 566,  638, 1668,  640, 1668,  644, 1660,  642, 1664,  642, 566,  640, 1664,  646, 1662,  642, 1662,  642, 566,  638, 568,  638, 566,  640, 566,  642, 564,  638, 566,  640, 564,  644, 560,  640, 566,  638, 1666,  642, 1668,  642, 564,  640, 564,  642, 564,  642, 564,  640, 566,  642, 564,  644, 1662,  642, 1664,  640, 1666,  640, 568,  640, 564,  638, 1668,  642, 564,  638, 19996,  648, 560,  642, 562,  644, 560,  646, 560,  640, 564,  640, 566,  644, 562,  638, 566,  642, 562,  644, 562,  638, 566,  642, 564,  640, 564,  640, 564,  640, 566,  646, 560,  640, 564,  642, 566,  640, 566,  638, 566,  642, 1666,  640, 566,  640, 1668,  640, 566,  640, 566,  640, 566,  640, 566,  640, 564,  644, 1662,  640, 1666,  644, 1664,  640, 1666,  640};  // KELVINATOR

这时伍树那边用esp8266的主板,用类似的代码,可以读出更长的源码内容,因此我们将这段更完整的源码内容通过IRsendRawDemo发送出去,成功驱动格力空调!推测可能是因为芯片的主频要更高,所以可以读出更多的内容,使用的库为IRremoteESP8266-IRrecvDumpV2

 

经过今天的探索,我们对红外发射、接收和不同的编码解码协议这的知识了解的更深入了,以后做项目时涉及到这方面的内容相信也会更加熟练,nice!

发表回复