基于STM32的智能空调遥控器——格力空调红外编码解析

文章目录


前言

        红外收发设备选用STM32F103RCT6作为主控芯片,通过内部内部晶振震荡产生的38KHz的方波信号拟合市面上主流的红外设备使用的红外波频率。红外收发设备由上位机、嵌入式系统、红外接收与发射电路组成命令端,示波器和空调设备作为用户终端接受命令端的指令控制。采用自主设计电路来实现红外信号的接收与发射,相比于使用成品模块进一步降低了成本,提高了性能。红外收发设备可实现的功能包括接收并识别红外编码信息、存储红外编码信息、与上位机的无线交互。此系统可以学习任意一种红外遥控器发出的信号并写入到内置FLASH存储,即输入捕获红外信号的高低电平持续时间,随后使用PWM产生38KHz载波用于发送存储的电平时间数据,进而完成对信号的学习,发送等。同时对此红外收发设备的Qt上位机进行开发,从而实现远程无线控制遥控器设备的功能,使遥控操作更具智能化——本文主要是对格力空调的控制原理进行解析。

一、NEC协议是什么?

NEC协议的关键特性包括:

1. 数据帧结构:一个完整的NEC协议数据帧包含引导码、用户码(或称为地址码)、用户码反码、命令码和命令码反码。引导码用于同步接收端,用户码用于区分不同的设备或品牌,命令码表示具体的控制指令,而反码则是为了校验数据的正确性。

2. 载波频率:NEC协议使用38kHz的载波频率对信号进行调制,以便于通过红外光传输。

3. 脉冲宽度调制(PWM):在NEC协议中,逻辑“0”和逻辑“1”的编码方式基于脉冲距离调制(PPM),即每个位的时间间隔不同。具体来说,逻辑“0”为560μs的脉冲后跟560μs的空闲时间,总共1.12ms;逻辑“1”则为560μs的脉冲后跟1.6875ms的空闲时间,总共2.25ms。

4. 重复码:当遥控器按键持续按下时,每110毫秒会发送一次重复码,以维持操作状态而不必重新发送整个数据帧。重复码通常由9ms的高电平脉冲、2.25ms的低电平间隔以及560μs的高电平组成。

简而言之,最主要就是红外发射器使用在一个高低电平时间内的不同占比时间代表“0”和“1”,使用一串连续的“0”和“1”来代表不同的控制信号。

数据中接受数据“0”:560us 低电平 + 560us 高电平
数据中接受数据“1”:560us 低电平 + 1680us 高电平

二、格力红外控制器原理

1.格力红外控制码格式

一般格式为起始码+35位数据+连接码+32位数据+结束码,但是有些空调遥控器可能会连续发送两段如上格式的码值,需要具体分析。

如上所示即为格力空调遥控器发出一段码值,使用红外接收管接收并使用示波器捕获显示的红外控制码段。

可以看到,最开始是一段起始码,紧接着是35位“0”,“1”数据,再接着一段连接码,再接着是32位“0”,“1”数据,最后是一段结束码。

起始码:9000us 低电平 + 4500us高电平;
连接码:560us低电平 + 20000us高电平;
结束码:560us低电平 + 高电平;

数据“0”:560us低电平 + 560us高电平;
数据“1”:560us低电平 + 1680us高电平;

(在实际控制中,高低电平控制时间有50us的偏差不影响实际的控制效果)

2.各码段含义

前35段数据:

连接码后的32位数据:

其中,

注意:对于校验码的码值,测试发现网上的码值计算都不适合,实际测试发现不同遥控器控制的校验码都有不同,在实际应用中,建议测试几个控制信号的校验码后进行类推,一般相近控制信号的校验码都是递增或递减的。

这是我当初参考的文章,大家可以了解一下:

格力空调遥控器红外编码透析(长码)_空调遥控器编码-CSDN博客

### 使用STM32微控制器与格力空调进行通信及控制 #### 设备准备 为了实现STM32微控制器对格力空调的控制,需准备好如下硬件组件[^1]: - STM32开发板一块; - 红外发射二极管若干; - 若干电阻电容等基础元器件。 #### 软件环境搭建 软件方面,在电脑上安装好适合STM32系列芯片使用的集成开发环境(IDE),如Keil MDK或STMCubeMX配合IAR Embedded Workbench等工具链。通过这些工具配置并编译适用于目标系统的固件程序。 #### 编程要点 编程时主要关注两个部分的工作: 一是红外信号的学习模式。当按下学习按键后,系统进入学习状态等待接收来自其他遥控装置发出的有效指令脉冲序列;一旦捕获到有效数据,则将其存储起来以便后续调用重发。此过程涉及到定时器中断服务函数以及外部IO口的状态监测逻辑编写。 二是针对特定品牌型号电器产品的编码协议解析。对于格力空调而言,其采用的是NEC标准格式之外的一种私有化扩展版本——Gree Protocol V2/V3。因此需要查阅官方文档获取确切参数定义,并据此调整发送波形特性以匹配预期效果[^2]。 ```c // 定义载波频率为38kHz #define CARRIER_FREQUENCY 38000UL void IR_SendPulse(uint16_t high_time, uint16_t low_time){ GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); // 高电平 Delay_us(high_time); GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); //低电平 Delay_us(low_time); } void Send_GREE_Command(void){ /* 发送引导码 */ IR_SendPulse(9000,4500); unsigned char i,j; for(i=0;i<sizeof(command)/sizeof(unsigned int);i++){ j=(unsigned char)(command[i]); for(j=0;j<8;j++){ if((command[i]&0x01)==0){ IR_SendPulse(560,560); // 发送'0' }else{ IR_SendPulse(560,1690); // 发送'1' } command[i]=command[i]>>1; } } /* 结束标志位 */ IR_SendPulse(560,22000); } ``` 上述代码片段展示了如何利用STM32平台下的GPIO接口模拟产生符合GREE空调识别规格的IRDA信号流。其中`Send_GREE_Command()` 函数负责按照预设的数据包结构依次输出每一位的信息直至完成整个命令字串的传输任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值