这次我们来看一个 ESP32-S3 制作红外遥控器的完整方案。ESP32-S3 是带 Wi-Fi 和 BLE 的双核 MCU,用它做红外遥控器,核心价值不是“把按键信号发出去”,而是把客厅茶几上的好几把遥控器收进同一个入口:手机浏览器点一下、MQTT 消息触发、定时任务自动执行,一个板子就能完成旧家电的联网化改造。本文会从硬件接线、红外接收解码、红外发射、本地网页控制接口、批量场景自动化,再到常见报错排查完整走一遍。
先给结论:这个方案的硬件门槛很低,一块 ESP32-S3 开发板、一个 38kHz 红外接收头、一个红外发射管或发射模块,几十元就能开工。软件上最少只需要一个 Arduino 环境,或者烧一个 MicroPython 固件,不需要额外专用烧录器。难度主要在两个地方:一是把原遥控器的红外码“学”下来,二是把码按正确载波频率发出去。这两步只要理解了协议和库的用法,基本不会卡住。下面按实际开发顺序展开,照着操作就能跑通,适合嵌入式入门、智能家居 DIY 和想把老空调/老风扇接入网络的玩家。
1. ESP32-S3 红外遥控器核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 嵌入式 DIY 硬件项目:ESP32-S3 红外遥控器 |
| 主控芯片 | ESP32-S3,双核 Xtensa LX7,自带 Wi-Fi 和 BLE |
| 主要功能 | 红外接收解码、红外发射、Wi-Fi 联网、网页/手机控制、场景批量发送 |
| 常用红外协议 | NEC、Sony、RC5、RC6 等,以所选红外库支持范围为准 |
| 开发方式 | Arduino、ESP-IDF、MicroPython 三选一 |
| 硬件成本 | 开发板 + 红外接收头 + 红外发射模块,几十元级别 |
| 供电方式 | USB 5V 供电即可,便携场景可接锂电池 |
| 是否需要专用烧录器 | 一般不需要,利用开发板 USB 口直接烧录和监视 |
| 是否支持批量任务 | 支持,可在固件中定义场景模式,按顺序发送多条红外码 |
| 是否提供 API | 没有固定云端 API,可自建本地 HTTP 接口或 MQTT 接口 |
| 适合场景 | 替代多个遥控器、旧空调/电视联网控制、定时自动化、接入智能家居 |
从表格可以看出,这个项目不是单纯“发射红外”的玩具,而是一个可以长期使用的家庭自动化节点。后续你完全可以把空调的开关码、风扇的档位码、电视的音量码全部存进一份码表,然后通过网页接口触发。
2. 红外遥控器适用场景与使用边界
2.1 适合什么场景
ESP32-S3 做红外遥控器,最直接的使用场景就是“替代遥控器”。空调、电视、机顶盒、风扇、投影仪,只要原遥控器是红外方式,都可以通过记录红外码来复刻。因为 ESP32-S3 有 Wi-Fi,所以它还能比普通遥控器多出几个能力:
- 手机浏览器访问板子上的网页,点击按钮发送红外码。
- 通过 HTTP 接口或 MQTT 消息触发,接入 Home Assistant 等智能家居平台。
- 设置定时任务,例如每天 18 点自动开灯、22 点自动关空调。
- 组合批量指令,例如“离家模式”依次发送电视关机、空调关机、风扇关机。
这些能力对老设备尤其有价值。老空调没有联网模块,但用 ESP32-S3 补一个红外控制入口,就能在不改动设备本身的前提下获得远程控制能力。
2.2 红外遥控的天然边界
需要明确一点:红外遥控是“视线内”控制,红外信号不能穿墙,也不能绕过障碍物。你把发射管藏在柜子里,遥控距离和角度都会明显下降。如果想控制不同房间的设备,要么每个房间放一个 ESP32-S3,要么走 Wi-Fi 中转后由各房间节点分别发射。
还有一个常见误区:轻触开关能否用红外接收头代替?不能直接代替。轻触开关是物理通断,红外接收头只是把 38kHz 载波信号解调成电平输出,它本身不是开关。正确的做法是“红外接收头 + ESP32-S3 + 继电器或三极管”组成一个受遥控控制的开关:红外接收头收到码,MCU 判断指令,再去驱动继电器通断。直接把红外接收头焊进强电或大电流电路里,既不能代替开关,也有安全隐患。
2.3 合规与安全提醒
红外遥控器可以控制真实家电,使用时要特别注意边界:
- 只能控制自己合法拥有或已获得授权的设备。
- 不要用红外发射去干扰公共设施、未经授权的设备或他人家庭电器。
- 改装涉及强电的设备时,断电操作,并对电路做隔离和保护。
- 红外发射管长时间近距离照射眼睛没有直接伤害,但最好避免直接对着人眼长时间工作。
- 如果接入公网或局域网,要给板子设置访问限制,避免被局域网内其他人误触发。
3. 硬件准备与接线方法
3.1 模块选型
做 ESP32-S3 红外遥控器,需要三部分硬件:
- ESP32-S3 开发板:市面上常见的开发板都带 USB 口,可以直接烧录和供电。要注意不同开发板的 Flash 和 PSRAM 配置不同,购买时看清楚参数即可,红外遥控功能本身对内存要求不高。
- 红外接收头:常见的型号是 VS1838B、TL1838 这一类,工作电压 3.3V,输出 38kHz 解调信号。最好是买带引脚的小模块,方便面包板接线。
- 红外发射部分:可以买现成的红外发射模块,也可以自己用红外发射管加限流电阻和三极管搭建。自己搭的好处是可控功率,缺点是电路容易出问题。
如果以后想存大量红外码库,ESP32-S3 内置 Flash 通常已经够用。只有当你想保存几万条码或做日志录像时,才需要外接 TF 卡。ESP32-S3 的部分开发板可以通过 SDIO/SPI 方式驱动 32G TF 卡,但红外遥控器码表一般只有几 KB,这个扩展不是必须的。
3.2 接线参考表
下面是一组参考接线,GPIO 编号可以按你的实际板子修改:
| 模块 | 引脚 | 接 ESP32-S3 引脚 |
|---|---|---|
| 红外接收头 | OUT | GPIO 4 |
| 红外接收头 | VCC | 3.3V |
| 红外接收头 | GND | GND |
| 红外发射模块 | IN | GPIO 5 |
| 红外发射模块 | VCC | 5V 或 3.3V,以模块说明为准 |
| 红外发射模块 | GND | GND |
注意,接收头和发射模块是两套独立电路。推荐的接法是接收端用一个 GPIO,发射端用另一个 GPIO,不要共用一个引脚。这样在调试时可以一边学习原遥控器的码,一边验证发射结果。
3.3 发射电路注意事项
红外发射管不能直接用 GPIO 引脚驱动大电流,最好加一个 NPN 三极管做扩流。一个典型接法:
- GPIO 5 通过 1k 电阻接到 S8050 三极管的基极。
- 三极管发射极接 GND。
- 红外发射管正极接 5V,负极通过 30 到 50 欧姆限流电阻接三极管集电极。
这个电路的作用是让 MCU 的低电平信号控制三极管开关,从而让红外发射管获得足够的脉冲电流。如果直接用 GPIO 驱动发射管,发射距离会很短,可能只有几十厘米,实用性差。买现成发射模块则不需要自己搭电路,模块上已经带好了放大电路。
4. 开发环境搭建:Arduino、ESP-IDF、MicroPython 三选一
ESP32-S3 有三种常见开发路线,选择哪种取决于你的基础和使用习惯。下面分别说明。
4.1 Arduino 环境(推荐新手)
Arduino 是上手最快的方式,红外解码和发射都有现成库。步骤:
- 安装 Arduino IDE。
- 在“开发板管理器”中添加 ESP32 支持。
- 安装 esp32 核心后,选择“ESP32S3 Dev Module”开发板。
- 安装红外库 IRremote,在库管理器中搜索安装即可。
- 选择对应 USB 端口,编译上传。
实际操作中要注意:ESP32-S3 开发板可能会枚举出 USB 转串口和原生 USB 两个端口,Windows 下如果看不到串口,一般需要安装对应驱动。部分板子需要按住 BOOT 键再插 USB 才能进入下载模式。
4.2 ESP-IDF 环境(进阶/高稳定性)
ESP-IDF 是乐鑫官方框架,适合对稳定性、实时性要求更高的场景。典型建工程流程:
cd ~/esp . ./export.sh idf.py set-target esp32s3 idf.py menuconfig idf.py build idf.py flash monitor在 ESP-IDF 里,红外收发可以用 RMT 外设实现,也可以使用组件库里的 infrared 驱动。相比 Arduino,ESP-IDF 的配置项更多,但代码体积和运行稳定性通常更好。这里有一个高频坑:如果直接执行idf.py set-target esp32s3时报failed to set target esp32s3: non zero exit code 2,一般不是板子问题,而是环境变量或 Python 虚拟环境没配置好,我会在常见问题部分单独展开。
4.3 MicroPython / Python 方案
如果你更习惯 Python,可以给 ESP32-S3 烧 MicroPython 固件,然后用 Thonny 等工具写脚本。MicroPython 的好处是迭代快,不需要编译,改代码直接运行。红外处理方面,ESP32 的 MicroPython 固件提供了 RMT 模块,可以比较方便地生成 38kHz 载波。
方式很简单:下载对应 ESP32-S3 的 MicroPython 固件,用 esptool 擦除并烧录,之后用 Thonny 连接。注意不要用普通 CPython 直接操作 GPIO,MicroPython 是跑在单片机上的 Python 解释器。
4.4 怎么选
我的建议是:
- 第一次做,用 Arduino,库最成熟,资料最多。
- 想了解底层红外协议和 RMT 原理,用 ESP-IDF。
- 做快速原型、想用 Python 脚本组织逻辑,用 MicroPython。
三种方式最终都能完成红外遥控器,区别在于开发效率、代码体积和调试精细度。本文后面的核心示例以 Arduino 为主,MicroPython 会补一个发射示例。
5. 红外接收与解码:先把原遥控器码学下来
5.1 解码代码
在 Arduino 中,使用 IRremote 库可以非常方便地解码。下面是一个完整的接收端示例:
#include <IRremote.h> const int IR_RECEIVE_PIN = 4; void setup() { Serial.begin(115200); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); Serial.println("红外接收已启动,等待遥控器按键..."); } void loop() { if (IrReceiver.decode()) { IrReceiver.printIRResultShort(&Serial); IrReceiver.printIRSendUsage(&Serial); IrReceiver.resume(); } }这段代码做的事情:初始化接收头,然后不断检测红外信号。当原遥控器按键按下时,IRremote 库会把收到的协议类型、地址码、命令码打印到串口。IrReceiver.resume()的作用是准备好接收下一条信号,不要漏掉。
上传后打开 Arduino 的串口监视器,把原遥控器对准接收头,按下任意按键。如果成功,可以看到类似NEC, 0x00FF, 0x45, 32 bit的输出。这就是学习红外码的关键一步。
5.2 判断解码成功的标准
判断解码是否成功,有几个标准:
- 串口能打印出协议名,例如 NEC、SONY、RC5。
- 能稳定打印出地址码和命令码,多次按同一个键,地址和命令一致。
- 按住按键不松手时,会看到重复码输出,这是正常现象。
只要满足这些条件,这个键的红外码就已经“学”下来了。你只需要把不同按键的协议、地址、命令记录到一张码表里,后面发射时直接调用。
5.3 常见失败原因
如果串口没有任何输出,优先检查:
- 红外接收头 OUT 是否接对了 GPIO,VCC 和 GND 是否反接。
- 接收头是否对准了原遥控器,距离不要超过 30 到 50 厘米。
- 串口波特率是否设为 115200。
- 红外接收头是否损坏或供电不足。
另外,部分遥控器使用 RC5、RC6 这类协议,库同样支持。极少数遥控器使用私有编码,IRremote 解不出来,这种情况要么换库,要么用逻辑分析仪抓波形。
6. 红外发射:把码按 38kHz 载波发出去
6.1 Arduino 发射代码
IRremote 库安装后,发射代码非常简洁。下面是一个通过串口输入十六进制码,控制 GPIO 5 发射 NEC 码的示例:
#include <IRremote.h> const int IR_SEND_PIN = 5; void setup() { Serial.begin(115200); IrSender.begin(IR_SEND_PIN); Serial.println("红外发射已初始化,请输入十六进制码"); } void loop() { if (Serial.available()) { String s = Serial.readStringUntil('\n'); s.trim(); if (s.length() > 0) { unsigned long code = strtoul(s.c_str(), NULL, 16); IrSender.sendNEC(code, 32); Serial.printf("已发送 NEC 0x%08X\n", code); } } }上传后在串口监视器输入00FF45,板子会通过 GPIO 5 发射 NEC 码。只要发射电路接线正确,原设备就会被控制。sendNEC的第一个参数是整条 NEC 码,第二个是位数,一般是 32 位。
6.2 MicroPython RMT 发射示例
如果用的是 MicroPython,可以借助 ESP32 的 RMT 模块直接生成 38kHz 载波。NEC 码的时序大致是:9ms 引导高电平 + 4.5ms 低电平,随后按位发送,1 码是 560us 高 + 1690us 低,0 码是 560us 高 + 560us 低。用 RMT 生成这个时序并不复杂:
from machine import Pin import esp32 tx_pin = Pin(5, Pin.OUT) rmt = esp32.RMT(0, pin=tx_pin, clock_div=80, carrier_freq=38000) NEC_HEADER = (9000, 4500) BIT_1 = (560, 1690) BIT_0 = (560, 560) TRAILER = (560, 0) def build_nec(addr, cmd): data = [NEC_HEADER] # 地址低 8 位 for i in range(8): data.append(BIT_1 if (addr >> i) & 1 else BIT_0) # 地址高 8 位 for i in range(8): data.append(BIT_1 if ((addr >> 8) & 0xFF) >> i & 1 else BIT_0) # 命令码 for i in range(8): data.append(BIT_1 if (cmd >> i) & 1 else BIT_0) # 命令反码 for i in range(8): data.append(BIT_1 if ((cmd ^ 0xFF) >> i) & 1 else BIT_0) data.append(TRAILER) return [(t * 1000, s * 1000) for t, s in data] rmt.send(build_nec(0x00FF, 0x45))这段代码把 us 单位的时间乘 1000 转成 ns,然后交给 RMT 发送。不同版本的 MicroPython RMT API 可能略有差异,实际运行时以你烧录固件版本的文档为准。MicroPython 这个路线的优点是不需要编译,改一次立即能测。
6.3 发射验证与调试
发射是否成功,最直接的验证方式是看被控家电有没有响应。如果你手头有红外接收头,也可以在接收端用 IRremote 解码逻辑再次确认发射的码和原遥控器是否一致。
如果码一致但设备没反应,优先检查:
- 发射载波频率是不是 38kHz,接收头的频点和发射管的频点要匹配。
- 发射管前的限流电阻是否过大,导致发射功率不足。
- 发射方向是否对准设备接收窗。
- 供电是否稳定,电池供电时电压偏低会影响发射距离。
7. 联网控制与批量场景:手机、网页、MQTT 都能遥控
7.1 本地 HTTP 接口
ESP32-S3 自带 Wi-Fi,可以让开发板自己当一个轻量 Web Server,手机浏览器直接访问控制页面。下面给一个最小示例:
#include <WiFi.h> #include <WebServer.h> #include <IRremote.h> const char* ssid = "YOUR_WIFI"; const char* password = "YOUR_PASSWORD"; const int IR_SEND_PIN = 5; WebServer server(80); void handleSend() { uint32_t code = strtoul(server.arg("code").c_str(), NULL, 16); IrSender.sendNEC(code, 32); server.send(200, "text/plain", "OK"); } void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } IrSender.begin(IR_SEND_PIN); server.on("/send", handleSend); server.begin(); Serial.println(WiFi.localIP()); } void loop() { server.handleClient(); }这段代码在setup中连接 Wi-Fi,然后注册了一个/send接口。浏览器或调用方可以通过 URL 参数传递十六进制码,板子收到后立刻发射。启动后串口会打印WiFi.localIP(),把这个 IP 记下来。
7.2 调用接口
接口形式是 HTTP GET,例如:
curl "http://192.168.1.100/send?code=0x00FF45"也可以用 Python 调:
import requests base_url = "http://192.168.1.100/send" code = "0x00FF45" response = requests.get(base_url, params={"code": code}, timeout=5) print(response.status_code, response.text)这种方式非常适合把红外遥控接入自己的脚本工具里。你可以在电脑上写一个定时任务,到点调用接口,板子就帮你按下空调“开机”。注意,IP 地址、Wi-Fi 名、码值都要按实际环境替换。
7.3 批量场景与定时任务
红外遥控的价值不只是单个按键,而是组合场景。你可以在固件里维护一个场景列表:
struct IR_ACTION { uint32_t code; uint16_t interval_ms; }; const IR_ACTION awayMode[] = { {0x00FF45, 2000}, {0x00FF46, 2000}, {0x00FF47, 0} };然后在场景函数里顺序发射,每两条之间间隔一定时间,避免设备来不及响应:
void runScene(const IR_ACTION actions[]) { for (int i = 0; actions[i].interval_ms != 0; i++) { IrSender.sendNEC(actions[i].code, 32); delay(actions[i].interval_ms); } }定时任务可以用 ESP32-S3 的 RTC 或定时器实现,也可以在电脑端用 cron 定时调用 HTTP 接口。批量任务最怕的问题是“某一步失败后不知道执行到哪”,所以在实际工程中建议加日志,每次发送后在串口或 HTTP 返回里记录当前步骤和结果。
7.4 接入智能家居的思路
ES32-S3 本身有 BLE,可以用 Home Assistant 的 ESPHome 组件接入,也可以用 MQTT 消息触发。MQTT 的好处是解耦,控制端不需要知道板子在哪。大致思路:ESP32-S3 订阅一个主题,例如home/ir/send,收到 JSON 消息后解析码值并发射。这样可以很自然地接入到 Node-RED、Home Assistant 或自己的自动化脚本里。
如果只是局域网个人使用,HTTP 接口已经够了。如果要做多设备联动,建议优先考虑 MQTT。
8. 资源占用与性能观察
8.1 内存与 Flash 占用
嵌入式项目不像显卡项目那样要关注显存,但要关注 Flash 和 RAM。红外遥控功能本身很轻量,解码和发射代码只占用很少的 Flash;主要的资源消耗来自 Wi-Fi 和 Web Server。从实际工程经验看,启用 Wi-Fi + HTTP 后 RAM 占用会明显上升,因此不要开太多不必要的外设和日志。
观察方法很简单:在 Arduino 里开启ESP.getFreeHeap()打印可用堆内存,在编译输出里看 Flash 占用百分比。例如:
void loop() { static unsigned long last = 0; if (millis() - last > 5000) { Serial.printf("Free heap: %lu bytes\n", ESP.getFreeHeap()); last = millis(); } server.handleClient(); }如果你发现内存不够,优先关闭日志输出、减少全局缓存、把红外码表放到PROGMEM或只读数据段。
8.2 功耗和供电
红外遥控器的实际功耗取决于使用方式。待机时 ESP32-S3 的功耗不高,但一次 Wi-Fi 通信会拉高瞬时功耗。如果使用电池供电,需要注意休眠设计,例如使用 ESP32-S3 的 deep sleep 唤醒后发送红外码,再继续休眠。如果只是 USB 供电放在客厅角落,功耗基本不用管。
发射瞬间电流较大,如果电源质量差,可能导致板子重启或无规律报错。推荐使用质量好一点的 USB 电源线,或者给发射部分独立供电。
8.3 如何降低资源占用
- 去掉不用的打印日志,
Serial.printf会在高频路径上拖慢速度。 - 使用静态码表代替动态数组。
- 关闭不用的外设,比如 BLE、ADC、触摸传感器。
- 如果不需要网页页面,可以只保留 HTTP 接口,不输出 HTML。
- 批量场景中,两条码之间加延时,避免连续发射导致缓冲区溢出。
这些优化不是必须的,但能让项目更稳定,尤其是长期挂在家庭网络里运行时。
9. 常见问题与排查方法
9.1 “failed to set target esp32s3” 的解决
这个是 ESP-IDF 环境里非常高频的报错,完整信息类似:
failed to set target esp32s3: non zero exit code 2 your environment is not c看到这个报错,先不要怀疑板子坏了。它通常是环境变量、Python 虚拟环境、路径或权限问题导致的。常见原因和解决办法:
| 现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| failed to set target esp32s3 | Python 虚拟环境未激活 | 检查命令行是否有ESP-IDF标识 | 重新运行./install.sh后激活venv |
| failed to set target esp32s3 | IDF_PATH未设置或设置错误 | 执行echo $IDF_PATH | 重新导入 ESP-IDF 环境 |
报错信息里出现your environment is not c | Python 环境异常或依赖缺失 | 检查 Python 版本和pip list | 按官方文档重新创建虚拟环境 |
| Windows 下报错 | 路径包含中文或空格 | 查看当前项目路径 | 把项目放到纯英文无空格路径下 |
| 旧版本 ESP-IDF 不支持 S3 | 版本过旧 | 查idf.py --version | 升级到支持 ESP32-S3 的版本 |
一句话总结:这个报错 90% 是环境配置问题,不是硬件问题。重新配置好 ESP-IDF 环境后,idf.py set-target esp32s3通常能顺利通过。
9.2 其他高频问题排查表
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 烧录时报错,找不到端口 | USB 驱动未安装或板子未进入下载模式 | 换 USB 口、按住 BOOT 键重新插拔 | 安装对应开发板驱动,重新选择端口 |
| 串口能输出但解码无反应 | 红外接收头接线错误或供电不足 | 万用表量 VCC 和 GND | 重新接线,改用 3.3V 供电 |
| 解码有时成功有时失败 | 接收角度不好或距离太远 | 缩短距离观察 | 增加接收头对准角度,换质量好的接收头 |
| 发射码正确但设备无响应 | 载波频率不匹配或发射功率不足 | 检查发射管频点、限流电阻 | 加三极管放大,减小限流电阻阻值 |
| 发射距离很短 | GPIO 直接驱动发射管 | 看电路是否加了放大 | 用 NPN 三极管或购买现成发射模块 |
| 网页接口访问不到 | Wi-Fi 未连接或 IP 地址变了 | 看串口打印的 IP | 重启板子后重新获取 IP,或设置固定 IP |
| 批量场景执行一半卡住 | 发射后设备响应慢或缓存溢出 | 加打印日志观察 | 每条码之间加延时,增加缓冲区 |
| 遥控器控制开关不稳定 | 红外接收头被误当作开关接入 | 检查电路结构 | 使用“接收头 + MCU + 继电器”方案 |
如果在这些表里没找到你的问题,可以先从串口日志开始排查。很多问题都是接线和供电引起的,先查硬件,再查软件。
10. 最佳实践与合规使用建议
10.1 开发建议
第一次做不要追求功能齐全,先跑通“接收解码”和“发射验证”这两步。建议按下面顺序推进:
- 第一版只做接收解码,把原遥控器的按键码完整记下来。
- 第二版只做发射,用串口输入十六进制码测试设备响应。
- 第三版加 Wi-Fi 和 HTTP 接口,用手机浏览器控制。
- 第四版再加场景、定时和 MQTT。
每个阶段保留一个可运行的固件备份,出问题时可以快速回退。码表单独放一个文件,分成“设备名、协议、地址、命令码”四列,方便后续扩展。
输入素材、码表、固件和烧录脚本分开管理。我的习惯是建一个项目目录:
project/ firmware/ esp32s3_ir_remote.ino data/ ir_code_table.csv tools/ batch_send.py logs/ debug_output.log这样批量调用、日志排查、固件升级都清晰。
10.2 合规使用边界
红外遥控涉及对真实设备的控制,必须坚持合法授权原则:
- 只能控制你自己购买、拥有或已获得明确许可的设备。
- 不要用遥控码学习功能去破解或干扰公共设备、商业设备和他人设备。
- 不要把板子暴露在公网,局域网控制时也要设置简单鉴权,防止误操作。
- 涉及强电设备改装,必须断电操作,由有电工基础的人完成接线。
- 不要使用本方案做任何形式的信号欺骗、非法侵入或自动化干扰。
另外,学习遥控器码时,尽量只记录自己设备的码,不批量采集公共遥控器码并公开传播。这个项目做出来应当是方便自己家庭或办公环境的工具,而不是用来绕过权限控制的手段。
11. 总结与下一步
ESP32-S3 做红外遥控器,最值得尝试的点在于:它把一个普通红外遥控器变成了有网口的设备,几十元硬件就能轻松复刻空调、电视、风扇等设备的按键,再叠加网页、MQTT、定时和场景批量控制,实用性远超普通遥控器。
建议拿到板子后,第一件事就是跑通第 5 章的红外接收解码,把原遥控器最常用的几个按键码记下来。这是整个项目的地基;解码能稳定出结果,后面发射和联网都是顺水推舟。最容易踩的坑集中在两块:一是 ESP-IDF 环境报failed to set target esp32s3,按照 9.1 的环境排查思路检查虚拟环境和路径;二是发射距离短,多半是 GPIO 直驱功率不够,补一个三极管放大电路就解决了。
后续可以扩展的方向很多:把码表做成网页配置界面、增加屏幕显示、用 BLE 做手机小程序控制、接入 Home Assistant 实现语音控制,甚至给 ESP32-S3 再加一块 TF 卡离线存储整个码库。建议先收藏,实际动工时按本文的步骤逐项验证,成功后再逐步加功能。