当前位置: 首页 > article >正文

用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)

STM32实战从示波器捕获到空调红外协议逆向全解析红外遥控技术看似简单却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师我经常遇到需要逆向控制家电的场景。最近在智能家居项目中就遇到了需要通过单片机控制传统空调的需求。市面上虽然有不少现成的红外学习模块但要么价格昂贵要么灵活性不足。本文将分享如何用STM32配合示波器从零开始逆向美的和格力空调的红外协议并提供可直接用于生产的代码实现。1. 红外协议基础与测量准备在开始解码之前我们需要先搭建一个可靠的测量环境。红外信号虽然肉眼不可见但通过适当的工具可以将其转化为可视化的波形。我推荐使用以下设备组合示波器DS100系列数字示波器就足够带宽不必太高红外接收管VS1838B或HS0038这类常见型号STM32开发板推荐使用带HAL库支持的F1或F4系列杜邦线若干注意测量时尽量保持环境光线稳定避免日光灯等可能产生红外干扰的光源红外协议的核心参数包括载波频率、引导码结构和数据编码方式。通过示波器捕获原始遥控器的信号我们可以获得这些关键信息。以下是典型测量步骤将红外接收管的OUT引脚连接到示波器通道1设置示波器为单次触发模式边沿触发下降沿调整时基到500μs/div左右电压量程1V/div按下遥控器按键捕获完整波形测量时特别要注意几个关键时间参数参数类型美的典型值格力典型值引导码低电平4.5ms9ms引导码高电平4.5ms4.5ms逻辑0周期550μs低550μs高640μs低550μs高逻辑1周期550μs低1.68ms高640μs低1.68ms高2. 美的空调协议深度解析通过示波器捕获美的空调遥控信号后我发现其协议结构与常见的NEC协议有显著差异。美的采用了一种双48位数据帧的结构中间用特殊的分隔码隔开。2.1 协议帧结构详解完整的美的红外指令由以下几部分组成[引导码] [数据帧1] [分隔码] [数据帧2] [结束间隔]其中数据帧采用LSB优先的传输方式每个字节后跟随其反码。具体来看引导码4.5ms低电平 4.5ms高电平分隔码550μs低电平 5.22ms高电平逻辑0550μs低电平 550μs高电平逻辑1550μs低电平 1.68ms高电平数据帧格式为LAABBCC其中L为固定前缀通常为0xB2A为地址码B为命令码C为扩展码表示反码2.2 STM32硬件PWM配置要实现精确的红外发射必须正确配置定时器产生38kHz载波。以下是基于STM32 HAL库的配置代码// 定时器4 PWM初始化 void TIM4_PWM_Init(void) { TIM_HandleTypeDef htim4; TIM_OC_InitTypeDef sConfigOC; htim4.Instance TIM4; htim4.Init.Prescaler 71; // 72MHz/(711)1MHz htim4.Init.CounterMode TIM_COUNTERMODE_UP; htim4.Init.Period 26; // 1MHz/(261)37kHz htim4.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim4); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 13; // 50%占空比 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim4, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim4, TIM_CHANNEL_1); }2.3 完整发射代码实现基于上述分析我们可以实现美的空调的完整控制函数void Send_Byte_MeiDi(uint8_t data) { for(uint8_t i0; i8; i){ if(data 0x01){ Send_Logic1(); }else{ Send_Logic0(); } data 1; } } void Control_MeiDi_AC(uint8_t cmd, uint8_t temp) { // 发送引导码 Send_Leader_MeiDi(); // 发送第一帧数据 Send_Byte_MeiDi(0xB2); // 固定前缀 Send_Byte_MeiDi(0x4D); // 地址码 Send_Byte_MeiDi(cmd); // 命令码 Send_Byte_MeiDi(temp); // 温度 // 发送分隔码 Send_Separator_MeiDi(); // 重复发送数据帧 Send_Leader_MeiDi(); Send_Byte_MeiDi(0xB2); Send_Byte_MeiDi(0x4D); Send_Byte_MeiDi(cmd); Send_Byte_MeiDi(temp); // 结束信号 HAL_TIM_PWM_Stop(htim4, TIM_CHANNEL_1); delay_us(20000); }3. 格力空调协议逆向工程格力空调的红外协议相比美的更为复杂采用了引导码35位数据连接码32位数据的结构。经过多次测量和分析我总结出其协议特点如下3.1 协议时序特点格力协议的关键时序参数引导码9ms低电平 4.5ms高电平连接码640μs低电平 20ms高电平逻辑0640μs低电平 550μs高电平逻辑1640μs低电平 1.68ms高电平结束码540μs低电平 20ms高电平数据格式采用混合编码方式部分位为固定值部分位为控制命令。典型的数据帧结构如下[引导码] [35位数据] [连接码] [32位数据] [结束码]3.2 关键数据位解析通过对比不同按键的波形我发现格力协议中以下数据位具有特殊含义第1字节固定为0x86关机或0x96开机第2字节模式控制制冷、制热等第3字节风速和扫风控制第4字节温度值0x00对应16℃每增加1温度加13.3 STM32实现代码基于上述分析格力空调的控制函数实现如下void Send_Byte_Gree(uint8_t data) { for(uint8_t i0; i8; i){ if(data 0x80){ Send_Logic1_Gree(); }else{ Send_Logic0_Gree(); } data 1; } } void Control_Gree_AC(uint8_t power, uint8_t mode, uint8_t fan, uint8_t temp) { // 发送引导码 Send_Leader_Gree(); // 第一段数据 Send_Byte_Gree(power ? 0x96 : 0x86); Send_Byte_Gree(0x50); Send_Byte_Gree(0x04); Send_Byte_Gree(0x0A); Send_Fixed_Gree(); // 发送固定位 // 连接码 Send_Connector_Gree(); // 第二段数据 Send_Byte_Gree(0x88); Send_Byte_Gree(0x04); Send_Byte_Gree(0x00); Send_Byte_Gree(power ? 0x00 : 0x01); // 结束码 Send_End_Gree(); }4. 硬件实现与调试技巧在实际硬件实现过程中有几个关键点需要特别注意4.1 红外发射电路设计一个可靠的红外发射电路应该包含以下元件红外发射管推荐使用TSAL6200发射角度窄功率大驱动三极管2N3904或8050等通用NPN三极管限流电阻通常10-100Ω根据发射距离调整典型电路连接方式STM32 GPIO - 1kΩ电阻 - 三极管基极 三极管集电极 - 红外发射管 - 限流电阻 - VCC 三极管发射极 - GND4.2 常见问题排查在调试过程中可能会遇到以下问题及解决方案问题现象可能原因解决方法遥控距离短发射管电流不足减小限流电阻值信号不稳定载波频率偏差校准定时器配置空调无反应协议解析错误用示波器验证波形误触发其他设备编码冲突修改客户码或地址码4.3 性能优化建议使用硬件PWM生成载波减少CPU占用在发送间隙关闭红外发射降低功耗添加软件去抖防止重复触发对常用指令进行预编码提高响应速度5. 进阶应用与扩展思考掌握了基本的红外控制技术后可以进一步实现更复杂的应用场景5.1 智能家居集成将STM32红外控制器接入家庭自动化系统可以实现根据温湿度传感器数据自动调节空调与智能音箱对接实现语音控制远程手机APP控制场景联动如离家模式自动关闭空调5.2 协议自动化分析工具开发为了简化协议分析过程可以开发基于STM32的红外学习器void IR_Learning_Mode(void) { uint32_t edge_time[100]; uint8_t edge_count 0; // 配置输入捕获 HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); while(1){ if(edge_count 100) break; // 在中断中记录边沿时间 } // 分析捕获的时间序列 Analyze_Protocol(edge_time, edge_count); }5.3 多品牌兼容方案通过建立协议数据库可以实现对多种品牌家电的统一控制typedef struct { uint8_t brand; uint16_t leader_low; uint16_t leader_high; uint16_t bit0_low; uint16_t bit0_high; uint16_t bit1_low; uint16_t bit1_high; void (*send_func)(uint8_t cmd); } IR_Protocol_t; const IR_Protocol_t protocol_db[] { {BRAND_MEIDI, 4500, 4500, 550, 550, 550, 1680, Send_MeiDi}, {BRAND_GREE, 9000, 4500, 640, 550, 640, 1680, Send_Gree}, // 其他品牌协议... };在实际项目中我发现美的空调对时序要求相对宽松而格力协议则更为严格。特别是在连接码和结束码的时序上偏差超过10%就可能导致控制失败。硬件方面使用高速开关三极管如2N2222可以显著提高发射距离但要注意散热问题。

相关文章:

用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)

STM32实战:从示波器捕获到空调红外协议逆向全解析 红外遥控技术看似简单,却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师,我经常遇到需要逆向控制家电的场景。最近在智能家居项目中,就遇到了需要通过…...

深入OpenHarmony NAPI引擎:从‘@ohos.hilog’导入到so库加载的底层链路剖析

深入OpenHarmony NAPI引擎:从‘ohos.hilog’导入到so库加载的底层链路剖析 当开发者在OpenHarmony应用中写下import hilog from ohos.hilog时,背后隐藏着一套精密的系统级协作机制。这条看似简单的语句,实际上触发了从JavaScript语法解析到原…...

CentOS部署PHP项目完整步骤

CentOS 7.9 部署 PHP 7.4 MySQL 5.7.44 完整步骤 由于 CentOS 7 已于 2024 年 6 月 30 日停止官方维护,原有的 yum 源已不可用,因此必须首先更换为阿里云镜像源才能正常安装软件。 一、系统环境准备 1.1 更换阿里云 YUM 源 # 1. 备份原有源 mv /etc/yum…...

智能表格在敏捷项目管理中的工时统计实践

1. 为什么敏捷团队需要智能工时统计 在敏捷开发中,两周一次的迭代就像一场短跑比赛。我见过太多团队在冲刺过半时才发现工时严重超支,这时候再调整已经来不及了。传统Excel表格需要手动更新公式,光是合并不同成员的工作量报表就能消耗半天时间…...

springboot+vue基于web的美食外卖点餐平台的设外卖员商家

目录同行可拿货,招校园代理 ,本人源头供货商外卖员功能分析商家功能分析技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 外卖员功能分析 外卖员在美食外卖点餐平台中的核心…...

认知内耗:在亚马逊,为何品牌名内部的“关键词”正在相互厮杀

在亚马逊的品牌丛林中,最隐蔽的悲剧莫过于:你精心构思的品牌名,其内部的各个组成部分(如“欧文斯”、“康宁”、“玻璃纤维”),并未协同指向你,反而各自激活了消费者心智中其他更强大品牌的“认…...

RTX3070 + CUDA 11.0 实战:手把手教你从零搭建 PointNet.pytorch 环境(附常见报错解决)

RTX3070 CUDA 11.0 实战:手把手教你从零搭建 PointNet.pytorch 环境(附常见报错解决) 当你手握一块RTX3070显卡,想要复现PointNet这一经典点云处理网络时,是否曾被环境配置的各种坑绊住脚步?本文将带你避开…...

OpenCV实战:3种图像降噪滤波器的Python代码对比(附效果图)

OpenCV实战:3种图像降噪滤波器的Python代码对比(附效果图) 在数字图像处理中,噪声是影响图像质量的主要因素之一。无论是来自传感器的不完美,还是传输过程中的干扰,噪声都会降低图像的清晰度和可用性。对于…...

保姆级教程:在RK3588上交叉编译Qt 5.15.15(含完整配置流程)

保姆级教程:在RK3588上交叉编译Qt 5.15.15(含完整配置流程) 在嵌入式开发领域,RK3588作为一款高性能的ARM处理器,正逐渐成为智能终端设备的首选平台。而Qt框架凭借其跨平台特性和丰富的GUI组件,为嵌入式界面…...

如何通过WeChatMsg实现微信聊天记录永久保存:从数据安全到情感记忆的完整解决方案

如何通过WeChatMsg实现微信聊天记录永久保存:从数据安全到情感记忆的完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.co…...

UnityLockstep:构建零延迟多人游戏的终极同步框架

UnityLockstep:构建零延迟多人游戏的终极同步框架 【免费下载链接】UnityLockstep Deterministic Lockstep with clientside prediction and rollback 项目地址: https://gitcode.com/gh_mirrors/un/UnityLockstep 在多人游戏开发中,你是否曾为网…...

GHelper:华硕笔记本的轻量级性能管理解决方案

GHelper:华硕笔记本的轻量级性能管理解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, and …...

Windows系统优化神器:Winhance中文版全面使用指南

Windows系统优化神器:Winhance中文版全面使用指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

抖音批量下载工具:高效获取无水印视频与图文内容的全攻略

抖音批量下载工具:高效获取无水印视频与图文内容的全攻略 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

5个技巧掌握DINO注意力可视化:从入门到模型可解释性分析

5个技巧掌握DINO注意力可视化:从入门到模型可解释性分析 【免费下载链接】dino PyTorch code for Vision Transformers training with the Self-Supervised learning method DINO 项目地址: https://gitcode.com/gh_mirrors/di/dino 视觉模型可解释性已成为人…...

IP查询API性能评测指南:从响应时间到QPS的完整评估方法

在广告投放、反作弊、内容风控、日志分析等系统中,IP地理位置查询通常是高频、基础、不可或缺的环节。然而,很多团队在技术选型时往往停留在“能查到就行”的层面,忽视了其对系统性能、稳定性与长期成本的影响。 本文从技术评估角度出发&…...

如何将微信聊天记忆转化为数字珍藏:WeChatMsg的数据主权革命

如何将微信聊天记忆转化为数字珍藏:WeChatMsg的数据主权革命 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

从零到一:AI工程开源资源全栈指南与实战应用

从零到一:AI工程开源资源全栈指南与实战应用 【免费下载链接】aie-book [WIP] Resources for AI engineers. Also contains supporting materials for the book AI Engineering (Chip Huyen, 2025) 项目地址: https://gitcode.com/GitHub_Trending/ai/aie-book …...

OpenRocket终极指南:专业火箭设计与飞行仿真软件完全解析

OpenRocket终极指南:专业火箭设计与飞行仿真软件完全解析 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket OpenRocket是一款功能强大的开源火箭…...

别再手动敲命令了!用PyCharm自带功能一键创建Linux桌面快捷方式(附手动配置备份方案)

告别终端:PyCharm内置工具3秒生成Linux桌面快捷方式(附应急手动方案) 每次打开PyCharm都要在终端输入一长串路径?作为开发者,我们的时间应该花在创造价值上,而不是重复输入命令。JetBrains早就为Linux用户准…...

【STM32F103标准库开发】DMA+USART双剑合璧:实战环形缓冲区与空闲中断解析

1. 为什么需要DMAUSART组合方案 第一次用STM32做GPS数据采集时,我被串口中断折磨得够呛。当时用的是传统中断接收模式,每收到一个字节就触发一次中断,在115200波特率下,CPU几乎被串口中断占满,其他任务根本跑不动。后来…...

让 AI 听懂业务、直接干活:销售易 NeoAgent 2.0 的三大跃迁

当软件行业仍在争论“AI是否会杀死SaaS”时,销售易已经给出了自己的答案。3月27日,在2026腾讯云城市峰会首站上海站,腾讯旗下CRM销售易正式发布新一代营销服全场景AI原生CRM——NeoAgent 2.0。这并非一次简单的产品迭代,而是销售易…...

威纶通宏指令实战:从零构建中文输入与智能配方检索系统

1. 威纶通触摸屏的中文输入困境与破解之道 第一次接触威纶通中低端触摸屏时,我就被它缺乏中文输入支持的问题给难住了。当时接了个食品包装机的项目,客户要求操作界面必须支持中文输入,方便工人记录生产批号和产品信息。市面上常见的中高端HM…...

嵌入式开发必知:原码、反码与补码详解

1. 为什么嵌入式开发必须掌握原码、反码和补码作为一名在嵌入式领域摸爬滚打多年的工程师,我见过太多因为不理解底层数据表示而导致的诡异bug。记得刚入行时,我调试一个温度传感器项目,当温度低于零度时,读取的数值总是偏差127度。…...

别再只画可达空间了!宇树Z1机械臂‘死角’排查与灵活工作空间优化实战

宇树Z1机械臂死角排查与灵活工作空间优化实战指南 当宇树Z1机械臂在自动化产线上执行抓取任务时,工程师们常会遇到一个令人头疼的现象——某些看似可达的位姿却无法实现预期动作。这背后隐藏的往往是机械臂工作空间中的"死角"问题,即那些虽然理…...

千问3.5-2B效果对比评测:与Qwen-VL-Chat基础版在OCR精度和响应速度上的实测差异

千问3.5-2B效果对比评测:与Qwen-VL-Chat基础版在OCR精度和响应速度上的实测差异 1. 评测背景与模型介绍 视觉语言模型正在改变我们与图像交互的方式。作为Qwen系列的最新成员,千问3.5-2B以其轻量级架构和高效性能引起了广泛关注。本次评测将聚焦于两个…...

FunASR Docker部署SSL配置的四个‘天坑’与避坑指南(附完整启动命令)

FunASR Docker部署SSL配置的四个‘天坑’与避坑指南(附完整启动命令) 在语音识别服务的安全部署中,SSL/TLS加密已成为行业标配。但当我们实际为FunASR配置HTTPS时,那些看似简单的步骤背后却暗藏玄机。本文将带您穿越四个最具迷惑性…...

如何自学使用关键字排名软件_关键字排名软件与SEO有什么关系

如何自学使用关键字排名软件_关键字排名软件与SEO有什么关系 在当今数字化时代,SEO(搜索引擎优化)已成为每一个网站运营者必不可少的技能。其中,关键字排名软件扮演了极其重要的角色。如何自学使用关键字排名软件呢?关…...

从数据清洗到结果可视化:一份给地理学新手的R语言geodetector实战避坑指南

从数据清洗到结果可视化:一份给地理学新手的R语言geodetector实战避坑指南 第一次用R语言跑地理探测器时,我盯着满屏的报错信息差点崩溃——明明照着教程一步步操作,为什么别人的代码能跑出漂亮的结果,我的却总在数据导入环节就卡…...

协方差矩阵可视化指南:如何用Seaborn热力图解读变量关系(附完整代码)

协方差矩阵可视化指南:如何用Seaborn热力图解读变量关系(附完整代码) 在数据分析的实际工作中,我们常常需要向非技术背景的决策者解释复杂的统计结果。这时候,一张直观的热力图往往比几十页的统计报告更有说服力。协方…...