用ESP32的RMT模块DIY一个万能红外遥控器(支持NEC协议,附完整Arduino代码)
2026/6/14 11:37:03 网站建设 项目流程

用ESP32的RMT模块打造智能红外遥控中心(支持NEC协议与Web控制)

你是否遇到过这样的场景:家里老旧的空调遥控器按键失灵,电视遥控器被宠物咬坏,或者想用手机统一控制所有红外设备?ESP32开发板配合其独特的RMT外设模块,可以轻松实现这些需求。本文将带你从零构建一个支持NEC协议、具备Web控制界面的智能红外遥控系统,不仅能替代传统遥控器,还能实现远程控制和自动化场景联动。

1. 硬件搭建与电路设计

1.1 核心元件选型建议

  • ESP32开发板:推荐使用ESP32-WROOM-32D模组,其GPIO21引脚与RMT通道完美兼容
  • 红外发射管:TSAL6200(波长940nm)是最佳选择,其发射角度广、功率适中
  • 驱动三极管:2N3904或S8050均可胜任,β值建议大于100
  • 限流电阻:根据红外管参数计算,通常使用100Ω 1/4W电阻

1.2 电路连接示意图

ESP32 GPIO21 → 1kΩ电阻 → 2N3904基极 2N3904发射极 → GND 2N3904集电极 → TSAL6200负极 TSAL6200正极 → 5V电源(需串联100Ω限流电阻)

注意:红外发射管有极性之分,长脚为正极。实际接线时建议使用面包板或PCB,避免焊接错误。

1.3 电源方案对比

电源类型优点缺点适用场景
USB供电接线简单功率有限临时测试
18650电池便携需充电管理移动场景
5V适配器稳定需固定位置长期部署

2. Arduino开发环境配置

2.1 必备库安装

在Arduino IDE中依次安装以下库:

  1. ESP32RMT:通过库管理器搜索安装
  2. WiFiManager:用于智能配网
  3. WebServer:内置于ESP32开发板支持包

2.2 基础代码框架

#include <ESP32RMT.h> #include <WiFiManager.h> #define IR_LED_PIN 21 ESP32RMT irSender(IR_LED_PIN); void setup() { Serial.begin(115200); WiFiManager wifiManager; wifiManager.autoConnect("IRRemoteAP"); } void loop() { // 红外控制代码将在这里实现 }

3. NEC协议深度解析与实现

3.1 NEC协议时序详解

  • 引导码:9ms高电平 + 4.5ms低电平
  • 数据格式:32位(地址16位 + 命令16位)
  • 重复码:110ms周期(长按时发送)

3.2 RMT配置关键参数

rmt_config_t config = { .rmt_mode = RMT_MODE_TX, .channel = RMT_CHANNEL_0, .gpio_num = IR_LED_PIN, .clk_div = 80, // 1MHz时钟 .mem_block_num = 1, .tx_config = { .carrier_freq_hz = 38000, .carrier_duty_percent = 33, .carrier_level = RMT_CARRIER_LEVEL_HIGH, .idle_level = RMT_IDLE_LEVEL_LOW, .carrier_en = true } };

3.3 完整NEC发送函数

void sendNEC(uint16_t address, uint8_t command) { uint32_t code = (address << 16) | (~address << 8) | command; rmt_item32_t items[68]; // 构建引导码 items[0].duration0 = 9000 / RMT_TICK_10_US; items[0].level0 = 1; items[0].duration1 = 4500 / RMT_TICK_10_US; items[0].level1 = 0; // 构建数据位 for (int i = 0; i < 32; i++) { int itemIdx = 1 + i*2; bool bitVal = code & (1 << i); items[itemIdx].duration0 = 560 / RMT_TICK_10_US; items[itemIdx].level0 = 1; items[itemIdx].duration1 = bitVal ? 1690 : 560; items[itemIdx].level1 = 0; } // 结束位 items[65].duration0 = 560 / RMT_TICK_10_US; items[65].level0 = 1; items[65].duration1 = 0; items[65].level1 = 0; rmt_write_items(RMT_CHANNEL_0, items, 66, true); }

4. 遥控信号学习与Web控制

4.1 红外信号捕获方案

  1. 使用VS1838B红外接收模块
  2. 通过RMT接收模式记录原始波形
  3. 自动解析NEC协议参数

4.2 Web服务器实现代码

#include <WebServer.h> WebServer server(80); void handleRoot() { String html = "<html><body>"; html += "<h1>红外遥控中心</h1>"; html += "<button onclick=\"fetch('/send?code=0xFF00FF')\">开灯</button>"; html += "</body></html>"; server.send(200, "text/html", html); } void handleSend() { String code = server.arg("code"); uint32_t hexCode = strtoul(code.c_str(), NULL, 16); sendNEC(hexCode >> 16, hexCode & 0xFF); server.send(200, "text/plain", "指令已发送"); } void setup() { // ...其他初始化代码 server.on("/", handleRoot); server.on("/send", handleSend); server.begin(); } void loop() { server.handleClient(); }

4.3 进阶功能扩展

  • MQTT接入:通过Topic接收控制指令
  • 定时任务:设置设备自动开关时间
  • 场景联动:多个设备组合控制
  • 语音控制:集成Alexa/Google Assistant

5. 常见问题与调试技巧

5.1 信号发射距离短

  • 检查红外管正向电流是否达到20mA
  • 尝试调整载波占空比至50%
  • 确保发射管未被物理遮挡

5.2 设备响应不稳定

  • 添加100μF电容稳定电源
  • 缩短红外管与目标设备的距离
  • 检查是否有其他红外干扰源

5.3 Web界面无法连接

  • 确认WiFi信号强度大于-70dBm
  • 检查路由器是否开启AP隔离
  • 尝试重置WiFiManager配置

在实际部署中发现,某些品牌的空调使用扩展NEC协议,需要调整脉冲间隔。遇到不兼容的情况时,建议先用逻辑分析仪捕获原始信号,再微调RMT参数。一个实用的技巧是用手机摄像头观察红外管是否正常闪烁,这能快速验证硬件是否工作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询