一、硬件清单
1.STM32F103核心板
2.红外发射传感器(38Khz)
二、空调遥控原理及应用
空调主机内设有红外接收管,通过红外发射管按照特定协议向空调主机发射信号,即可实现对空调温度、风速、模式等的控制。普通遥控器便是采用这样的方式进行操控。而若将此模块集成于我们的项目当中,再借助上云实现物联网控制空调,便能随时随地操控空调,当你顶着室外40°的太阳回宿舍再推开宿舍门时,空调已经帮你把室内温度降到20°。要是再在次基础上连接米家通过小爱同学遥控空调呢?
三、什么是NEC/R05D协议
NEC /R05D协议它都属于红外线协议。这些协议的区别主要在于数据帧格式的定义不同,然而其数据传输原理是一致的。我们日常购买的万能遥控器、在淘宝上购入的 mini 遥控器以及电视机、投影仪等设备,绝大多数采用的是 NEC 协议。而我们今天要控制的美的空调使用的是 R05D 协议。不过,只要掌握了一种协议的解析方式,理解了红外线传输的原理,那么其他遥控器协议也都能够被破解并加以运用。
四、R05D协议编码
1、码位定义
逻辑1:
逻辑0:
引导码(L):
分隔码(S):
其中实际发射需38kHZ载波实现
载波频率为38KHz,推荐载波占空比为1/3至1/4。
例如:
总结:这里是低电平时发送38khz载波,原高电平则发送低电平。(引导码与分隔码同理)
2、编码规范
L,A,A’,B,B’,C,C’, S, L,A,A’,B,B’,C,C’
第一帧与第二帧相同(L,A,A’,B,B’,C,C与L,A,A’,B,B’,C,C’)
L为引导码
S为分隔码
A为认别码(A=10110010,预留方案时A=10110111)
A’为A的反码(01001101)
B’为B的反码
C’为C的反码
B、C码都是8个位的码,里面储存着风速、模式、温度、关机(关机命令固定 B=0111 1011 , C=1110 0000(无定时信息情况))命令
数据B:
风速(表1):
数据C:
温度(表2):
模式(表3):
关机为固定编码键值
A=1011 0010 --0xB2
B=0111 1011 --0x7B
C=1110 0000 --0xE0
例如:中速风,制冷,24摄氏度的编码
A = 1011 0010 (0xB2)
B = 0101 1111 (0x5F)
C = 0100 0000 (0x40)
五、程序编写
1、PWM配置(38Khz )
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
///PB7
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形 GPIOB.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = arr; ///379-1
TIM_TimeBaseStructure.TIM_Prescaler =psc; //5-1
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
2、R05D协议载波
#define ARR 126
void Write_Code_1(void) ///R05D协议 写逻辑1
{
TIM_SetCompare2(TIM4,ARR); //占空比1/3
delay_us(540); ///载波0.54ms
TIM_SetCompare2(TIM4,0);
delay_us(1620); ///低电平1.62ms
}
void Write_Code_0(void) ///R05D协议 写逻辑0
{
TIM_SetCompare2(TIM4,ARR);
delay_us(540);
TIM_SetCompare2(TIM4,0);
delay_us(540);
}
void Write_Code_L(void) ///R05D协议 写引导码(L)
{
TIM_SetCompare2(TIM4,ARR);
delay_us(4400);
TIM_SetCompare2(TIM4,0);
delay_us(4400);
}
void Write_Code_S(void) ///R05D协议 写分隔码(S)
{
TIM_SetCompare2(TIM4,ARR);
delay_us(540);
TIM_SetCompare2(TIM4,0);
delay_us(5220);
}
3、发送单字节(由高到低)
void Send_Byte(u8 Data)
{
int i;
for(i=7;i>=0;i--) //先发高位数据
{
if(Data & (1<<i))
{
Write_Code_1();
}
else
{
Write_Code_0();
}
}
}
4、发送R05D数据包
void SEND_R05D(u8 A,u8 B,u8 C)
{
Write_Code_L();
Send_Byte(A);
Send_Byte(~A);
Send_Byte(B);
Send_Byte(~B);
Send_Byte(C);
Send_Byte(~C);
Write_Code_S();
Write_Code_L();
Send_Byte(A);
Send_Byte(~A);
Send_Byte(B);
Send_Byte(~B);
Send_Byte(C);
Send_Byte(~C);
Write_Code_S();
}
5、关闭空调
#define OFF_B 0x7B ///0111 1011
#define OFF_C 0xE0 ///1110 0000
#define Data_A 0xB2
void R05D_CLOSE(void)
{
SEND_R05D(Data_A,OFF_B,OFF_C);
}
6、对此再次封装(输入编码即可遥控)
typedef enum
{
T_17 = 0x00,///0000
T_18 = 0x10,///0001
T_19 = 0x30,///0011
T_20 = 0x20,///0010
T_21 = 0x60,///0110
T_22 = 0x70,///0111
T_23 = 0x50,///0101
T_24 = 0x40,///0100
T_25 = 0xC0,///1100
T_26 = 0xD0,///1101
T_27 = 0x90,///1001
T_28 = 0x80,///1000
T_29 = 0xA0,///1010
T_30 = 0xB0,///1011
T_Defalut = 0xE0///1110
}T;
typedef enum
{
AUTO = 0x08, ///自动
COOL = 0x00, ///制冷
WET = 0x04, ///抽湿
HOT = 0x0C, ///制热
WIND = 0xE4 ///送风 ///送风需要同时把温度设置1110 否着是抽湿模式
}M;
typedef enum
{
AUTO_SPEED = 0xA0, //101 自动风 制冷/制热模式的经济运行风量应该为自动风
LOW_SPEED = 0x80, //100
MEDIUM_SPEED = 0x40,//010
HIGH_SPEED = 0x20, //001
FIXED_SPPED = 0x00 //000 固定风 抽湿/自动模式的经济运行风量应该为固定风
}S;
u8 Table_TEMP[14] = {T_17,T_18,T_19,T_20,T_21,T_22,T_23,T_24,T_25,T_26,T_27,
T_28,T_29,T_30};
u8 Table_Mode[5] = {AUTO,HOT,COOL,WET,WIND};
u8 Table_Speed[5] = { LOW_SPEED,MEDIUM_SPEED,HIGH_SPEED,
AUTO_SPEED,FIXED_SPPED};
///_T 17-30 : 17-30摄氏度
///_S 0-4 低/中/高/自动
///_M 0-2 自动/热/冷
void NEC_SET_DATA(u8 _T , u8 _S , u8 _M)
{
u8 Data_B = 0x1F , Data_C = 0x00;
Data_B |= Table_Speed[_S];//风速
if(Table_Mode[_M] == 0xE4) ///送风模式
Data_C |= Table_Mode[_M]; ///模式
else
Data_C |= (Table_TEMP[_T-17] + Table_Mode[_M]);
SEND_R05D(Data_A,Data_B,Data_C);
}
六、硬件设计
使用购买的红外发射模块发送功率太低、遥控距离太短,往往需要靠近空调才能实现遥控。
有解决方案嘛?现在推出配套超级红外发射模块,由十个红外发射管组成,可根据所需的功耗、距离选择焊接。经测试,满配发射管可以遥控15米内的空调,甚至在空调背后 3 米内也可以实现遥控。
标签:TIM4,TIM,void,美的,stm32,单片机,R05D,GPIO,Byte From: https://blog.csdn.net/m0_67278762/article/details/142091968