如何使用ESP8266 OTA远程更新升级后的遥控器
自从我发布红外遥控器项目已经六年了,至今只有一人关注过。此后,我搬到了另一处公寓楼,房东强制要求支付Comcast/Xfinity的有线电视和网络费用。不言而喻,服务体验非常糟糕,因为当付费成为租赁合同的一部分时,住户完全失去了谈判能力。
房东之所以签订此类协议,是为了获取经济回扣,并展示他们愿意为房产支付高于市场价的价格。Comcast也乐于接受这种安排,因为他们只需向一位客户(即房东)负责,对它们而言,住户是免费获得服务的。
除非你是埃琳·布罗科维奇,否则你对此几乎无能为力。然而,当你终于接入网络后,就会遇到遥控器方面的问题。
Comcast已从传统的红外(IR)遥控器转向射频(RF)和蓝牙遥控器。目前的遥控器支持语音指令,但体积笨重,且耗电量大。
方案设计
构建一个遥控器代码翻译器。我们本质上是在实现一种通用化的普通遥控器。
任何红外遥控器上的每个按钮都会按照标准协议发送特定代码,该代码被设定用于触发电视、机顶盒、风扇等设备的特定操作。如果电视接收到来自不同遥控器的代码,它会直接忽略,因为该代码没有对应的操作。代码翻译装置会接收新遥控器发出的代码,并根据预设的代码映射,向电视发送其期望的指令。
使用红外遥控器,我们可以获得以下优势:
•隐私保护
•安全性
•节能效果
•减少按键数量
•一键完成多种操作
•通过空中固件(OTA)更新灵活配置代码映射
硬件方面
我们本可以像之前红外遥控项目那样使用Arduino Pro Micro,再加装红外LED,但我们在AliExpress上找到了更合适的选择。
对于如此便宜的产品,我们也不应期待太多文档支持。
ESP8266-IR-Transceiver 随附了固件,但没有配套的使用手册。由于我们无法让固件正常工作,因此需要自行编写固件。有趣的是,该板子虽然带有USB-C接口,但仅用于供电。由于ESP8266本身不支持原生USB功能,所以我们必须使用USB转串口适配器来刷写自己的固件。我们在复位引脚上加了一个开关,在IO0引脚上又加了一个开关,这样就可以在不使用跳线连接引脚、也不拔掉板子的情况下刷写固件。更多详细信息请参见此处。
我们需要通过恢复出厂设置来解除当前遥控器的配对。这个过程会使遥控器改用红外信号而非射频信号进行通信。现在我们可以捕获红外码及其对应的操作,以便将其映射到新遥控器的红外码。请注意,我们将红外LED朝向与遥控器和接收设备相对应的方向。
软件
经过几次代码修改后,我们厌倦了使用跳线和重新插接电路板。ESP 提供了一个解决方案,且无需安装库文件。该方案是通过 OTA 固件更新实现的,我们在最近的项目中已采用此方法。
以下是所用文件的简要概述:
platformio.ini
我们给主机名命名为ESP8266IrTr,但你也可以选择其他未在Wi-Fi上使用的名称。代码已编写为仅在一个地方更新该变量。
该文件包含两个环境:
•[env:d1_mini]:当板子物理连接到计算机时使用(必须在首次上传时使用)
•[env:d1_mini_ota]:当板子连接到与计算机相同的Wi-Fi时使用(后续上传可使用)
ota_delay.py
PlatformIO中的“Update and Monitor”功能适用于[env:d1_mini]。为了在使用[env:d1_mini_ota]时获得相同监控功能,我们必须确保板子连接到与计算机相同的Wi-Fi网络。此Python文件正是为此而设计的。
OTATelnet.h 和 OTATelnet.cpp
我们添加了MultiPrint,以避免通过函数同时输出到Serial和Telnet,从而管理多个打印行。我们将使用setup部分的InitSharedServices和loop部分的HandleSharedServices来保持代码非阻塞。
main.cpp
创建了CodeMap结构体,用于保存输入代码、输出代码及其关联的函数。一旦接收到可读的代码,内置LED灯就会亮起,随后ESP8266会进行查找。如果找到对应的输出代码,就会发送出去。可能有多个代码,我们将按顺序依次发送。循环结束时,内置LED灯会熄灭,ESP8266将开始等待下一个红外码。
如果遇到协议冲突,可以尝试屏蔽电视接收端。我们的新款遥控器发送的是NEC码,而旧款电视遥控器也使用NEC码。当新遥控器发送一个代码后,ESP8266在短时间内也发送了一个代码,此时电视就无法区分它们了。
本文编译自hackster.io





