我用18元开了个空调……(一)

我用18元开了个空调……(一)如何踏入物联网智能家居时代_irext

从零开始的智能家居

专家称「今年高温综合强度或为 1961 年来最强」,哪些因素导致的?未来还要热多久? – 知乎 https://www.zhihu.com/question/548225236
季风区迟迟不见台风来到,伏旱灼烧着这片土地,空调成为了必需品。谁不想当每次踏进家门的时候,迎来的是清爽的凉风,而不是已经在灼热的家中发酵一天的浑浊空气?

材料清单

开发板(Arduino或ESP系列),红外发射管、红外接收管,云服务器,导线。

红外遥控原理

家用的红外遥控通常是使用3.8kHz的电磁波,把一定的数据编码成电磁波的有无,然后发射出去。比如以下数组[200,100,300]表示,先持续200us发出红外波,然后持续100us无红外波,再持续300us发出红外波。电器上的红外接收器接收到了外界的红外信号然后解码,执行命令。

红外遥控库irremote

红外发射接收的细节不用我们自己去实现,因为已经有封装好的库可用了,那就是irremote。irSender的sendRaw函数能方便的发送红外数据,irReceiver的start函数能方便地接收红外数据。先来看看空调遥控器发送了什么数据:
打开示例的ReceiveDemo,同时也会打开PinDefinitionsAndMore.h,这个h文件里有这么一张表格:

/*

 * Pin mapping table for different platforms

 *

 * Platform     IR input    IR output   Tone      Core/Pin schema

 * --------------------------------------------------------------

 * DEFAULT/AVR  2           3           4

 * ATtinyX5     0|PB0       4|PB4       3|PB3

 * ATtiny167    3|PA3       2|PA2       7|PA7     ATTinyCore

 * ATtiny167    9|PA3       8|PA2       5|PA7     Digispark pro

 * ATtiny3217  18|PA1      19|PA2      20|PA3     MegaTinyCore

 * ATtiny1604   2           3|PA5       %

 * SAMD21       3           4           5

 * ESP8266      14|D5       12|D6       %

 * ESP32        15          4           27

 * BluePill     PA6         PA7         PA3

 * APOLLO3      11          12          5

 * RP2040       3|GPIO15    4|GPIO16    5|GPIO17

 */

从中找到与手头的板子相对应的IR input接口,比如用ESP8266开发板,接口就是14|D5,于是,把D5连接到红外接收模块的输出端,红外接收模块另外两端按照元件上的标志分别连VCC和GND即可,然后直接编译运行ReceiveDemo。
程序正在运行,拿起空调遥控板,对着红外接收头按一下,发现串口监视器输出了数据,这就是红外的RawData,来看看是怎样的。

[9030,4470, 680,1670, 630,570, 630,570, 630,1670, 630,620, 580,620, 630,570, 630,570, 630,1670, 630,1670, 630,570, 630,1720, 580,620, 630,570, 630,570, 630,570, 630,570, 630,570, 630,570, 630,620, 580,620, 580,1720, 580,620, 580,620, 580,620, 630,570, 630,570, 630,620, 580,1720, 580,620, 580,1720, 580,620, 580,620, 630,1670, 630,620, 580,20020, 630,570, 630,620, 580,620, 580,620, 580,620, 580,620, 630,570, 630,570, 630,620, 580,620, 630,570, 630,570, 630,570, 630,1670, 630,570, 630,570, 680,570, 630,570, 630,570, 630,570, 630,570, 680,520, 680,520, 680,520, 680,570, 630,570, 630,570, 630,570, 680,520, 680,520, 680,520, 680,520, 730,39920, 9030,4420, 730,1620, 680,520, 680,520, 680,1620, 680,570, 680,520, 680,520, 680,520, 680,1620, 680,1620, 680,520, 730,1570, 680,520, 680,520, 680,570, 680,520, 680,520, 680,520, 680,520, 680,520, 680,520, 680,1620, 680,570, 680,520, 680,520, 680,520, 680,520, 680,520, 680,1620, 680,1670, 630,1670, 680,520, 680,520, 680,1620, 680,520, 680,19970, 630,570, 680,520, 680,520, 680,570, 630,570, 630,570, 630,570, 630,570, 630,570, 680,520, 680,520, 680,570, 630,570, 630,570, 630,570, 630,570, 630,570, 680,520, 680,570, 630,570, 630,570, 630,570, 630,570, 630,620, 580,620, 630,570, 630,570, 630,570, 630,570, 630,1670, 630,1720, 580,1720, 580]

这就是一个例子,具体的细节我们不用管,接下来尝试一下红外发射。打开irremote示例里面的SendRawDemo。在此之前,需要根据上面那张表确定红外发射管的链接位置,比如ESP8266开发板应该用12|D6口连接发射管的正极。在loop里面,有这么几行代码:

    const uint16_t rawData[] = { 9000, 4500/*Start bit*/, 560, 560, 560, 560, 560, 1690, 560,560/*0010 0x4 of 16 bit address LSB first*/, 560, 560, 560, 560, 560, 560, 560, 560/*0000*/, 560, 1690, 560, 1690, 560,560, 560, 1690/*1101 0xB*/, 560, 1690, 560, 1690, 560, 1690, 560, 1690/*1111*/, 560, 560, 560, 560, 560, 560, 560,1690/*0001 0x08 of command LSB first*/, 560, 560, 560, 560, 560, 560, 560, 560/*0000 0x00*/, 560, 1690, 560, 1690, 560,1690, 560, 560/*1110 Inverted 8 of command*/, 560, 1690, 560, 1690, 560, 1690, 560, 1690/*1111 inverted 0 of command*/,560 /*stop bit*/}; // Using exact NEC timing
    IrSender.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), NEC_KHZ); // Note the approach used to automatically calculate the size of the array.

这就是发送红外数据的关键部分了。接下来,把rawData数组内容替换成之前接收到的数组,直接编译运行,在运行的时候记得把红外发射管对准空调,就能听到空调的响应了。

命令码与状态码

如果到这里一切顺利的话,一个空调遥控器就做好了,但是,你会发现不管发射几次,空调的各个参数一动不动。因为,空调的红外信号是状态码,不是命令码。它们之间的区别是这样的:
命令码:温度上升1度
状态码:温度设为25度
所以,状态码再怎么重复也没用。你需要把真实遥控器的信号一个个录下来,【25度,制冷,强风】是一个状态,【25度,制冷,无风】又是另外一个状态,只有都录下来了,才能完完全全地控制空调。

红外码库

一个个录下来当然是能成功的,但是,想要方便地控制,应当使用红外码库。如果在搜索引擎输入”红外码库“,会得到非常少的结果,目前开源、免费的红外码库只有IRext https://cc.irext.net/index.html#intro 。码库扮演了一个怎样的角色?它能把命令/状态转化为上文提到的RawData,从而单片机直接能够使用,不需要我们自己一个个记录遥控命令分别对应着一个什么样的数组。
参照它的文档 https://cc.irext.net/doc/ ,很容易就能在云服务器部署IRext服务。

wget https://irext-lib-release.oss-cn-hangzhou.aliyuncs.com/pc-docker-image/1.2.7/irext-private_1.2.7.tar.gz

wget https://irext-lib-release.oss-cn-hangzhou.aliyuncs.com/pc-docker-image/1.2.7/irext-private-data-20220303.tar.gz

tar -xf irext-private-data-20220303.tar.gz

sudo mv data /

sudo docker load < irext-private_1.2.7.tar.gz

sudo docker run -itd \
--name irext-private \
-v /data:/data \
-p 8080:8301 \
-p 8081:8081 \
irext-private:1.2.7 /data/start_irext.sh

然后,访问云服务器的8080端口,如果出现IRext的登录界面即为成功。
接下来,根据文档的Web API章节,按照提示注册好账户和Web API应用,就会获得一个AppKey和AppSecret,再依照文档一步步往下。
最终,可以通过向/irext-server/operation/decode发送POST请求,得到上面说的RawData数组。

云服务器中继

到这儿,已经能有在家远程控制空调的思路了:手机通过WiFi给单片机发命令,单片机拿到命令,通过网络询问IRext服务,然后就能拿到RawData,发送出去了。但是,如果在家外面呢?手机无法直接连上单片机,因此还需要云服务器作为中继,以云服务器为核心,手机和单片机都与它交流,它收到手机的命令进行解码,然后发送给单片机即可,接下来,就是前后端的事了。

未完待续……

今天的文章我用18元开了个空调……(一)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59929.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注