用STM32F103RCT6+OLED屏,我DIY了一个能控制空调风扇的万能遥控器(附完整代码)
从零打造智能红外遥控器STM32F103RCT6与OLED的完美结合每次坐在客厅里看着茶几上堆满的各种遥控器——电视、空调、机顶盒、风扇...不仅占地方关键时刻还总找不到需要的那个。作为一名电子爱好者我决定用手头的STM32开发板和OLED屏打造一个万能红外遥控器来解决这个烦恼。本文将完整记录从硬件选型到代码调试的全过程特别分享处理非标准红外协议的实战经验。1. 项目规划与硬件选型1.1 核心功能设计这个DIY项目的核心目标很明确用一个设备替代所有红外遥控器。经过需求分析我确定了以下关键功能红外学习功能能够录制并存储标准NEC协议如电视、机顶盒和非标准协议如空调、风扇的红外信号信号发射功能准确复现学习到的红外指令可视化界面通过OLED屏显示操作菜单和信号分析数据分区管理支持多个设备控制避免按键冲突1.2 硬件组件清单经过对比测试最终确定的硬件配置如下组件型号备注主控芯片STM32F103RCT6256KB Flash满足数据存储需求显示模块0.96寸OLEDI2C接口128x64分辨率红外接收VS1838B通用红外接收头红外发射940nm红外LED搭配130Ω限流电阻按键薄膜按键5向导航键功能键关键选型考虑STM32F103RCT6性价比高社区资源丰富I2C接口OLED节省IO口且显示效果清晰VS1838B接收灵敏度高支持38kHz载波2. 硬件连接与电路设计2.1 接线方案实际连接时需特别注意电平匹配和信号干扰问题// OLED连接 OLED_VCC - 3.3V OLED_GND - GND OLED_SCL - PB6 OLED_SDA - PB7 // 红外接收 VS1838B_VCC - 3.3V VS1838B_GND - GND VS1838B_OUT - PB9 // 红外发射 IR_LED阳极 - PA0 IR_LED阴极 - PC2通过三极管控制2.2 关键电路设计要点红外发射部分需要特别注意驱动能力载波生成使用TIM2 PWM产生38kHz方波驱动电路采用S8050三极管放大信号限流保护红外LED串联130Ω电阻注意直接使用IO口驱动红外LED可能导致电流不足影响控制距离3. 软件架构与核心逻辑3.1 整体代码结构项目采用模块化设计主要分为以下几个部分├── USER │ └── main.c // 主控制逻辑 ├── HARDWARE │ ├── oled.c // OLED驱动 │ ├── remote.c // 红外接收处理 │ ├── irsend.c // 红外发射控制 │ └── remote_save.c // 数据存储管理 └── SYSTEM └── delay.c // 精确延时函数3.2 红外信号处理流程红外信号的处理是项目的核心难点特别是非标准协议接收阶段捕获高低电平时间序列自动识别引导码和重复码区分标准NEC和非标准协议存储阶段采用统一数据结构保存不同协议使用Flash存储掉电不丢失实现分区管理支持多设备发射阶段精确复现时间序列自动匹配载波频率支持信号强度调节4. 关键代码实现与调试4.1 红外学习功能实现处理非标准协议如空调时需要记录原始波形void AnalogLearn(void) { Re_Record_ON(); // 开启录制模式 // 等待用户按下原遥控器 while(!check_remote_input()); // 记录波形数据 uint16_t wave_data[350]; uint16_t length capture_infrared_wave(wave_data); // 保存到Flash SaveData(addr key, 1, wave_data, length); Re_Record_OFF(); // 关闭录制 }常见问题排查信号截断增大存储数组长度时序偏差校准系统时钟干扰问题增加软件滤波4.2 OLED界面设计采用分层菜单结构提升用户体验// 主菜单显示 void show_main_menu() { OLED_Clear(); OLED_ShowStr(0, 0, 1. 设备选择); OLED_ShowStr(0, 1, 2. 学习模式); OLED_ShowStr(0, 2, 3. 发射测试); OLED_ShowStr(0, 3, 4. 信号分析); }优化技巧使用图标提升直观性添加操作引导提示实现快速返回功能4.3 非标准协议处理实战格力空调的红外协议是典型的非标准案例特征分析引导码较长约4.5ms采用脉冲距离编码数据帧包含校验信息解决方案扩展捕获时间窗口实现自定义解码算法添加协议自动识别// 格力空调协议解码示例 void decode_gree_ac(uint16_t* wave) { // 解析引导码 if(wave[0] 4000 || wave[0] 5000) return ERROR; // 解析数据位 for(int i1; i68; i2) { if(wave[i] 1000) data | (1bit_pos); bit_pos; } // 校验数据 if(!check_checksum(data)) return ERROR; }5. 项目优化与功能扩展5.1 性能优化技巧经过实际测试总结了以下优化经验Flash存储优化采用差分压缩算法减少空间占用实现磨损均衡延长寿命添加数据校验保证可靠性发射效率提升预加载常用指令到RAM优化载波生成时序支持快速连续发射5.2 实用功能扩展基础功能实现后可以考虑以下增强功能智能场景离家模式一键关闭所有设备观影模式自动调节灯光和空调无线控制添加蓝牙模块支持手机APP实现语音控制接口能耗统计记录设备使用情况提供节能建议6. 常见问题解决方案在项目开发过程中遇到了不少坑以下是典型问题及解决方法问题1空调控制距离短原因发射功率不足解决优化驱动电路增加红外LED数量问题2信号偶尔误触发原因环境光干扰解决添加软件滤波算法调整接收头角度问题3Flash写入失败原因未擦除直接写入解决规范擦除-写入流程添加重试机制提示调试红外项目时使用手机摄像头可以直观查看红外LED是否工作7. 项目成果与使用体验经过两周的开发和调试最终成品实现了所有设计功能。实际测试中可以控制标准NEC设备电视、机顶盒等非标准设备格力空调、美的风扇等特殊协议设备部分投影仪使用体验方面OLED菜单操作流畅最远控制距离可达8米。分区管理功能很好地解决了按键复用问题目前已经存储了家中12种设备的控制码。这个项目最大的收获是深入理解了红外通信的底层原理特别是对非标准协议的处理经验。最初以为简单的红外发射接收在实际开发中遇到了各种意料之外的问题通过示波器分析波形、查阅设备手册最终都找到了解决方案。