stm32单片机遥控美的空调

一、硬件清单

1.STM32F103核心板

2.红外发射传感器(38Khz)

3e543511364d4584b16a197f870ed989.png

二、空调遥控原理及应用

空调主机内设有红外接收管,通过红外发射管按照特定协议向空调主机发射信号,即可实现对空调温度、风速、模式等的控制。普通遥控器便是采用这样的方式进行操控。而若将此模块集成于我们的项目当中,再借助上云实现物联网控制空调,便能随时随地操控空调,当你顶着室外40°的太阳回宿舍再推开宿舍门时,空调已经帮你把室内温度降到20°。要是再在次基础上连接米家通过小爱同学遥控空调呢?

三、什么是NEC/R05D协议

 NEC /R05D协议它都属于红外线协议。这些协议的区别主要在于数据帧格式的定义不同,然而其数据传输原理是一致的。我们日常购买的万能遥控器、在淘宝上购入的 mini 遥控器以及电视机、投影仪等设备,绝大多数采用的是 NEC 协议。而我们今天要控制的美的空调使用的是 R05D 协议。不过,只要掌握了一种协议的解析方式,理解了红外线传输的原理,那么其他遥控器协议也都能够被破解并加以运用。

四、R05D协议编码  

1、码位定义

逻辑1:

        29e44a17b2a84221b8ae08204eac031d.png

逻辑0:

            771d5059243443cfbf84cc722f8c6b0d.png

引导码(L):

        c89e952709a240f2b90f587b5d9dafc2.png

分隔码(S):

        f1cc76a85822438b98db54054af71f67.png

其中实际发射需38kHZ载波实现 

载波频率为38KHz,推荐载波占空比为1/3至1/4

例如:

d81e3f3eb61e430180a4004d84dbb293.jpeg

总结:这里是低电平时发送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:

47d52fdd822f4e2085278ebe8527f770.png

        风速(表1):

                   8394a6c4c60f4bbfacb6662f323a325c.png

        

 

数据C:

6342d429e3324e45af26325ff40a9594.png

        温度(表2):

                        952304bc3f2c44f9acae1dc2cd38ba4a.png

        模式(表3):

                a49020c888b54a6b8e6b66e58cce1e78.png

关机为固定编码键值


  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 米内也可以实现遥控。

3f5947d678eb454e83d7857d604f88bf.png

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值