💡 划重点
- 本项目以ESP32为主控,采用红外学习+红外发射+矩阵按键+液晶显示的组合方式,打造一个能替代客厅所有红外遥控器的“万能”遥控器。方案成本控制在45元以内,所有物料均为通用模块,接线简洁、逻辑清晰,适合硬件编程入门及家庭实用改造。
需求洞察
目标用户:客厅中拥有电视、机顶盒、空调、风扇、音响等多种红外家电的家庭成员,尤其是中老年人或家中遥控器经常混杂丢失的用户。
真实痛点:
- 遥控器数量过多:经常翻找、拿错,茶几上永远堆满不同形状的遥控器。
- 电池与维护:每个遥控器都要独立管理电池,某个没电就陷入“想用用不了”的尴尬。
- 学习成本高:不同品牌遥控器按键布局完全不同,老人、小孩操作困难。
- 物理损坏风险:摔落、进灰、按键老化等问题层出不穷,单个遥控器更换成本不低。
为什么值得做:
一个低成本的统一遥控器,可以将客厅内所有红外家电的控制权集中到一台设备上。通过红外学习功能,它不需要理解任何私有协议,只需“记住”每个按键对应的红外编码,然后用一个按键矩阵+液晶提示来统一分发命令。ESP32强大的处理能力和WiFi能力,未来还能轻易扩展为手机App控制、语音控制甚至联网语音播报,极大提升日常使用体验。投入不到一个普通遥控器的价钱,就能获得一个可编程、可重复使用、永不落伍的智能遥控中心。
方案设计
整体方案分为四个层级:
- 感知层
- 红外接收头:用于学习模式,接收原有遥控器发射的红外信号,并解调出编码。
- 4×4矩阵键盘:作为本地操作界面,16个物理按键对应学习、发射、设备切换等功能。
- 控制层
- ESP32开发板:运行红外解码库(IRremote)完成信号学习;扫描按键矩阵实现菜单逻辑;驱动I2C液晶屏显示当前设备、按键名称;控制红外发射管按存储编码发送指令。
- 执行层
- 红外发射管(含NPN三极管驱动电路):将存储的红外编码以38kHz载波发射出去,控制目标家电。
- I2C LCD1602液晶屏:实时显示当前控制的设备名称、学习状态、按键提示,降低误操作。
- 日志/联网层(可选扩展)
- 利用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);
}
}
说明:此骨架演示了核心的“学习一个遥控信号并复现”功能。实际产品中需扩展为多设备存储、按键映射及场景管理,但基本框架完全基于此。
调试步骤
- 单独验证红外接收:先不接发射管,烧录代码后将任意红外遥控器对准VS1838,按下按键,观察串口输出是否有解码数据。若无,检查GPIO15是否接触良好、接收头VCC/GND是否正确。
- 验证红外发射:学习成功后,用手机摄像头对准发射管,按下按键'B',摄像头中应看到紫色闪烁,表明38kHz载波已发出。
- 检查LCD显示:上电后应显示“IR Remote Ready”,按键按下时正确刷新字符。若显示异常,检查I2C地址是否为0x27(可用I2C Scanner修改)。
- 按键矩阵测试:不接其他模块,单独测试keypad示例,确保每个按键返回与预期字符一致。如不对应,检查行列序号与引脚对应关系。
- 联调:全部连接后,学习某个遥控器的音量+键,再将发射管对准电视或空调,按下发射键,观察设备是否响应。若不成功,可开启串口调试打印rawLen,确认学习到的数组长度合理。
- 微调载波频率:部分空调需要特定载波频率(如40kHz或33kHz),可修改sendRaw的最后一个参数进行适配。