从零开始的智能家居
专家称「今年高温综合强度或为 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