基于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的优势性能命令 数据迁移使用场景 冷热集群数据同步、分类存储集群数据整体搬迁 当公司业务迅速的发展,导致的当前的服务器数量资源出现临时紧张的时候&#…...

科普 | 以太坊坎昆升级是什么
坎昆升级是什么 坎昆,是墨西哥一个著名的旅游城市,也是 Devcon 3 大会的举办地,按照以太坊升级命名的规律,以地名命名的升级,是针对以太坊执行层的升级。 之前同样命名的还有柏林升级、伦敦升级和这次的上海升级等。…...

C# 一些知识整理
C#反射和特性 反射Reflection Type 类型 Name NameSpace Assembly GetFields() GetProperties() GetMethods() 特性Attribute Obsolete弃用 Condit…...

SpringBoot复习:(15)Spring容器的核心方法refresh是在哪里被调用的?
在SpringApplication的run方法: refreshContext代码如下: 其中调用的refresh方法代码如下: 其中调用的refresh方法代码如下: 其中调用的fresh方法代码如下: 其中调用了super.refresh();而这个super.refresh()就是…...

Android安卓实战项目(5)---完整的健身APP基于安卓(源码在文末)可用于比赛项目或者作业参考中
Android安卓实战项目(5)—完整的健身APP(源码在文末🐕🐕🐕)可用于比赛项目 一.项目运行介绍 1.大致浏览 【bilibili视频】 https://www.bilibili.com/video/BV1uX4y177iR/? (1&…...

AutoSAR系列讲解(实践篇)11.2-存储处理与Block
目录 一、NVRAM Block NVRAM Block的类型 二、Fee Block 三、Ea Block 四、总结 同通信的PDU一样,存储功能也需要一些特殊的数据结构来存放和管理我们的NV数据(NV data) 一、NVRAM Block NVRAM Block的作用类似于IPDU,但它们两仅仅只是作用上相似,其功能实现是完全…...

K8s总结
K8s 是什么 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的机制…...

3.playbook剧本二
文章目录 playbook二Roles模块roles模式安装LNMP创建nginxfiles目录handlers目录tasks目录templates目录vars目录 创建mysqltasks目录 创建phpfiles目录handlers目录tasks目录templates目录vars目录 创建LNMP剧本文件 playbook二 Roles模块 角色的作用:把playbook…...

【MySQL】视图与用户管理
【MySQL】视图 视图视图概念使用基表与视图的相互影响 用户管理新增用户删除修改密码 用户权限授予权限回收权限 视图 视图概念 视图就是一张虚拟表,其内容由查询定义。与真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&…...

LINUX系统监控工具ATOP的使用
最近在排查嵌入式系统的问题,需要监控各种系统资源的消耗。 ATOP不错,可以实时看,也可以保存成日志,分析历史情况。 直接使用: atop 想写入文件就是: sudo atop -a -w /home/guo/atoplog2.log 2 2的意…...

[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,ba…...