摘要: 本文将带你使用STM32打造一款功能强大的万能红外遥控器,它可以学习和复制多种红外信号,并通过OLED屏幕和按键实现便捷操作。我们将深入探讨红外通信原理、STM32编程、OLED显示和EEPROM数据存储等关键技术,并提供完整的代码示例和电路图,帮助你轻松构建属于自己的智能家居控制中心。
一、项目背景
红外遥控技术凭借其成本低廉、功耗低、易于实现等优点,在电视、空调、机顶盒等家用电器中得到了广泛应用。但不同品牌的遥控器编码协议各异,常常出现“遥控器地狱”的尴尬局面。因此,拥有一款能够学习和复制多种红外信号的万能遥控器成为了许多人的梦想。
本项目将带领大家使用STM32单片机、红外接收头、红外发射管、OLED显示屏和EEPROM存储芯片等常见电子元器件,从零开始打造一款功能完备的万能红外遥控器。
二、系统设计
2.1 功能需求
- 红外信号学习与发射: 能够学习和存储多组红外遥控器信号,并选择性地进行发射。
- OLED 显示: 实时显示当前工作模式、红外信号编码、存储地址等信息。
- 按键控制: 通过按键实现模式切换、红外信号学习、存储地址选择、红外信号发射等功能。
- EEPROM 存储: 将学习到的红外编码存储到外部 EEPROM 芯片中,实现断电保存。
2.2 系统架构
下图展示了万能红外遥控器的系统架构图:
工作流程:
- 红外信号接收: 红外接收头接收目标遥控器的红外信号,并将其转换为电信号传输给STM32单片机。
- 红外信号解码: STM32单片机对接收到的红外信号进行解码,提取出其中的编码信息。
- 红外信号学习: 在学习模式下,STM32单片机将解码后的红外编码存储到EEPROM中。
- 红外信号发射: 在发射模式下,STM32单片机从EEPROM中读取对应地址的红外编码,并通过红外发射管发射出去。
- 人机交互: 用户通过按键模块与万能遥控器进行交互,OLED显示屏实时显示当前工作状态和相关信息。
三、硬件设计
3.1 硬件选型
组件 | 型号 | 说明 |
---|---|---|
主控芯片 | STM32F103C8T6 | 资源丰富、性价比高的32位单片机 |
红外接收头 | VS1838B | 灵敏度高、抗干扰能力强的红外接收模块 |
红外发射管 | 940nm | 常用的红外发射二极管 |
OLED显示屏 | 0.96寸OLED | 体积小巧、显示清晰的有机发光二极管显示屏 |
按键模块 | 4按键 | 用于模式切换、学习、发射等功能 |
EEPROM存储芯片 | AT24C02 | 容量2Kbit,可存储多组红外编码 |
3.2 电路原理图
- STM32F103C8T6:
- PA0: 连接红外接收头的 OUT 引脚,用于接收红外信号。
- PA1: 连接红外发射管的 A 引脚,用于发射红外信号。
- PA2: 连接OLED显示屏和EEPROM的 SDA 引脚,用于I2C通信。
- PA3: 连接OLED显示屏和EEPROM的 SCL 引脚,用于I2C通信。
- PB0: 连接按键模块的 KEY1 引脚,用于模式切换。
- PB1: 连接按键模块的 KEY2 引脚,用于学习/发射功能选择。
- VCC: 连接到3.3V电源。
- GND: 连接到地。
- 红外接收头 (VS1838B):
- OUT: 输出红外接收信号。
- VCC: 连接到3.3V电源。
- GND: 连接到地。
- 红外发射管:
- A: 连接到STM32的PA1,用于接收发射信号。
- K: 连接到3.3V电源,通常需要串联一个220Ω的电阻进行限流。
- OLED显示屏 (0.96寸):
- SDA: I2C数据线。
- SCL: I2C时钟线。
- VCC: 连接到3.3V电源。
- GND: 连接到地。
- 按键模块 (4按键):
- KEY1: 连接到STM32的PB0,用于模式切换。
- KEY2: 连接到STM32的PB1,用于学习/发射功能选择。
- KEY3 & KEY4: 连接到地,用于选择存储地址或其他功能。
- EEPROM存储芯片 (AT24C02):
- SDA: I2C数据线。
- SCL: I2C时钟线。
- WP: 写保护引脚,接高电平有效,本设计中接VCC。
- VCC: 连接到3.3V电源。
- GND: 连接到地。
四、软件设计
4.1 软件架构
软件流程:
- 初始化: 初始化STM32的各个外设,包括GPIO、定时器、I2C、USART等。
- 按键检测: 循环检测按键状态,若有按键按下,则进行按键处理。
- 红外信号接收: 通过中断方式实时检测红外接收头的信号,若接收到信号,则进行红外解码。
- 模式判断: 根据当前工作模式,选择执行红外编码存储或红外编码读取操作。
- 红外编码存储: 将解码后的红外编码存储到EEPROM中。
- 红外编码读取: 从EEPROM中读取对应地址的红外编码,并通过红外发射管发射出去。
- 红外信号发送: 根据读取到的红外编码,控制红外发射管生成相应的红外信号。
4.2 代码示例
主程序代码:
#include "stm32f10x.h"
#include "oled.h"
#include "ir.h"
#include "eeprom.h"
int main(void)
{
// 初始化
SystemInit();
OLED_Init();
IR_Init();
EEPROM_Init();
// 显示欢迎界面
OLED_ShowString(0, 0, "Universal IR", 16);
OLED_ShowString(0, 2, "Remote Control", 16);
while (1)
{
// 按键检测
if (Key_Scan())
{
Key_Handle();
}
// 红外信号接收处理
if (IR_IsDataReady())
{
IR_DataHandle();
}
}
}
红外解码函数:
void IR_DataHandle(void)
{
uint8_t ir_code[IR_CODE_LEN];
// 获取红外编码
IR_GetCode(ir_code);
if (current_mode == IR_MODE_LEARN)
{
// 学习模式,存储红外编码
EEPROM_Write(current_address, ir_code, IR_CODE_LEN);
OLED_ShowString(0, 4, "Code Learned!", 16);
}
else if (current_mode == IR_MODE_SEND)
{
// 发射模式,发送红外编码
IR_SendCode(ir_code);
OLED_ShowString(0, 4, "Code Sent!", 16);
}
}
五、总结
本文介绍了基于STM32的万能红外遥控器的设计与实现,涵盖了硬件选型、电路设计、软件架构和代码示例等方面。通过学习本文,相信你已经对红外通信原理、STM32编程、OLED显示和EEPROM数据存储等技术有了更深入的了解,并能够独立完成一个功能完备的万能红外遥控器。