用STM32F103RCT6和0.96寸OLED,手把手教你做一个能控制空调风扇的万能遥控器
2026/6/4 5:10:54 网站建设 项目流程

用STM32F103RCT6和0.96寸OLED打造空调风扇万能遥控器实战指南

在智能家居设备日益普及的今天,红外遥控器仍然是控制空调、风扇等家电的主流方式。但面对家中堆积如山的各种遥控器,你是否也渴望一个能整合所有功能的万能解决方案?本文将带你从零开始,使用STM32F103RCT6单片机和0.96寸OLED屏幕,打造一个真正实用的万能红外遥控器。

1. 项目规划与核心功能设计

1.1 为什么选择STM32F103RCT6

STM32F103RCT6作为一款性价比极高的ARM Cortex-M3内核微控制器,具备以下优势:

  • 72MHz主频,处理红外信号游刃有余
  • 256KB Flash,足够存储大量红外编码数据
  • 丰富的外设接口,轻松连接各类传感器和显示模块
  • 广泛的社区支持,遇到问题容易找到解决方案

对于红外遥控项目,我们特别看重其:

  • 精准的定时器功能(用于捕获红外信号时序)
  • 足够的GPIO接口(连接OLED、红外收发模块)
  • 充足的存储空间(保存多种设备的红外编码)

1.2 系统功能架构

我们的万能遥控器将实现以下核心功能:

功能模块实现方式技术难点
红外学习通过接收头捕获原始红外信号非标准信号的处理
编码存储利用STM32内部Flash保存数据存储空间管理优化
信号发射38kHz载波调制发射时序精确控制
用户界面0.96寸OLED显示有限屏幕空间的信息展示

> 提示:空调遥控信号通常是长码格式,与普通NEC编码不同,需要特殊处理。

2. 硬件搭建与连接

2.1 所需材料清单

  • STM32F103RCT6最小系统板 ×1
  • 0.96寸OLED显示屏(I2C接口) ×1
  • 红外接收模块(如VS1838B) ×1
  • 红外发射二极管 ×1
  • 1KΩ电阻 ×1
  • 面包板及连接线若干

2.2 硬件连接示意图

STM32F103RCT6 外围设备 ---------- -------- PB6(SCL) ------> OLED SCL PB7(SDA) ------> OLED SDA PB9 ------> 红外接收DAT PA0 ------> 红外发射DAT PC2 ------> 红外发射控制 3.3V ------> 所有设备VCC GND ------> 所有设备GND

关键连接说明

  1. OLED采用I2C接口,节省GPIO资源
  2. 红外接收使用PB9,可利用定时器输入捕获功能
  3. 红外发射增加PC2作为使能控制,避免误触发

2.3 硬件调试技巧

在焊接和连接时需注意:

  • 红外发射二极管有正负极之分,长脚为正极
  • OLED屏幕的I2C地址通常为0x78或0x7A
  • 为红外发射管串联限流电阻(通常1KΩ)
// 简单的硬件测试代码 #include "stm32f10x.h" #include "delay.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } int main(void) { Delay_Init(); LED_Init(); while(1) { GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))); Delay_Ms(500); } }

3. 红外信号处理核心技术

3.1 红外通信基本原理

红外遥控使用脉冲宽度编码,常见协议包括:

  • NEC协议:载波频率38kHz,脉冲间隔编码
  • RC5协议:双相编码,无需载波
  • 空调专用协议:通常为长码,包含更多信息

典型NEC协议帧结构:

引导码(9ms高+4.5ms低) + 地址码(8位) + 反码(8位) + 命令码(8位) + 反码(8位)

3.2 信号捕获与解码

使用STM32定时器输入捕获功能捕获红外信号:

// 定时器配置示例 void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { static uint32_t lastCapture = 0; uint32_t currentCapture = TIM_GetCapture1(TIM3); uint32_t pulseWidth = currentCapture - lastCapture; // 根据脉冲宽度判断逻辑值 if(pulseWidth > 2000 && pulseWidth < 3000) { // 识别为逻辑0 } else if(pulseWidth > 4000 && pulseWidth < 5000) { // 识别为逻辑1 } lastCapture = currentCapture; TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); } }

3.3 空调长码的特殊处理

空调遥控信号通常具有以下特点:

  • 帧长度更长(可达100+位)
  • 包含温度、模式、风速等丰富信息
  • 各品牌编码格式差异大

处理策略:

  1. 原始波形捕获存储
  2. 按品牌选择解码算法
  3. 建立编码数据库供查询

4. 软件架构与关键代码实现

4.1 主程序流程设计

graph TD A[系统初始化] --> B[显示主菜单] B --> C{按键选择} C -->|学习模式| D[红外信号捕获] C -->|发射模式| E[查询并发送编码] C -->|管理功能| F[编码删除/查看] D --> G[编码存储] E --> B F --> B

4.2 红外编码存储方案

采用STM32内部Flash存储红外编码,设计如下数据结构:

#define MAX_SLOTS 100 // 最大存储槽位 #define MAX_PULSES 500 // 单个编码最大脉冲数 typedef struct { uint16_t pulseCount; // 脉冲数量 uint16_t pulses[MAX_PULSES]; // 脉冲宽度数组 uint8_t deviceType; // 设备类型标识 uint8_t reserved; // 保留字段 } IrCode; // Flash存储布局 // 扇区5: 0x08020000-0x0803FFFF (128KB) #define FLASH_IR_START 0x08020000

4.3 OLED界面实现

针对0.96寸OLED(128x64)的特点,设计简洁的交互界面:

void ShowMainMenu(void) { OLED_Clear(); OLED_ShowString(0, 0, "1.Learn IR Code"); OLED_ShowString(0, 1, "2.Send IR Code"); OLED_ShowString(0, 2, "3.Manage Codes"); OLED_ShowString(0, 3, "4.System Setup"); } void ShowLearningScreen(void) { OLED_Clear(); OLED_ShowString(0, 0, "Learning Mode"); OLED_ShowString(0, 1, "Point remote at"); OLED_ShowString(0, 2, "receiver & press"); OLED_ShowString(0, 3, "any button..."); }

5. 进阶功能与优化技巧

5.1 支持更多设备类型

通过分析常见家电的红外编码规律,可以扩展支持:

  • 电视机和机顶盒(NEC/RC5)
  • DVD/音响设备(SIRC等)
  • 智能灯具(自定义协议)

设备识别流程

  1. 捕获原始信号
  2. 分析引导码特征
  3. 匹配已知协议
  4. 存储解码参数

5.2 省电优化策略

为延长便携使用时的电池寿命:

  • 动态调整系统时钟频率
  • OLED屏幕自动关闭
  • 红外接收间歇工作模式
void EnterLowPowerMode(void) { // 降低系统时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // 关闭外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, DISABLE); // 配置唤醒源 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 进入停止模式 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }

5.3 实际使用中的问题排查

常见问题及解决方法:

问题现象可能原因解决方案
无法学习信号接收头故障/供电不足检查连接/更换接收头
发射距离短发射管电流不足减小限流电阻值
编码混乱环境���干扰避免强光直射接收头
存储丢失Flash写操作不当增加写前擦除校验

6. 项目扩展与进阶方向

完成基础功能后,可以考虑以下扩展:

  • 蓝牙/WiFi连接:通过手机APP控制
  • 情景模式:一键执行多个设备操作
  • 学习曲线分析:自动识别未知协议
  • 云端同步:备份和分享编码库

> 注意:扩展功能需要考虑STM32F103的资源限制,复杂功能可能需要升级硬件平台。

通过这个项目,你不仅能获得一个实用的万能遥控器,更能深入理解红外通信原理和嵌入式系统开发流程。在实际调试中发现,空调长码的学习需要特别注意信号稳定性,建议在相对安静的环境(无强光、其他红外干扰)下进行操作。

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

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

立即咨询