(红外遥控)STM32+红外模块控制格力空调

2024-02-04 12:50

本文主要是介绍(红外遥控)STM32+红外模块控制格力空调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

其他红外介绍不多说了,下面介绍一下我使用stm32控制格力空调所遇到问题。

1.红外实现过程中遇到的问题

   网上大部分对格力空调红外编码的介绍都是

    起始码(S)+35位数据码+连接码(C)+32位数据码

 

0的电平宽度为:620us低电平+540us高电平,

1的电平宽度为:620us低电平+1620us高电平

起始码S电平宽度为:9000us低电平+4500us高电平

连接码C电平宽度为:620us低电平+20000us高电平

以上是在接受端的定义,要注意分辨。发射端是相反的

红外发射端的波形。

74815d1f91b445faa56bb5f20da38639.png

红外接受端是以下这种

366726d11e8d467a975c66096662340b.png

两者是不同的。网上大多是第二种容易产生误解。

格力空调的编码如下图——

d799f9a0f461468082b8a6ae26d8b2b7.png

网上的格式都大同小异对红外的编码产生的影响不大。

根据实际的使用,我发现我所使用的遥控器是如下这中格式,末尾的连接码不可缺少。

起始码(S)+35位数据码+连接码(C)+32位数据码+连接码(C)

而且红外遥控器会以两倍的连接码时间间隔发送两次命令。

以上是我实现红外过程中遇到的问题。

2.实现方法

使用stm32的pwm功能发出38kHz的载波,然后控制占空比以达到高低电平的实现。

//38kHz初始化RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);	//打开定时器2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//打开GPIOA的时钟			/*注意:只有部分端口才有PWM功能*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_InternalClockConfig(TIM2);	//设置定时器2的时钟源为内部时钟源TIM_TimeBaseInitTypeDef TimBaseInitStructure;		//设置时基单元TimBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		TimBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; 	//设置计数模式为向上计数TimBaseInitStructure.TIM_Period = 101-1;		//ARR(自动重装器,设置计数峰值)TimBaseInitStructure.TIM_Prescaler = 19-1;		//PSC(预分频器,设置计时频率)TimBaseInitStructure.TIM_RepetitionCounter = 0;	//设置计数重装值TIM_TimeBaseInit(TIM2, &TimBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;		//设置输出比较单元TIM_OCStructInit(&TIM_OCInitStructure);		//先对TIM_OCInitStructure所有成员赋值,之后只会对部分成员重新赋值,防止出现部分成员未赋值情况TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	//设置输出比较模式为PWM1模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//输出比较极性(设置REF,有效电平为高电平)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出状态使能TIM_OCInitStructure.TIM_Pulse = 0;		//CRR(输出比较值)TIM_OC2Init(TIM2,&TIM_OCInitStructure);	//使用输出比较通道2TIM_Cmd(TIM2,ENABLE);	//定时器2使能

编码格式的实现

typedef struct{// Byte 0uint8_t Mode      :3;uint8_t Power     :1;uint8_t Fan       :2;uint8_t SwingAuto :1;uint8_t Sleep     :1;// Byte 1uint8_t Temp        :4;uint8_t TimerHalfHr :1;uint8_t TimerTensHr :2;uint8_t TimerEnabled:1;// Byte 2uint8_t TimerHours:4;uint8_t Turbo     :1;uint8_t Light     :1;uint8_t anion     :1;  // model==YAW1Fuint8_t Powersv   :1;// Byte 3uint8_t unknown0        :2;//00uint8_t TempExtraDegreeF:1;uint8_t UseFahrenheit   :1;uint8_t unknown1        :4;  // value=0b0101// Byte 4uint8_t SwingV      :4;uint8_t SwingH      :3;uint8_t unknown2     :1; //0// Byte 5uint8_t DisplayTemp :2;uint8_t IFeel       :1;uint8_t unknown3    :3;  // value = 0b100 uint8_t WiFi        :1;  //0uint8_t unknown4    :1;    //0// Byte 6uint8_t unknown5   :8;  //00000000// Byte 7uint8_t unknown6    :2; //00uint8_t Econo       :1;uint8_t unknown7    :1;//0uint8_t Sum         :4;}Protocol;
//红外码初始化

 以及发送过程,发送都是逆序的即从低向高为发送。

void IR_Send38kHz(uint16_t time,FunctionalState NewState){if(NewState == 1){TIM_SetCompare2(TIM2,0);Delay_us(time);}else{TIM_SetCompare2(TIM2,50);Delay_us(time);}
};void IR_SendGreeH(void){TIM_SetCompare2(TIM2,50);Delay_us(GreeBitMark);TIM_SetCompare2(TIM2,0);Delay_us(GreeOneSpace);
};void IR_SendGreeL(void){TIM_SetCompare2(TIM2,50);Delay_us(GreeBitMark);TIM_SetCompare2(TIM2,0);Delay_us(GreeZeroSpace);
};void IR_SendMsg(uint8_t cnt,uint8_t data){while(cnt--){if(data&0x01){IR_SendGreeH();data=data>>1;}else{IR_SendGreeL();data=data>>1;}}
};

特别注意校验码的计算,网上有很多公式。下面我给出一种

校验码 = [(模式 – 1) + (温度 – 16) + 5 +左右扫风+换气+节能]取二进制后四位;

 

参考博客

GitHub - crankyoldgit/IRremoteESP8266: Infrared remote library for ESP8266/ESP32: send and receive infrared signals with multiple protocols. Based on: https://github.com/shirriff/Arduino-IRremote/

【智能电表】格力空调遥控器红外协议_格力空调红外协议-CSDN博客

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

[LPC54102]红外编码与解码——GREE格力遥控 - NXP MCU - 电子工程世界-论坛 (eeworld.com.cn)

 

 

 

这篇关于(红外遥控)STM32+红外模块控制格力空调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677568

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置