
这次我们来看一个非常实用的嵌入式小项目用 ESP32-S3 自制红外遥控器。ESP32-S3 本身不带红外收发硬件但通过外接一个红外发射管和一个红外接收头就能把它变成一台可编程的红外遥控设备。做完之后你既可以录制并复现电视、空调、风扇等家电的红外遥控码也可以通过手机或电脑用 HTTP 接口远程发送红外指令还能把普通按键开关改造成遥控开关。整个项目硬件成本很低核心难点在协议理解和接线适合已经能点亮 ESP32-S3、想往实际场景走的开发者。先说值得关注的点。第一ESP32-S3 支持 WiFi 和 BLE所以这个红外遥控器天然可以联网能接入家庭自动化系统也能做成局域网 HTTP 服务。第二红外协议是可编程的NEC、SONY、RC-5 等都可以通过库或自己编码实现并不局限于某个品牌。第三红外发射和接收模块成本极低几元到十几元就能买到开发板本身性能也足够跑红外任务时几乎感觉不到压力。第四接收端可以用来做开关控制家里带红外遥控的灯、风扇、机顶盒都能纳入统一控制。第五整个项目可以做到一键烧录、串口调试、浏览器控制不依赖复杂云端服务。本文会带你完整过一遍红外遥控的基础知识、硬件选型与接线、Arduino 固件实现、MicroPython/Python 方案、红外接收控制开关、HTTP 远程控制接口、功能测试方法、常见报错排查以及工程化建议。如果你恰好手头有 ESP32-S3 开发板这篇文章可以直接作为操作清单来用。1. ESP32-S3 红外遥控器核心能力速览能力项说明项目类型嵌入式硬件 DIY红外发射与接收主控芯片ESP32-S3双核 Xtensa LX7240 MHz支持 2.4G WiFi 和 BLE 5主要功能红外遥控码录制、红外信号回放、遥控开关控制、局域网 HTTP 红外接口推荐硬件ESP32-S3 开发板、红外发射管、红外接收头 VS1838B / TSOP38238、NPN 三极管、电阻、继电器模块开发平台Arduino IDE / ESP-IDF / MicroPythonPython依赖库Arduino 下可选用 IRremote、IRsend、IRrecvMicroPython 下可自写 PWM 调制或使用第三方红外库通信接口串口调试、WiFi HTTP 接口是否支持远程控制支持通过 WiFi 启动 HTTP 服务后可用浏览器或 curl 调用是否支持定时/批量任务可以在固件中编写定时或批量发送逻辑例如按时间表发送多个遥控码适合人群有一定嵌入式基础、想熟悉红外协议和 ESP32-S3 外设的开发者ESP32-S3 做红外遥控器本质上是把它当成一个“可编程的红外收发器”。它不负责理解家电内部逻辑只负责在正确的时间点产生 38kHz 载波或者把接收到的载波信号解码为 0 和 1。真正决定“能不能遥控成功”的是红外协议本身和硬件电路是否匹配。2. 红外遥控基础知识与硬件选型2.1 为什么是 38kHz 载波红外遥控不是直接把高低电平发出去而是先把数据信号调制到 38kHz 左右的载波上再驱动红外发射管发光。接收端使用带 38kHz 带通滤波的红外接收头把收到的光信号解调成普通的高低电平。这样做的好处是抗干扰能力强室内常见的红外光、灯光、太阳光不会轻易造成误触发。虽然不同品牌可能使用 36kHz、38kHz 或 40kHz 载波但 38kHz 是最常见的规格绝大多数家用红外遥控器都在这个范围内。市面上常见的 VS1838B、TSOP38238 等接收头也都是针对 38kHz 设计的。如果要做兼容性更高的遥控器可以考虑去读取原遥控器发射出来的载波频率或者直接使用支持多频率的库。2.2 NEC 协议格式NEC 协议是红外遥控里最普及的协议之一很多国产电视、机顶盒、风扇都在用。一个完整的 NEC 帧长这样引导码9ms 载波 4.5ms 空闲地址码8 bit 地址 8 bit 地址反码命令码8 bit 命令 8 bit 命令反码停止位560µs 载波逻辑 0 用 560µs 载波 560µs 空闲表示逻辑 1 用 560µs 载波 1690µs 空闲表示。数据位是先发送最低位因此地址和命令在拼接成 32 位整数时顺序需要特别注意。理解 NEC 的好处是即使没有库你也可以用 GPIO 和延时自己把数据发出去。实际调试中最常用的做法是先用接收头录制原遥控器的码然后在串口里打印出 32 位十六进制值再用发射端把同一个值发回去。这个流程可以覆盖大多数 NEC 设备。2.3 发射管与接收头怎么选红外发射管选择 940nm 波长的 5mm 红外 LED 即可市场上大量遥控器用的就是这类管子。单个发射管直接接 GPIO 虽然能工作但驱动能力有限发射距离和角度都不理想。更稳妥的方案是加一个 NPN 三极管做电流放大或者直接买带三极管驱动的红外发射模块。红外接收头选择 VS1838B 或 TSOP38238 这类三脚一体化解调接收头。它们内部已经集成了 38kHz 带通滤波、自动增益控制和信号解调电路输出端直接给出 TTL 电平信号编程非常方便。接收头一般有三个引脚VCC、GND、OUT。部分模块支持 3.3V 或 5V 供电接线前务必确认模块的引脚定义。3. 硬件准备与接线3.1 材料清单ESP32-S3 开发板一块建议带 USB 串口芯片的版本比如常见的 ESP32-S3-DevKitC 或兼容板红外发射管 1 个940nm 5mm红外接收头 1 个VS1838B 或 TSOP38238NPN 三极管 1 个型号可用 S8050电阻1kΩ 1 个100Ω 1 个面包板或洞洞板、杜邦线若干可选继电器模块、LED、220V 转 5V 模块等用于做开关控制测试3.2 参考接线表不同开发板丝印和引脚编号可能不同以下是一组常见的参考接线实际使用前先对照自己开发板的引脚图确认。ESP32-S3 引脚元件说明GPIO4三极管基极经 1kΩ 电阻控制红外发射管5V 或 3.3V红外发射管阳极经 100Ω 限流电阻或由三极管电路决定GPIO5红外接收头 OUT接收解调后的红外信号3.3V红外接收头 VCC多数接收头可接 3.3V部分模块需要 5VGND所有 GND 共地发射和接收电路共地GPIO6继电器 IN可选控制外部设备开关红外发射端有一个常见误区直接把发射管正负极接到两个 GPIO 上也能亮但电流不受控且 GPIO 驱动能力有限。更稳定的做法是用三极管做开关。参考接法为GPIO4 串 1kΩ 电阻接到 S8050 基极S8050 发射极接 GNDS8050 集电极接红外发射管阴极红外发射管阳极接 5V 或 3.3V。这样 GPIO 只需要提供很小的基极电流红外发射管的电流由电源和三极管决定发光强度更稳定。3.3 开发板差异说明ESP32-S3 开发板种类很多有的板子已经集成红外发射模块有的则有额外扩展板。如果你用的是模块化产品务必先看原理图或丝印确认引脚是否被占用。另外ESP32-S3 的 GPIO 输入输出耐压有限不能直接把 5V 信号接到 3.3V 引脚上电平转换和限流电阻是必须考虑的问题。4. 开发环境准备与固件烧录4.1 安装 Arduino IDE 与 ESP32-S3 开发包使用 Arduino IDE 是目前最省事的路线。打开 Arduino IDE 后在“文件”-“首选项”-“附加开发板管理器网址”中填入 ESP32 官方包地址然后在“开发板管理器”中搜索 esp32 并安装。安装完成后在“工具”-“开发板”里能看到 ESP32S3 Dev Module。首次使用需要确认串口驱动。ESP32-S3 开发板常见的 USB 转串口芯片是 CP2102 或 CH340Windows 下如果设备管理器没有识别到 COM 口需要单独安装对应驱动。如果开发板用原生 USB 接口则可能直接识别为 USB Serial具体取决于开发板设计。4.2 安装红外相关库Arduino 下推荐安装 IRremote 库。在库管理器中搜索 IRremote安装最新的稳定版本。需要注意的是IRremote 库在不同版本中 API 略有调整本文示例代码采用较通用的写法如果编译报错优先检查库版本或改用 IRremote 官方示例中的新 API。4.3 烧录项目在 Arduino IDE 中选择开发板为 ESP32S3 Dev Module选择正确的 COM 口点击上传即可。如果使用命令行工具也可以通过 arduino-cli 完成arduino-cli board list arduino-cli core install esp32:esp32 arduino-cli compile --fqbn esp32:esp32:esp32s3 ./ir_remote.ino arduino-cli upload --port COM3 --fqbn esp32:esp32:esp32s3 ./ir_remote.ino如果之前用过 ESP-IDF也可以直接使用 idf.py 命令idf.py set-target esp32s3 idf.py flash monitor4.4 烧录报错与环境修复不少开发者在烧录时遇到过类似下面的报错failed to set target esp32s3: non zero exit code 2 your environment is not correctly set up这类报错的原因通常不是代码问题而是环境连接问题。常见排查思路如下确认开发板的 USB 串口芯片驱动已经安装设备管理器中能看到 COM 口。确认 Arduino IDE 或 PlatformIO 中选中的端口和实际设备一致。拔掉其他占用串口的软件例如串口监视器、其他烧录工具。如果开发板没有自动进入下载模式按住 BOOT 键再按一下 EN/RST 键松开 BOOT 后再尝试烧录。如果是 ESP-IDF 环境检查 IDF_PATH 和工具链路径是否被多次安装覆盖必要时重新执行环境导出脚本。5. Arduino 固件实现红外发射与接收5.1 同时支持收发和串口回放下面这段代码同时初始化了红外发射和接收。启动后先用真实遥控器对着接收头按下按键串口监视器会打印捕获到的十六进制编码然后在串口输入框发送S:0x00FF00FF这种格式的命令开发板就会把对应编码用 NEC 协议发送出去。#include IRremote.h const int IR_TX_PIN 4; const int IR_RX_PIN 5; IRsend irsend(IR_TX_PIN); IRrecv irrecv(IR_RX_PIN); decode_results results; void setup() { Serial.begin(115200); irrecv.enableIRIn(); Serial.println(IR Remote Test); } void loop() { // 串口命令发送 if (Serial.available()) { String cmd Serial.readStringUntil(\n); cmd.trim(); if (cmd.startsWith(S:)) { uint32_t code strtoul(cmd.substring(2).c_str(), NULL, 16); Serial.print(send NEC: 0x); Serial.println(code, HEX); irsend.sendNEC(code, 32); } } // 红外接收解码 if (irrecv.decode(results)) { Serial.print(R:0x); Serial.println(results.value, HEX); irrecv.resume(); } delay(10); }把真实遥控器对准红外接收头按下按键时串口会输出类似R:0x00FF45BA的数值。这个值就是该按键对应的 NEC 编码。再把同样的值通过串口输入发出去如果红外发射管已经对准设备设备应该能执行对应操作。5.2 判断发射是否成功的标准发射成功的标志不是肉眼看见红外灯亮而是目标设备有响应。如果串口已经打印send NEC: 0x...但设备没反应优先检查两点一是红外发射管是否对准设备且中间没有遮挡二是发射电路是否提供了足够的驱动电流。部分红外发射管如果直接接 GPIO发射距离可能只有几十厘米加了三级管放大电路后可以明显改善。5.3 录入多个遥控器按键实际使用中通常需要保存多个按键的编码。简单做法是把串口打印的编码整理成一个数组给每个编码起一个可读的名字例如“电视_电源”“空调_制冷”“风扇_摇头”。后续需要发送时通过串口命令选择对应的名称即可。更进一步的方案是把编码存入 EEPROM 或 SD 卡这样重启后仍然保留。6. MicroPython/Python 开发方案6.1 为什么可以用 Python 开发如果你对 C/C 不熟悉可以直接给 ESP32-S3 刷入 MicroPython 固件然后用 Python 写控制逻辑。MicroPython 底层已经封装好了 GPIO、PWM、WiFi 等外设接口开发效率很高。需要注意的是MicroPython 固件版本较多不同版本之间machine.PWM的 API 有差异建议先查阅官方文档。6.2 用 PWM 和延时模拟 NEC 编码MicroPython 可以通过 PWM 产生 38kHz 载波然后在合适的时间点开启和关闭 PWM从而模拟 NEC 协议。下面是一个简化示例展示了核心思路from machine import Pin, PWM import time TX_PIN Pin(4, Pin.OUT) pwm PWM(TX_PIN, freq38000, duty0) def carrier_on(): pwm.duty(512) def carrier_off(): pwm.duty(0) def send_pulse(us): carrier_on() time.sleep_us(us) carrier_off() def send_nec(address, command): send_pulse(9000) time.sleep_us(4500) # 地址 for i in range(8): bit (address i) 1 if bit: send_pulse(560) time.sleep_us(1690) else: send_pulse(560) time.sleep_us(560) # 地址反码 for i in range(8): bit ((address ^ 0xFF) i) 1 if bit: send_pulse(560) time.sleep_us(1690) else: send_pulse(560) time.sleep_us(560) # 命令 for i in range(8): bit (command i) 1 if bit: send_pulse(560) time.sleep_us(1690) else: send_pulse(560) time.sleep_us(560) # 命令反码 for i in range(8): bit ((command ^ 0xFF) i) 1 if bit: send_pulse(560) time.sleep_us(1690) else: send_pulse(560) time.sleep_us(560) send_pulse(560) # 示例发送地址 0x00FF命令 0x45 send_nec(0x00FF, 0x45)这段代码的重点是演示调制的逻辑实际项目中如果对时序要求很高建议使用经过验证的第三方库或者购买支持红外协议的扩展板。MicroPython 下延时精度不如 C 语言稳定测试时需要多验证几次。6.3 MicroPython 方案适用场景MicroPython 更适合快速验证协议、做原型、写 Web 控制页。如果要做成低延时、高并发的批量遥控设备或者需要长时间稳定运行还是建议回归 Arduino 或 ESP-IDF。红外遥控本身对时序要求较高实时操作系统和稳定驱动带来的收益会更明显。7. 遥控器控制开关红外接收头能否代替轻触开关很多初学者会问轻触开关能否用红外接收头代替答案是“不能直接代替”。轻触开关是手动输入设备用户按下后形成通路红外接收头是把红外光信号转换成电信号的传感器两者物理性质和用途完全不同。但是可以用红外接收头配合逻辑判断和继电器把“红外遥控器按键”转成“开关动作”最终实现类似按键开关的效果。7.1 控制逻辑先通过红外接收头解码遥控器按键当收到目标编码时切换某个 GPIO 的电平再用这个 GPIO 控制继电器或三极管从而控制电灯、风扇等设备。常见设计有两种一种是按一下遥控键就翻转一次开关状态另一种是长按遥控键执行开启再按一次执行关闭。7.2 继电器控制开关示例把 GPIO6 接继电器模块的 IN 引脚GND 和 VCC 接对应电源。当红外接收头解码到指定编码时翻转继电器状态#include IRremote.h const int IR_RX_PIN 5; const int RELAY_PIN 6; const uint32_t TOGGLE_CODE 0x00FF45BA; // 替换为你遥控器的编码 IRrecv irrecv(IR_RX_PIN); decode_results results; bool relayState false; void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(results)) { if (results.value TOGGLE_CODE) { relayState !relayState; digitalWrite(RELAY_PIN, relayState); Serial.print(relay: ); Serial.println(relayState ? ON : OFF); } irrecv.resume(); } delay(10); }如果你用的是高电平触发继电器需要确认模块的触发方式如果控制的是强电设备必须使用具备隔离和过流保护的合格继电器模块并且严格遵守用电安全规范。强电部分没有经验的话不要盲目接线。8. HTTP 接口与远程控制8.1 开启 WiFi 服务ESP32-S3 的优势是自带 WiFi可以把红外遥控器做成局域网内的 HTTP 服务。这样一来不需要串口线只要浏览器或脚本能访问到开发板 IP就可以发送遥控码。8.2 简单的 HTTP 红外发送服务下面代码在 ESP32-S3 上启动一个 WebServer访问/send?code0x00FF45BA就会发送对应的 NEC 编码。这里用 GET 参数传递编码方便浏览器直接测试。实际项目中也可以改成 POST JSON 格式更利于扩展。#include WiFi.h #include WebServer.h #include IRremote.h const char* ssid your_wifi; const char* password your_password; const int IR_TX_PIN 4; IRsend irsend(IR_TX_PIN); WebServer server(80); void handleRoot() { server.send(200, text/plain, ESP32-S3 IR Remote. Use /send?code0x00FF45BA); } void handleSend() { if (server.hasArg(code)) { uint32_t code strtoul(server.arg(code).c_str(), NULL, 16); irsend.sendNEC(code, 32); server.send(200, text/plain, OK); } else { server.send(400, text/plain, missing code param); } } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(WiFi.localIP()); server.on(/, handleRoot); server.on(/send, handleSend); server.begin(); } void loop() { server.handleClient(); }浏览器访问地址示例http://192.168.1.100/send?code0x00FF45BA8.3 用 curl 验证接口如果手边没有浏览器也可以用 curl 直接验证接口是否可用curl http://192.168.1.100/send?code0x00FF45BA返回OK表示红外信号已经由 GPIO 发出。此时观察目标设备是否有动作。如果设备无响应优先检查 WiFi 连接的设备是否和开发板在同一局域网以及红外发射管是否对准设备。8.4 扩展成批量遥控服务把这个接口作为基础可以继续扩展在固件里维护一个编码映射表用key代替code例如/send?keytv_power固件内部自动查找编码并发送。这样 Web 端不需要暴露原始编码使用也更方便。定时任务、组合遥控、场景联动都可以在这个接口之上实现只需要把调度逻辑放在固件或后端脚本中。9. 功能测试与效果验证9.1 测试清单测试项目输入/操作预期结果判断标准串口打印编码用真实遥控器对准接收头按一个按键串口输出R:0x...接收头和解码逻辑正常串口回发编码串口输入S:0x00FF45BA目标设备执行对应动作发射电路和协议正确录制多按键编码分别按电源、音量、模式键串口输出不同的编码编码可区分、可重复继电器翻转测试发送指定编码继电器状态切换继电器模块和逻辑正常HTTP 接口测试浏览器访问/send?code...页面返回OK设备有响应WiFi 和 WebServer 正常距离测试从不同距离发送红外信号2 米内稳定控制发射电路驱动能力合格9.2 测试流程建议第一次测试先不要直接控制真实家电而是做“回环测试”把红外发射管对准自己的红外接收头然后通过串口发送编码。如果串口能打印出刚才发送的编码且能和原编码匹配说明发射和接收链路都已经通。之后再把发射管对准真实设备调整距离和角度验证实际遥控效果。接收端的稳定性可以用“连续按同一个按键”来验证。真实遥控器在按住按键时通常会重复发送数据帧如果你能看到串口稳定打印出同一编码说明接收头和解码逻辑没问题。如果偶尔丢码可以检查供电电压是否稳定以及接收头附近是否有强光干扰。9.3 失败定位思路发射没反应先检查 GPIO 是否选对、发射管方向是否接反、电路供电是否正常。接收没输出用示波器或万用表测接收头 OUT 引脚是否有电平变化如果没有说明接收头没解调出信号。编码能收到但回放失败可能是 NEC 协议参数差异例如地址反码、命令反码顺序不对检查原始遥控器的编码协议类型。10. 资源占用与性能观察10.1 RAM 和 CPU 占用观察红外收发本身对 ESP32-S3 来说压力极小单次 NEC 发送只占用几个毫秒的 CPU 时间。真正影响资源占用的是 WiFi 和 WebServer。开启 WiFi 后系统需要维护 TCP/IP 协议栈RAM 占用会明显增加。如果你用 IRremote 库同时开启发射和接收功能时会占用少量定时器资源基本不影响其他任务。观察资源占用最简单的方式是使用 ESP32 的ESP.getFreeHeap()接口在 Serial 中打印剩余堆内存。WebServer 开启后空闲状态下可用堆内存一般在几十 KB 到几百 KB 之间具体取决于开发板 Flash 配置和固件版本。如果内存过低可以关闭不用的 WiFi 服务或者减少同时创建的 WebServer 实例。10.2 运行稳定性红外遥控设备最常见的稳定性问题是长时间运行后 WiFi 断开、定时器漂移或接收头偶发误码。针对 WiFi 断开可以在 loop 中检测 WiFi 状态断线后自动重连。针对误码可以在解码后增加连续确认机制例如两次收到相同编码再执行动作。这样能有效防止因红外干扰导致的误触发。10.3 如何降低功耗如果这个遥控器准备用电池供电可以向低功耗方向优化。ESP32-S3 支持 Modem Sleep 和 Light Sleep在没有红外任务时让 CPU 进入睡眠状态只用定时器或 GPIO 中断唤醒。红外接收头本身也会消耗一定电流可以在需要监听时才给接收头供电。功率优化不是必须但如果是便携场景这是值得关注的扩展方向。11. 常见问题与排查方法问题现象可能原因排查方式解决方案烧录时报 failed to set target esp32s3USB 驱动未安装、端口选错、未进入下载模式检查设备管理器、重新选 COM 口安装 CP210x/CH340 驱动按住 BOOT 再上电串口监视器输出乱码波特率不一致查看代码中的 Serial.begin 参数统一使用 115200 波特率红外发射距离很近发射管驱动电流不足测量电路压降和电流加三极管放大电路使用 5V 供电接收头收不到信号接收头供电电压不对、引脚接错用万用表测 VCC 和 OUT按模块丝印重新接线检查电平标准编码能收到但设备不动作协议类型不匹配、编码不完整录制原遥控器完整编码对比确认是 NEC 还是其他协议调整发送方式Web 页面打不开WiFi 未连接成功、IP 地址变化看串口打印的 IP重新配置 WiFi或固定静态 IPHTTP 接口返回 400请求参数缺失检查 URL 参数名使用/send?code0x00FF45BA格式继电器频繁误动作红外误码、编码判断过于简单串口打印所有接收值增加连续两帧确认逻辑这里再单独说一次最常见的烧录报错。failed to set target esp32s3: non zero exit code 2这个提示通常出现在 ESP-IDF 或 PlatformIO 环境它并不是编译代码出错而是 OpenOCD 或 esptool 无法和芯片建立连接。最简单的解决顺序是先确认驱动再确认串口然后按住 BOOT 插入 USB最后重新执行烧录。如果你反复在同一台电脑上遇到这个问题还可以检查电脑是否同时安装了多个版本的 ESP-IDF 工具链环境变量混乱会导致目标芯片识别失败。12. 最佳实践与合规使用建议12.1 工程化建议第一次测试先使用小功率、近距离场景不要在没确认接线的情况下控制强电设备。把红外编码保存到一个独立的头文件或配置区域方便后续修改和维护。保留一套最小可运行代码例如只包含接收和串口打印这样排查问题时不至于和复杂逻辑混在一起。批量发送任务要加日志每次发送的编码、时间、结果都记录到串口便于定位失败环节。如果使用 HTTP 接口建议在内网使用不要直接把开发板暴露到公网。如果确实需要远程访问应该加鉴权和访问控制。12.2 合规与安全边界红外遥控技术本身是合法且常见的但使用时要遵守基本边界。第一只能控制自己拥有或获得授权的设备不要用自制遥控器干扰他人的电视、空调、门禁等设备。第二不要传播或破解可能涉及安全控制的遥控码例如门禁、车库门等否则可能带来安全隐患。第三云存储代码时注意隐私不要随意把家中设备控制码发布到公开仓库。第四如果扩展到了 220V 强电设备控制必须使用合格、隔离的继电器模块严格按电气规范接线没有强电经验就不要自行操作。12.3 可以继续扩展的方向把遥控码存入 SD 卡通过 ESP32-S3 的 SDIO 或 SPI 接口读取适合码数量很大的场景。接入 Home Assistant 或家庭自动化平台把红外遥控器变成智能家居的一部分。增加 OLED 屏幕实时显示当前遥控模式和按键编码方便现场调试。增加多个红外发射管覆盖多个房间的设备。这个场景下要设计好 GPIO 选择和驱动电路避免单引脚过流。使用 ESP-NOW 或 BLE 做无线中继把红外信号从一个房间转发到另一个房间。13. 总结与下一步ESP32-S3 做红外遥控器是一个很适合练手的嵌入式项目。它不要求很高的硬件门槛但能让你完整接触红外协议、PWM 调制、GPIO 驱动、WiFi 和 HTTP 服务这几个嵌入式开发中的常见知识点。如果你第一次接触建议先把“接收解码”跑通再实现“回放发送”最后再接入 WiFi 和 Web 控制。这样每一步出现问题时都能快速定位。这个项目最值得尝试的点是“低成本、快见效”几块钱的元件加上一块 ESP32-S3就能把家里杂乱的遥控器整合成一个可控服务。最先需要验证的是你手头遥控器到底是什么协议、每个按键编码是什么。最容易踩的坑则是烧录时的串口识别问题以及红外发射管驱动电流不足导致发射距离太近。只要把这两点解决这个项目基本就成功了八成。后续如果还想继续深入可以考虑把遥控码批量管理、设备联动和远程控制一起做起来变成一个真正的家庭红外遥控中枢。建议先收藏这份教程等开发板到手后按步骤验证一遍再根据自己的实际场景优化调整。