💡 划重点

  • 本项目以ESP32为主控,采用红外学习+红外发射+矩阵按键+液晶显示的组合方式,打造一个能替代客厅所有红外遥控器的“万能”遥控器。方案成本控制在45元以内,所有物料均为通用模块,接线简洁、逻辑清晰,适合硬件编程入门及家庭实用改造。

需求洞察

目标用户:客厅中拥有电视、机顶盒、空调、风扇、音响等多种红外家电的家庭成员,尤其是中老年人或家中遥控器经常混杂丢失的用户。

真实痛点

为什么值得做

一个低成本的统一遥控器,可以将客厅内所有红外家电的控制权集中到一台设备上。通过红外学习功能,它不需要理解任何私有协议,只需“记住”每个按键对应的红外编码,然后用一个按键矩阵+液晶提示来统一分发命令。ESP32强大的处理能力和WiFi能力,未来还能轻易扩展为手机App控制、语音控制甚至联网语音播报,极大提升日常使用体验。投入不到一个普通遥控器的价钱,就能获得一个可编程、可重复使用、永不落伍的智能遥控中心。

方案设计

整体方案分为四个层级:

  1. 感知层

- 红外接收头:用于学习模式,接收原有遥控器发射的红外信号,并解调出编码。

- 4×4矩阵键盘:作为本地操作界面,16个物理按键对应学习、发射、设备切换等功能。

  1. 控制层

- ESP32开发板:运行红外解码库(IRremote)完成信号学习;扫描按键矩阵实现菜单逻辑;驱动I2C液晶屏显示当前设备、按键名称;控制红外发射管按存储编码发送指令。

  1. 执行层

- 红外发射管(含NPN三极管驱动电路):将存储的红外编码以38kHz载波发射出去,控制目标家电。

- I2C LCD1602液晶屏:实时显示当前控制的设备名称、学习状态、按键提示,降低误操作。

  1. 日志/联网层(可选扩展)

- 利用ESP32内置WiFi,可将每次按键操作的时间戳及设备ID通过UDP或MQTT上报至局域网内的NAS或Home Assistant等智能家居中心,用于统计使用习惯或场景联动。本地端无需联网即可独立工作。

物料清单

物料 数量 用途 估算单价(元) 小计(元)
ESP32-WROOM-32开发板 1 主控 15.00 15.00
VS1838B红外接收头 1 红外学习接收 1.00 1.00
5mm红外发射二极管 1 发射控制信号 0.50 0.50
NPN三极管9013 1 驱动红外发射管 0.20 0.20
1kΩ电阻 2 基极限流、上拉 0.05 0.10
I2C LCD1602液晶屏 1 状态显示 8.00 8.00
4×4矩阵薄膜键盘 1 按键输入 3.00 3.00
洞洞板5×7cm 1 焊接固定 2.00 2.00
杜邦线、排针、焊锡 若干 连接 2.00 2.00
合计 31.80

总成本31.80元,远低于45元预算,剩余预算可用于定制亚克力外壳或增加备用发射管。

接线与结构

ESP32与各模块的电气连接如下(以给定GPIO为基础,微调并说明):

模块 引脚功能 ESP32 GPIO 备注
红外接收头VS1838B OUT 15 使用给定IO,内部上拉
红外发射管驱动 基极经1kΩ电阻 4 通过三极管放大驱动
I2C LCD1602 SDA 21 默认I2C引脚
SCL 22
矩阵键盘行1~行4 R1~R4 16,17,18,19 设为输出,依次拉低
矩阵键盘列1~列4 C1~C4 25,26,27,14 设为输入,带上拉
发射管NPN集电极 接红外LED阴极 阳极接3.3V,阴极经三极管到地

微调理由

将矩阵键盘的行线集中在GPIO16-19,列线用25-27及14,既避免了与I2C及IR引脚的冲突,又保留了GPIO32/33/12等作为未来蓝牙或SPI扩展的预留引脚。同时14为ADC2通道,未使用ADC功能,可正常作为数字IO。采用4×4薄膜键盘,只需8个IO口,扫描可靠且无需外部上拉电阻(启用内部上拉即可)。

核心代码

以下给出基于Arduino IDE的骨架代码,使用IRremote库和LiquidCrystal_I2C库,可以直接编译并在学习/发射模式下工作。


#include <IRremote.hpp>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

// 红外引脚
#define IR_RECEIVE_PIN 15
#define IR_SEND_PIN 4

// LCD

// 矩阵键盘定义
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {16, 17, 18, 19};
byte colPins[COLS] = {25, 26, 27, 14};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// 存储学习的红外编码(简化,仅存长度与raw数据)
uint16_t rawData[199];
uint16_t rawLen = 0;
bool learned = false;

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("IR Remote Ready");
  
  IrSender.begin(IR_SEND_PIN);
}

void loop() {
  char key = keypad.getKey();
  
  if (key) {
    lcd.clear();
    lcd.setCursor(0,0);
    if (key == 'A') { // 学习模式按键
      lcd.print("Learning...");
      if (IrReceiver.decode()) {
        rawLen = IrReceiver.decodedIRData.rawDataPtr->rawlen;
        for (unsigned int i = 1; i < rawLen; i++) {
          rawData[i-1] = IrReceiver.decodedIRData.rawDataPtr->rawbuf[i];
        }
        rawLen--;
        learned = true;
        lcd.clear();
        lcd.print("Learned OK");
        IrReceiver.resume();
      }
    } else if (key == 'B' && learned) { // 发射按键
      lcd.print("Sending...");
      lcd.clear();
      lcd.print("Sent");
    } else {
      lcd.print("Key: ");
      lcd.print(key);
    }
    delay(500);
  }
}
说明:此骨架演示了核心的“学习一个遥控信号并复现”功能。实际产品中需扩展为多设备存储、按键映射及场景管理,但基本框架完全基于此。

调试步骤

  1. 单独验证红外接收:先不接发射管,烧录代码后将任意红外遥控器对准VS1838,按下按键,观察串口输出是否有解码数据。若无,检查GPIO15是否接触良好、接收头VCC/GND是否正确。
  2. 验证红外发射:学习成功后,用手机摄像头对准发射管,按下按键'B',摄像头中应看到紫色闪烁,表明38kHz载波已发出。
  3. 检查LCD显示:上电后应显示“IR Remote Ready”,按键按下时正确刷新字符。若显示异常,检查I2C地址是否为0x27(可用I2C Scanner修改)。
  4. 按键矩阵测试:不接其他模块,单独测试keypad示例,确保每个按键返回与预期字符一致。如不对应,检查行列序号与引脚对应关系。
  5. 联调:全部连接后,学习某个遥控器的音量+键,再将发射管对准电视或空调,按下发射键,观察设备是否响应。若不成功,可开启串口调试打印rawLen,确认学习到的数组长度合理。
  6. 微调载波频率:部分空调需要特定载波频率(如40kHz或33kHz),可修改sendRaw的最后一个参数进行适配。

设计图

红外家电统一遥控器结构flow
1
感知输入
2
控制处理
3
执行反馈
4
数据上报