基于STM32的格力空调红外控制
基于STM32的格力空调红外控制
1.红外线简介
在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。
2.格力空调红外协议学习分析
要实现格力空调红外遥控功能,则首先要了解一下红外协议特性。在红外协议中一般由引导码、数据码、间隔码、重复码等几部分组成。接下来,将通过逻辑分析仪捕获一段格力空调的红外协议数据,实际分析其数据内容。
- 硬件设备:
- STM32开发板
- 红外接收设备
- 逻辑分析仪
- 格力空调遥控器

2.1采集红外信号
通过上图红外接收设备,捕获红外信号,利用逻辑分析仪分析捕获的数据内容。捕获波形如下:

本次主要捕获的是开启空调和关闭空调两个键值数据。接下来则可进行数据分析。
2.波形数据分析
-
引导码

引导码信号:9ms低电平+4.5ms高电平 -
数据0

数据0:0.68ms低电平+0.53ms高电平 -
数据1

数据1:0.68ms低电平+1.6ms高电平 -
分隔码

分隔码:0.68ms低电平+20ms高电平 -
间隔码

间隔码:0.68ms低电平+40ms高电平 -
开空调波形

-
关空调波形

3.输入捕获方式采集红外数据
为了编译后续学习实现空调的开机和关键功能,首先可以通过红外接收头采集实际键值数据,通过定时器输入捕获方式将键值数据进行保存。
本次红外案例红外接收头接入到开发板的PB9引脚,通过定时器4输入捕获进行数据采集。
- 定时器输入捕获配置
/***********************定时器4输入捕获配置***********************
** 没有重映像 完全重映像
**TIM4_CH1 PB6 PD12
**TIM4_CH2 PB7 PD13
**TIM4_CH3 PB8 PD14
**TIM4_CH4 PB9 PD15
**
******************************************************************/void TIM4_Input_Init(u16 psc,u16 arr)//72
{RCC->APB2ENR|=1<<3;//PBGPIOB->CRH&=~(0xF<<1*4);GPIOB->CRH|=0x8<<1*4;/*定时器配置*/RCC->APB1ENR|=1<<2;//TIM4RCC->APB1RSTR|=1<<2;RCC->APB1RSTR&=~(1<<2);TIM4->CNT=0;TIM4->PSC=psc-1;TIM4->ARR=arr;/*配置定时器输入捕获模式*/TIM4->CCMR2|=0x1<<8;//CH4配置为输入,CCR4保存CH4数据TIM4->CCER|=1<<13;//捕获发生在下降沿TIM4->DIER|=1<<4;//开启捕获中断STM32_NVIC_SetPriority(TIM4_IRQn,1,1);//设置优先级TIM4->CCER|=1<<12;//开启CH1输入捕获TIM4->CR1|=1<<0;//开启定时器
}
- 红外数据采集示例
char buff[100];
u8 buff_data=0;
/**************TIM4中断服务函数***************/
void TIM4_IRQHandler(void)
{u16 time;u8 static recv_stat=0;u8 static i=0;if(TIM4->SR&1<<0){}if(TIM4->SR&1<<4)//捕获中断{TIM4->CNT=0;time=TIM4->CCR4;if(TIM4_CH4)//上升沿触发{TIM4->CCER|=1<<13;//下一次捕获下降沿if(recv_stat==0)//开始接收引导码{if(time>=8000 && time<=10000)recv_stat=1;//成功接收9ms低电平else recv_stat=0;}else if(recv_stat==2){//printf("引导码接收成功\r\n");if(time<550 || time>750) recv_stat=0;//650us间隔时间接收失败}}else //下降沿触发{TIM4->CCER&=~(1<<13);//下一次捕获上升沿if(recv_stat==1){if(time>=3500 && time<=5500)recv_stat=2;//引导码接收成功:9ms低+4.5高else recv_stat=0;}else if(recv_stat==2)//开始接收实际数据{if(time>=400 && time<=650)//数据0:650us低+530us高{buff[i++]=0;}else if(time>=1500 && time<=1700)//数据1:650us低+1.6ms高{buff[i++]=1;}else if(time>=18000 && time<=21000){buff[i++]=2;//间隔}else if(time>=38000 && time<=42000){//printf("i=%d\r\n",i);buff_data=i;recv_stat=0;i=0;infrared_flag=3;}else {i=0;recv_stat=0;infrared_data=0;}}}}TIM4->SR=0;//清除标志
}

4.开关机学习示例
- 硬件设备
- STM32开发板
- 红外发送头

4.1 38KHZ载波信号发送
本次使用的红外发射模块工作频率为38KHZ,发送数据高低电平采用1:1方式。发送高电平需要发送38KHZ的方波脉冲信号(高低电平1:1方式),发送第低低电平则直接将引脚拉低即可。
/*****************发送38KHZ载波*********************
**38KHZ载波:1/38000HZ=26us,按照高低电平1:1发送载波
**形参:u32 time --持续时间
**u8 stat --转态(1表示发送,0表示不发送)
*****************************************************/
void Infrared_Send38KHZ(u32 time,u8 stat)
{u32 i=0;if(stat){for(i=0;i<time/13;i++){RED_IE=!RED_IE;DelayUs(13);}}else//发送低电平{RED_IE=0;DelayUs(time);}
}
4.2 开关键值发送函数示例
//格力空调协议数据发送
void Infrared_GreeSendData(u8*data,int cnt)
{/*1.发送9ms低电平*/Infrared_Send38KHZ(9000,1);/*2.发送4.5ms高电平*/Infrared_Send38KHZ(4500,0); u32 i;for(i=0;i<cnt;i++){Infrared_Send38KHZ(650,1);//发送间隔时间,650us的低电平if(data[i]=='1')Infrared_Send38KHZ(1600,0);//数据1else if(data[i]=='0')Infrared_Send38KHZ(530,0);//数据0else if(data[i]=='2')Infrared_Send38KHZ(20000,0);//间隔码}Infrared_Send38KHZ(650,1);//发送间隔时间,650us的低电平Infrared_Send38KHZ(40000,0);//间隔码/*1.发送9ms低电平*/Infrared_Send38KHZ(9000,1);/*2.发送4.5ms高电平*/Infrared_Send38KHZ(4500,0); for(i=0;i<cnt;i++){Infrared_Send38KHZ(650,1);//发送间隔时间,650us的低电平if(data[i]=='1')Infrared_Send38KHZ(1600,0);//数据1else if(data[i]=='0')Infrared_Send38KHZ(530,0);//数据0else if(data[i]=='2')Infrared_Send38KHZ(20000,0);//间隔码}Infrared_Send38KHZ(650,1);//发送间隔时间,650us的低电平
}
相关文章:
基于STM32的格力空调红外控制
基于STM32的格力空调红外控制 1.红外线简介 在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。这种技…...
rust中thiserror怎么使用呢?
thiserror 是一个Rust库,可以帮助你更方便地定义自己的错误类型。它提供了一个类似于 macro_rules 的宏,可以帮助你快速地定义错误类型,并为错误添加上下文信息。下面是一个使用 thiserror 的示例: 首先,在你的Rust项…...
ceph tier和bcache区别
作者:吴业亮 博客:wuyeliang.blog.csdn.net Ceph tier(SSD POOL HDD POOL)不推荐的原因: 数据在两个资源池之间迁移代价太大,存在粒度问题(对象级别),且需要进行write…...
Idea 2023.2 maven 打包时提示 waring 问题解决
Version idea 2023.2 问题 使用 Maven 打包 ,控制台输出 Waring 信息 [WARNING] [WARNING] Plugin validation issues were detected in 7 plugin(s) [WARNING] [WARNING] * org.apache.maven.plugins:maven-dependency-plugin:3.3.0 [WARNING] * org.apache.…...
docker数据持久化
在Docker中若要想实现容器数据的持久化(所谓的数据持久化即数据不随着Container的结束而销毁),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 (1)Volumes:…...
安全防护,保障企业图文档安全的有效方法
随着企业现在数据量的不断增加和数据泄露事件的频发,图文档的安全性成为了企业必须高度关注的问题。传统的纸质文件存储方式已不适应现代企业的需求,而在线图文档管理成为了更加安全可靠的数字化解决方案。那么在在线图文档管理中,如何采取有…...
Open3D (C++) 基于拟合平面的点云地面点提取
目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、原始点云2、提取结果四、相关链接本文由CSDN点云侠原创,原文链接。爬虫网站自重,把自己当个人,爬些不完整的误导别人有意思吗???? 一、算法原理...
【Linux】Kali Linux 渗透安全学习笔记(2) - OneForAll 简单应用
OneForAll (以下简称“OFA”)是一个非常好用的子域收集工具,可以通过一级域名找到旗下的所有层级域名,通过递归的方式我们很容易就能够知道此域名下的所有域名层级结构,对于进一步通过域名推测站点功能起到非常重要的作…...
DAY56:单调栈(二)下一个最大元素Ⅱ(环形数组处理思路)
文章目录 思路写法1完整版环形数组处理:i取模,遍历两遍写法2完整版(环形数组推荐写法)debug测试:逻辑运算符短路特性result数组在栈口取元素,是否会覆盖原有数值? 给定一个循环数组 nums &#…...
kafka简介
kafka是什么? Kafka最初采用Scala语言开发的一个多分区、多副本并且基于ZooKeeper协调的分布式消息系统。目前Kafka已经定位为一个分布式流式处理平台,它的特性有高吞吐、可持久化、可水平扩展、支持流处理。 Apache Kafka是一个分布式的发布-订阅消息系…...
Kafka-消费者组消费流程
消费者向kafka集群发送消费请求,消费者客户端默认每次从kafka集群拉取50M数据,放到缓冲队列中,消费者从缓冲队列中每次拉取500条数据进行消费。...
FFmepg视频解码
1 前言 上一篇文章<FFmpeg下载安装及Windows开发环境设置>介绍了FFmpeg的下载安装及环境配置,本文介绍最简单的FFmpeg视频解码示例。 2 视频解码过程 本文只讨论视频解码。 FFmpeg视频解码的过程比较简单,实际就4步: 打开媒体流获取…...
SpringCloud深入理解 | 生产者、消费者
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! SpringCloud Spring Cloud是一组用于构建分布式系统和微服务架构的开源框架和工具集合。它是在Spring生态系统的基础上构建的,旨在简化开发人员构建分布式…...
web题型
0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功,cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功,cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…...
使用curl和postman调用Azure OpenAI Restful API
使用curl在cmd中调用时,注意:json大括号内的每一个双引号前需要加上\ curl https://xxxopenai.openai.azure.com/openai/deployments/Your_deployid/chat/completions?api-version2023-05-15 -H "Content-Type: application/json" -H "…...
草莓叶病害数据集
1.草莓数据集有两个文件夹 训练集 健康文件夹(2819张) 草莓叶焦病害(3327张) 数据集可以关注最后一行 import numpy as np import os import matplotlib.pyplot as plt import cv2import warnings warnings.filterwarnings(igno…...
安卓音视频多对多级联转发渲染
最近利用自己以前学习和用到的音视频知识和工程技能做了一个android的sdk,实现了本地流媒体ipc rtsp 拉流以及自带mip usb等camera audio节点产生的流媒体通过webrtc sfu的方式进行多对多级联发布共享,网状结构,p2p组网,支持实时渲染以及转推rtmp&#x…...
2023年电赛---运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV
前言 (1)已经有不少同学根据我上一篇博客完成了前三问,恭喜恭喜。有很多同学卡在了第四问。 (2)我说了OpenART mini的代码是可行的。但是他们不会移植到OpenMV上,再次我讲移植之后的代码贴出来。 ÿ…...
SAP CAP篇十二:AppRouter 深入研究
本文目录 本系列文章理解现有程序app文件夹中的package.json理解approuter.js 修改现有程序修改package.json新建index.js在Approuter中显示额外的逻辑 添加一些额外的Logger对应代码及branch 本系列文章 SAP CAP篇一: 快速创建一个Service,基于Java的实现 SAP CAP…...
HDFS中数据迁移的使用场景和考量因素
HDFS中数据迁移的使用场景和考量因素 数据迁移使用场景数据迁移要素考量HDFS分布式拷贝工具-DistCpdistcp的优势性能命令 数据迁移使用场景 冷热集群数据同步、分类存储集群数据整体搬迁 当公司业务迅速的发展,导致的当前的服务器数量资源出现临时紧张的时候&#…...
别再只会用AT指令了!用GD32F103驱动ESP8266实现MQTT连接阿里云(附完整源码)
从AT指令到MQTT协议:GD32F103ESP8266直连阿里云物联网平台实战 在物联网设备开发中,ESP8266作为性价比极高的Wi-Fi模块,常被用于实现设备联网功能。大多数开发者对它的认知停留在AT指令操作层面,通过串口发送简单的AT命令实现TCP连…...
从MATLAB/Python代码实现反推Newmark-β法:理解线性加速度假设如何变成迭代算法
从代码实现反推Newmark-β法:线性加速度假设的工程实践指南 在结构动力学分析中,地震响应、风荷载等时程分析问题常需要求解二阶微分方程。Newmark-β法作为经典数值解法,通过线性加速度假设将连续问题离散化。但教科书往往止步于公式推导&am…...
GG3M贝叶斯决策数学体系:六大核心领域落地应用与差异化壁垒
GG3M贝叶斯决策数学体系:六大核心领域落地应用与差异化壁垒摘要 GG3M的贝叶斯更新与决策数学体系,基于原创“事实层—模型层—元模型层”三层级架构,以系统长期反熵增演化为核心决策标尺,从“智能参数优化”跨越至“智慧框架迭代”…...
从Markdown到可执行规范:Tessl Framework初探与“规范即源代码”的实践思考
从Markdown到可执行规范:Tessl Framework初探与“规范即源代码”的实践思考 当代码行数不再是衡量开发效率的唯一标准,一种全新的编程范式正在悄然兴起。想象一下,开发者不再需要直接编写实现细节,而是专注于用结构化的自然语言描…...
Deep-Live-Cam性能优化指南:从环境配置到实时换脸全流程解决方案
Deep-Live-Cam性能优化指南:从环境配置到实时换脸全流程解决方案 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-Live-…...
实战指南 — 基于TCGA数据的差异表达分析全流程与可视化呈现
1. TCGA数据获取与准备 第一次接触TCGA数据库时,我被它庞大的数据量震撼到了。作为癌症基因组图谱计划,TCGA收录了33种癌症类型、超过2万例患者的基因组数据。对于肝癌(LIHC)研究来说,这里简直就是一座金矿。 进入TCGA官网后,你会…...
零域名部署实战:阿里云ECS与宝塔面板的IP直连建站指南
1. 为什么选择IP直连建站? 很多刚接触服务器部署的朋友可能会疑惑:为什么不用域名直接访问网站?其实IP直连建站特别适合以下几种场景。比如你正在开发一个内部测试项目,需要快速让团队成员查看效果;或者你要给客户演示…...
如何彻底解决ComfyUI ControlNet Aux预处理功能异常的5个专业策略
如何彻底解决ComfyUI ControlNet Aux预处理功能异常的5个专业策略 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet Aux作为ComfyUI的辅…...
Boomer:轻量高效的Linux屏幕放大镜工具
Boomer:轻量高效的Linux屏幕放大镜工具 【免费下载链接】boomer Zoomer application for Linux 项目地址: https://gitcode.com/gh_mirrors/boo/boomer 当你需要精准查看屏幕细节时是否常感到操作繁琐?无论是设计工作中的像素级调整、编程时的代码…...
局域网内Windows时间同步配置
本文详细介绍了如何配置NTP服务器和工作站计算机进行时间同步,包括在服务器上启用NTP服务,调整同步设置,以及在海康威视录像机上的应用。同时提醒注意防火墙配置问题。 一、配置NTP服务器 1、在局域网内找一台时间可靠的计算机或服务器 做为N…...
