基于STM32的通用红外遥控器设计: 解码、学习与发射(代码示例)

摘要: 本文将带你使用STM32打造一款功能强大的万能红外遥控器,它可以学习和复制多种红外信号,并通过OLED屏幕和按键实现便捷操作。我们将深入探讨红外通信原理、STM32编程、OLED显示和EEPROM数据存储等关键技术,并提供完整的代码示例和电路图,帮助你轻松构建属于自己的智能家居控制中心。

一、项目背景

红外遥控技术凭借其成本低廉、功耗低、易于实现等优点,在电视、空调、机顶盒等家用电器中得到了广泛应用。但不同品牌的遥控器编码协议各异,常常出现“遥控器地狱”的尴尬局面。因此,拥有一款能够学习和复制多种红外信号的万能遥控器成为了许多人的梦想。

本项目将带领大家使用STM32单片机、红外接收头、红外发射管、OLED显示屏和EEPROM存储芯片等常见电子元器件,从零开始打造一款功能完备的万能红外遥控器。

二、系统设计

2.1 功能需求

  • 红外信号学习与发射: 能够学习和存储多组红外遥控器信号,并选择性地进行发射。
  • OLED 显示: 实时显示当前工作模式、红外信号编码、存储地址等信息。
  • 按键控制: 通过按键实现模式切换、红外信号学习、存储地址选择、红外信号发射等功能。
  • EEPROM 存储: 将学习到的红外编码存储到外部 EEPROM 芯片中,实现断电保存。

2.2 系统架构

下图展示了万能红外遥控器的系统架构图:

工作流程:

  1. 红外信号接收: 红外接收头接收目标遥控器的红外信号,并将其转换为电信号传输给STM32单片机。
  2. 红外信号解码: STM32单片机对接收到的红外信号进行解码,提取出其中的编码信息。
  3. 红外信号学习: 在学习模式下,STM32单片机将解码后的红外编码存储到EEPROM中。
  4. 红外信号发射: 在发射模式下,STM32单片机从EEPROM中读取对应地址的红外编码,并通过红外发射管发射出去。
  5. 人机交互: 用户通过按键模块与万能遥控器进行交互,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 软件架构

 

软件流程:

  1. 初始化: 初始化STM32的各个外设,包括GPIO、定时器、I2C、USART等。
  2. 按键检测: 循环检测按键状态,若有按键按下,则进行按键处理。
  3. 红外信号接收: 通过中断方式实时检测红外接收头的信号,若接收到信号,则进行红外解码。
  4. 模式判断: 根据当前工作模式,选择执行红外编码存储或红外编码读取操作。
  5. 红外编码存储: 将解码后的红外编码存储到EEPROM中。
  6. 红外编码读取: 从EEPROM中读取对应地址的红外编码,并通过红外发射管发射出去。
  7. 红外信号发送: 根据读取到的红外编码,控制红外发射管生成相应的红外信号。

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数据存储等技术有了更深入的了解,并能够独立完成一个功能完备的万能红外遥控器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/779175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进阶】文件系统7——文件系统简单操作

1.磁盘与目录的容量 现在我们知道磁盘的整体数据是在超级区块中,但是每个文件的容量则在inode 当中记载。 那在命令行模式下面该如何显示这几个数据?下面就让我们来谈一谈这两个命令: df:列出文件系统的整体磁盘使用量&#xf…

(阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

公务员考试、事业编考试、教师资格证、面试、K12资料、电子书

点击上方△腾阳 关注 作者 l 腾阳 转载请联系授权 你好,我是腾阳。 在这个自媒体的海洋里,我曾是一只迷失方向的小鸟,多次尝试飞翔却总是跌跌撞撞。 但每一次跌倒,都让我更坚定地相信,只要不放弃,总…

【Android】自定义换肤框架01之皮肤包制作

前言 目前为止,市面上主流的安卓换肤方案,其实原理都是差不多的 虽然大多都号称一行代码集成,但其实想要做到完全适配,并不简单 这个系列,就是让大家从零开始,完全掌握这方面知识,这样才能对…

Floyd

模板&#xff1a; 时间复杂度&#xff1a;O( ) memset(v,127,sizeof(v));for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)if(v[i][k]<1<<30&&v[k][j]<1<<30)v[i][j]min(v[i][j],v[i][k]v[k][j]);

2024年软件测试八股文(含答案)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

ContextCapture - 开启三维世界的魔法之门

亲爱的朋友们&#xff0c;当我第一次接触到ContextCapture这款软件时&#xff0c;我的内心激动得难以平静。仿佛一位魔法师突然出现在我面前&#xff0c;向我展示了一个全新的世界。是的&#xff0c;这就是ContextCapture带给我的感觉 - 它不仅仅是一款软件&#xff0c;更是一把…

数字化精益生产系统--APS 排程管理系统

APS&#xff08;Advanced Planning and Scheduling&#xff09;排程管理系统&#xff0c;即高级生产计划与排程系统&#xff0c;是一种高度智能化的计划和排程系统。它通过整合各种生产和供应链数据&#xff0c;运用先进的算法和数据模型&#xff0c;根据各种约束条件&#xff…

最新-基于Python的理财和记账系统

博主介绍&#xff1a;&#x1f449;全网个人号和企业号粉丝40W,每年辅导几千名大学生较好的完成毕业设计&#xff0c;专注计算机软件领域的项目研发&#xff0c;不断的进行新技术的项目实战&#x1f448; ⭐️热门专栏推荐订阅⭐️ 订阅收藏起来&#xff0c;防止下次找不到 &am…

非NI GPIB卡与LabVIEW兼容性分析

在许多测试和测量应用中&#xff0c;通用接口总线&#xff08;GPIB&#xff09;是一种广泛使用的标准。尽管国家仪器公司&#xff08;NI&#xff09;提供的GPIB硬件和LabVIEW软件的组合被广泛接受和使用&#xff0c;但成本可能较高。因此&#xff0c;一些用户会考虑使用其他厂商…

CDRViewer Pro for Mac:专业级CDR文件查看利器,设计灵感一触即发

CDRViewer Pro for Mac&#xff0c;作为一款专为Mac用户设计的CDR文件查看工具&#xff0c;它打破了传统文件查看的界限&#xff0c;让设计师和创意工作者能够轻松访问和预览CorelDRAW&#xff08;CDR&#xff09;格式的图形文件。无需打开庞大的CorelDRAW软件&#xff0c;即可…

Nacos源码分析:心跳机制、健康检查、服务发现、AP集群

文章目录 心跳机制与服务健康检查NacosClient端NacosServer端NacosServer端健康检查 服务发现NacosClient端NacosServer端 AP集群从源码启动集群心跳设计原理各节点状态同步服务实例数据同步服务实例状态变动同步 心跳机制与服务健康检查 官方文档&#xff1a;发送某个实例的心…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——认识HAL_Delay和osDelay的区别

一、修改两个任务的优先级 任务一 任务二 二、使用HAL_Delay的实验结果 结果&#xff1a; LED1亮&#xff0c;LED2不亮 三、使用osDelay的实验结果 结果&#xff1a; LED1亮&#xff0c;LED2亮 四、解释原因 vTaskDelay 与 HAL_Delay 的区别 1.vTaskDelay 作用是让任务阻…

简单解读伦敦银CFD(XAG)走势图

从本质上说&#xff0c;伦敦银是一种差价合约&#xff08;CFD&#xff09;交易&#xff0c;在同平台所提供的MT4中&#xff0c;它的代码也许并不一样&#xff0c;有的平台会显示为XAG&#xff0c;有的平台会显示为LLS或Silver&#xff0c;但它们指的其实是同一个品种&#xff0…

前端学习(五)CSS浮动与补白

目录&#xff1a; 内容&#xff1a; //设置左右浮动 .left{float:left; } .right{float:right; } /*必须设置不同浮动*/ //创建div <div> <dic class"left">左边</div> <div class"right">右边</div> </div> //设置浮…

[Multi-Modal] MDETR 论文及代码学习笔记

代码地址&#xff1a;https://github.com/ashkamath/mdetr 论文地址&#xff1a;https://arxiv.org/abs/2104.12763 多模态推理系统依靠预先训练的目标检测器从图像中提取感兴趣区域&#xff08;边界框包围区域&#xff09;。然而&#xff0c;这个关键模块通常被用作黑匣子&…

【VUE基础】VUE3第三节—核心语法之computed、watch、watcheffect

computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 创建一个只读的计算属性 ref&#xff1a; <template><div cl…

opencv环境搭建-python

最近遇到了一些图像处理的需求&#xff0c;所以需要学习一下opencv,来记录一下我的学习历程。 安装numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安装matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安装opencv …

一级指针 二级指针

目录 一级指针 二级指针 通过二级指针打印原数据 一级指针 一级指针就是存放变量的指针 代码演示&#xff1a; #include<stdio.h> int main() {int a 10;int* pa &a;return 0; } pa就是一级指针变量&#xff0c;是变量就会有地址&#xff0c;因为变量都是在…

HetuEngine简介

目录 HetuEngine是什么&#xff1f; HetuEngine的特点以及使用场景 特点 使用场景 HetuEngine介绍 结构 近期用到了Hetu&#xff0c;了解下这个工具是起什么作用的。 HetuEngine是什么&#xff1f; 是引擎&#xff0c;设计是为了让与当前的大数据生态完美融合的引擎&am…