news 2026/5/6 7:45:26

用STM32F103C8T6和CR2032电池DIY一个超省电的红外遥控器(附完整源码和PCB文件)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32F103C8T6和CR2032电池DIY一个超省电的红外遥控器(附完整源码和PCB文件)

基于STM32F103C8T6的极简红外遥控器设计与实现

在智能家居设备泛滥的今天,我们反而经常陷入找不到原装遥控器的尴尬。市面上所谓的"万能遥控器"要么体积庞大,要么需要复杂的学习流程。本文将带你用最精简的硬件方案——STM32F103C8T6微控制器搭配CR2032纽扣电池,打造一个厚度仅1mm、待机电流11μA的卡片式红外遥控器。这个项目特别适合作为嵌入式低功耗设计的入门实践,你将掌握时钟降频、GPIO状态优化等关键节能技术,以及红外编码解析与发射的完整实现方案。

1. 硬件设计与选型要点

1.1 核心器件选型分析

选择STM32F103C8T6作为主控主要基于三个考量:

  • Cortex-M3内核提供足够处理能力解码红外信号
  • 64KB Flash足以存储多组遥控编码
  • 20mA GPIO驱动能力可直接驱动红外发射管

CR2032电池的供电特性需要特别注意:

参数典型值项目需求
容量220mAh≥200mAh
峰值电流15mA≤12mA
自放电率1%/年满足长期待机

1.2 关键电路设计

红外发射电路采用最简单的NPN三极管驱动方案:

// 典型驱动代码 void IR_Send(uint32_t code) { GPIO_SetBits(GPIOA, GPIO_Pin_1); // 打开三极管基极 // 发送38kHz载波 for(int i=0; i<code_length; i++) { if(code & (1<<i)) { PWM_Enable(); delay_us(560); } else { PWM_Disable(); delay_us(560); } } GPIO_ResetBits(GPIOA, GPIO_Pin_1); }

提示:红外发射管建议选用Vf≤1.2V的型号(如TSAL6200),确保在电池电压下降时仍有足够发射距离。

2. 低功耗实现关键技术

2.1 时钟系统优化

将主频从默认72MHz降至8MHz可显著降低动态功耗:

void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // 禁用PLL HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); }

2.2 待机模式配置

实现11μA待机电流的关键步骤:

  1. 关闭所有未使用的外设时钟
  2. 配置所有未用GPIO为模拟输入模式
  3. 启用Stop模式并配置唤醒源
void Enter_LowPower_Mode(void) { HAL_GPIO_WritePin(GPIOA, GPIO_Pin_All, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_Pin_All, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOC, GPIO_Pin_All, GPIO_PIN_RESET); __HAL_RCC_GPIOA_CLK_DISABLE(); __HAL_RCC_GPIOB_CLK_DISABLE(); __HAL_RCC_GPIOC_CLK_DISABLE(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); }

3. 红外编码学习与存储方案

3.1 信号捕获与解码

利用定时器输入捕获功能记录红外信号:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint32_t last_capture = 0; uint32_t current_capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { uint32_t pulse_width = current_capture - last_capture; if(pulse_width > 2000) { // 识别引导码 ir_code.position = 0; } else { ir_code.bits[ir_code.position++] = (pulse_width > 1000) ? 1 : 0; } last_capture = current_capture; } }

3.2 数据存储管理

使用STM32内部Flash模拟EEPROM存储编码:

#define FLASH_PAGE_SIZE 0x400 // 1KB per page #define IR_DATA_ADDRESS 0x0800FC00 // 最后一页 void Save_IR_Code(uint8_t dev_idx, uint8_t btn_idx, IR_CodeTypeDef *code) { HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef erase; erase.TypeErase = FLASH_TYPEERASE_PAGES; erase.PageAddress = IR_DATA_ADDRESS; erase.NbPages = 1; uint32_t page_error; HAL_FLASHEx_Erase(&erase, &page_error); uint64_t *p_data = (uint64_t*)IR_DATA_ADDRESS; for(int i=0; i<sizeof(IR_CodeTypeDef)/8; i++) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)p_data, *((uint64_t*)code + i)); p_data++; } HAL_FLASH_Lock(); }

4. 结构设计与用户体验优化

4.1 超薄机械结构

采用1mm厚PCB作为主体结构:

  • 顶层:6x6mm轻触开关
  • 中间层:CR2032电池座
  • 底层:红外发射管

注意:电池正极朝下安装可减少整体厚度,但需在PCB做相应丝印提示。

4.2 学习模式交互设计

优化后的学习流程:

  1. 长按设备键3秒进入学习模式(LED常亮)
  2. 短按功能键选择要学习的按键(LED快闪)
  3. 用原装遥控器对准接收头发射信号
  4. 成功学习后LED恢复常亮
  5. 长按设备键退出学习模式

实测发现,大多数用户在无说明书情况下,能凭LED状态直觉完成学习操作。

5. 实测性能数据与优化建议

经过三个版本迭代后的关键指标对比:

版本待机电流发射距离按键响应电池寿命
V1.045μA2m120ms6个月
V1.118μA3.5m80ms1年
V1.211μA4m50ms2年

最终版本在以下方面做了特别优化:

  • 改用0603封装的低Vf红外发射管
  • 增加电源去耦电容改善瞬时负载响应
  • 优化PCB布局减少高频干扰
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 7:39:30

别再傻傻调延时了!用STM32F103的PWM+DMA驱动WS2812B,效果稳如老狗

STM32F103的PWMDMA驱动WS2812B&#xff1a;告别时序调试的终极方案 第一次尝试用STM32驱动WS2812B时&#xff0c;那种挫败感至今难忘。明明按照手册调整了延时参数&#xff0c;LED灯带却像得了帕金森一样闪烁不定。后来才发现&#xff0c;问题出在GPIO翻转的时序精度上——这种…

作者头像 李华
网站建设 2026/5/6 7:39:29

解锁多语言游戏世界:XUnity.AutoTranslator深度配置与实战指南

解锁多语言游戏世界&#xff1a;XUnity.AutoTranslator深度配置与实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专为Unity游戏设计的实时翻译插件&#xff0c;它能…

作者头像 李华
网站建设 2026/5/6 7:31:43

OpenLyrics:foobar2000开源歌词插件的专业使用指南

OpenLyrics&#xff1a;foobar2000开源歌词插件的专业使用指南 【免费下载链接】foo_openlyrics An open-source lyric display panel for foobar2000 项目地址: https://gitcode.com/gh_mirrors/fo/foo_openlyrics OpenLyrics是一个专为foobar2000音乐播放器设计的开源…

作者头像 李华
网站建设 2026/5/6 7:27:16

Unity开发AI助手API幻觉终结方案:MCP协议与本地数据库实践

1. 项目概述&#xff1a;当AI助手遇上Unity开发&#xff0c;如何终结API幻觉&#xff1f; 如果你是一名Unity开发者&#xff0c;同时又在使用Claude、Cursor这类AI编程助手&#xff0c;那你一定经历过这样的场景&#xff1a;你问AI“Unity里怎么异步加载场景&#xff1f;”&…

作者头像 李华