通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。
解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。
R05D电控功能说明书:https://wenku.baidu.com/view/c46594141ed9ad51f01df2c3.html
总的来说,编码与时序都跟NEC不一样。 下面1–5点为编码讲解;6–10点为时序讲解
L 10110010 01001101 10111111 01000000 00010000 11101111 S L ...(省略)
L 0xB2 0x4D 0xBF 0x40 0x10 0xEF S L 0xB2 0x4D 0xBF 0x40 0x10 0xEF
发送"1"数据
发送"0"数据
终止符和两个控制波形间隔
很明显,编码与时序都跟NEC不一样,注定通过控制GPIO时序来发送R05D协议的编码
通过示波器分析遥控器发送的红外编码
L引导码后 接收到A=10110010=0xB2 A‘=01001101=0xB7
因此,证实了上面一部分第3点。高位先发,低位后发!!这跟NEC不一样(NEC采用低位先发送),所以普通红外编码发射模块根本不适用!!
由于之前没有对遥控器进行时序分析,所以默认低位先发,结果还是不行,借了一个遥控器,把红外接收管接示波器,才知道出错了。改了时序就能实现了。
由于买的发射模块自带编码,不用NEC编码只能改电路(这里推荐直接买红外发射模块就好了,不带任何编码的那种)
根据原理图,把IRT引出来跟STM32的IO口相接
实物图如下:
直接焊接一条杜邦线,跟STM32相连接
这时候,只需要控制STM32GPIO的输出,就可以控制红外发射的波形,而不需要用到编码芯片了
本人用的是蓝桥杯嵌入式的开发板(stm32f103rbt6),至于其他芯片也几乎大同小异。
由于载波频率为38KHZ,GPIO必须有定时器功能,因为可以输出PWM波形,设置频率38KHZ,控制输出与否就能实现编码时序。
这里选择使用PA1,属于定时器2通道2
通过搞懂协议原理和修改电路并进行连接后,只需要写出对的时序控制代码就能控制空调了!!
由于TIM2的输入时钟为72MHZ,通过分频和自动重装载值的设定,得出PWM的频率为72Mhz / 5(预分频) / 378(计数次数) ≈ 38Khz
void TIM_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PA1引脚设置 */
TIM_TimeBaseStructure.TIM_Period = 378; //72 000khz/378/5 = 38.09khz
TIM_TimeBaseStructure.TIM_Prescaler = 5-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//TIM2预分频设置:72kHZ。APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz
/* Channel 2 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
// TIM_OCInitStructure.TIM_Pulse=500;//设置占空比时间
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能预装载寄存器
//使能TIM2定时计数器
TIM_Cmd(TIM2, ENABLE);
}
通过改变比较计数器,来输出高电平和低电平
接收高电平:对于发送来说就是输出低,比较值为0,占空比0%,红外无输出
接收低电平:对于发送来说就是输出高,比较值为189,占空比50%,红外输出载波
(此发送接收关系与NEC一样,不懂自行百度)
延时用的是嘀嗒定时器
void Lead_Code()
{
TIM_SetCompare2(TIM2,189); //接收器拉低
delay_us(4400);
TIM_SetCompare2(TIM2,0); //接收器拉高
delay_us(4400);
}
void Stop_Code()
{
TIM_SetCompare2(TIM2,189); //接收器拉低
delay_us(540);
TIM_SetCompare2(TIM2,0); //接收器拉高
delay_us(5220);
}
void Send_0_Code()
{
TIM_SetCompare2(TIM2,189); //接收器拉低
delay_us(540);
TIM_SetCompare2(TIM2,0); //接收器拉高
delay_us(540);
}
void Send_1_Code()
{
TIM_SetCompare2(TIM2,189); //接收器拉低
delay_us(540);
TIM_SetCompare2(TIM2,0); //接收器拉高
delay_us(1620);
}
void Send_Byte(u8 data)
{
int i;
for(i=7;i>=0;i--)
{
if(data & (1<<i))
{
Send_1_Code();
}
else
{
Send_0_Code();
}
}
}
void Normal_Code(u8 A, u8 B, u8 C)
{
Lead_Code();
Send_Byte(A);
Send_Byte(~A);
Send_Byte(B);
Send_Byte(~B);
Send_Byte(C);
Send_Byte(~C);
Stop_Code();
Lead_Code();
Send_Byte(A);
Send_Byte(~A);
Send_Byte(B);
Send_Byte(~B);
Send_Byte(C);
Send_Byte(~C);
Stop_Code();
}
void main()
{
初始化函数();
Normal_Code(0xB2, 0x9F, 0x00); //制冷 低风 17
}
至于调控温度,模式,自行根据协议修改发送数值就OK了!
前言一个简单的压缩软件,利用哈夫曼思想,构造哈夫曼编码,实现对文件的二进制压缩,以及解压,再利用MFC制作可视化操作界面,美化软件又简化文件操作。(各个步骤有解释可看)软件主页面先看看哈夫曼树结构构造哈夫曼树存储结构:w权重即每个字节出现频度,byte结点数据即每个字节的ASCII码,fa双亲结点下标,le左孩子下标,ri右孩子下标,从下往上开始构建哈夫曼树。根据已构造完成的哈夫曼树,..._哈夫曼树源加mfc代码
导读窗口函数是数据库查询中的一个经典场景,在解决某些特定问题时甚至是必须的。个人认为,在单纯的数据库查询语句层面【即不考虑DML、SQL调优、索引等进阶】,窗口函数可看作是考察求职者SQL...
在更新Xcode7之后,创建C++类生成的头文件后缀变成了.hpp,并非.h文件。那就说说.hpp和.h文件的区别, hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 ..._xcode c++ 默认hpp
代码:#include<stdio.h>int main(){ int m,n,a,b,c,d,t; scanf("%d", &n); if(n>=10000 && n<=100000) m=5; else if(n>=1000 && n<10000) m=4; else if(..._从键盘读入一个整数,判断该数有多少位,并将每一位上的数字分别打印出来,用逗号分
JS弹出窗口Window.Open详解一、window.open()支持环境:JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+二、基本语法:window.open(pageURL,name,parameters) 其中:pageURL 为子窗口路径 name 为子窗口句柄 parameters 为窗口参数(各参数用逗_js的window.open
0、安装准备如果是局域网,部署的电脑拥有固定ip(下文叫宿主机,切记)。电脑能打开cup的虚拟功能。如果部署到云主机,道理是一样的。环境是win7以上,win10以下。Win10区别就是安装的docker软件不同而已。第一步:确定电脑打开了cpu虚拟打开。https://jingyan.baidu.com/article/22fe7ced3b4c003002617f17.ht..._onlyoffice怎么共同编辑
CentOS6.5系统安装1、首先打开网易开源镜像站: http://mirrors.163.com/&nb..._centos6镜像下载
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。2.type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSet...
自从用了mac,每天都在踩坑!纪念一下mask代码地址:https://github.com/matterport/Mask_RCNNpythonapi地址:https://github.com/philferriere/cocoapi系统运行环境:MAc pro+pycharm 2018+anaconda3+python3.5.6运行demo实现过程,下面是实际操作的步骤,作为记录,避免..._meshcnn数据集下载失败
依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.0</version> </dependency>配置文件修改mybatis-pl_cannot resolve configuration property 'mybatis-plus.global-config.db-config.
一、 经典排序算法:冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序、堆排序1、冒泡排序:a) 比较相邻的两个数,按照要求进行交换(eg.从大到小)b) 从第一个数开始,n个数如上比较一次,放在1的位置c) 从第1个数直到n个数依次一直向后比较,直到比完了,再输出&amp;gt;arr=[] for i in range(9): date=int(input(&quot;请输入数字&quot;)) ar..._输入一个包含若干数据的列表,先将列表中的数由大到小进行排序,然后将值为负数的元素进行平方运算。
一、目录①cd (切换目录). 代表当前目录.. 代表上一层目录- 代表前一个工作目录~ 代表【目前用户身份】所在的自家目录~account 代表 account 这个用户的自家家目录②pwd (显示当前所在的目录)-P :显示出确实的路径,而非使用链接 (link) 路径