首页 > 其他分享 >stm32单片机遥控美的空调

stm32单片机遥控美的空调

时间:2024-09-11 20:51:21浏览次数:3  
标签:TIM4 TIM void 美的 stm32 单片机 R05D GPIO Byte

一、硬件清单

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

 

 

标签:TIM4,TIM,void,美的,stm32,单片机,R05D,GPIO,Byte
From: https://blog.csdn.net/m0_67278762/article/details/142091968

相关文章

  • STM32学习笔记——中断
    中断:在主程序运行过程中,出现了特定事件(例如发生已经预知的一些情况),从而转入中断程序中,处理完成后再回到主程序中继续执行。(频繁的中断函数会影响主程序的运行,所以中断函数一边不处理特别复杂的逻辑)EXTI(ExternInterrupt)外部中断支持的触发方式:上升沿/下降沿/双边沿/软件触发支......
  • 超声波 HC-SR04 的使用 CubeMx + STM32F103C8T6 【含两个】
    HC-SR04的使用一、超声波模块介绍二、工作原理介绍三、接线方式四、驱动方式方法一方法二五、程序实现串口查看数据方法一HC_SR04.cHC_SR04.hmain.cmain.h串口数据显示方法二main.cmain.h六、数据处理一、超声波模块介绍HC-SR04是一种常用的超声波测距模块。......
  • vscode+eide配置stm32开发环境
    本博客记录本人使用Vsocde配合eide插件配置stm32的流程,纯小白,个人学习使用(OpenOCD)需要配合keil5使用先根据江科大的stm32视频在keil中配置工程。安装实用工具。打开eide的插件设置。更改这两个目录(此处已更改),即在自己的keil5安装目录下找到对应的文件地址,复制粘贴过......
  • 零基础国产GD32单片机编程入门(十六)DMA详解及ADC-DMA方式采集含源码
    文章目录一.概要二.GD32F103C8T6单片机DMA外设特点三.GD32单片机DMA内部结构图四.DMA各通道请求五.GD32F103C8T6单片机ADC-DMA采集例程六.工程源代码下载七.小结一.概要基本概念:DMA是DirectMemoryAccess的首字母缩写,是一种完全由硬件执行数据交换的工作方式。DM......
  • 基于单片机设计的水平仪(STC589C52+MPU6050)
    一、前言【1】项目背景水平仪是一种常见的测量工具,用于检测物体或设备的水平姿态。在许多应用中,如建筑、制造和航空等领域,保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示,基于单片机设计的水平仪是一个常见的解决方案。数字水平仪是一种用于测量物体相对于水平面的......
  • stm32 I2C通信与MPU6050(软件I2C读写MPU6050)
    理论1.同步时序与异步时序同步时序和异步时序是信号传输和时序控制中的两种基本类型:同步时序:定义:所有信号变化都与一个共同的时钟信号同步。所有的数据传输和处理操作都在时钟信号的边沿触发。优点:时序控制较为简单,易于设计和调试。系统的整体时序一致性高,适用于高精度要......
  • FatFs文件系统的移植---(STM32标准库)
    官网最新版本:http://elm-chan.org/fsw/ff/00index_e.html一、下载最新版本FATFA文件系统在这里不多做介绍了,只展示移植过程和使用方法(结尾有修改好的代码)二、移植代码1.解压文件压缩包里面有两个文件:documents是一些帮助文档,不需要管;source里面是源码,把里面全部的文件复......
  • 最快最简单的使用gcc编译stm32
    在Windows下最快最简单的使用gcc编译stm32在Windows下使用gcc编译stm通常需要许多准备工作minGW(编译c文件)gcc-arm-none-eabi(翻译到arm)make(编译链接的工具)makefile(该项目编译链接的规则)如果想快捷的尝试使用gcc编译编译出软件并运行的话,我推荐一个简单快速的方案......
  • 单片机原理及应用笔记
    单片机原理及应用笔记前言本篇文章是参考《单片机原理及应用(c语言版)第2版》杨居义·编著教材编写的笔记由王兴泽老师指导,马峰、齐詹曦等同学通过完成此篇文章实时更新模块一、单片机概述项目1:单片微型计算机1.单片机内部结构及应用系统(1)单片机内部结构     ......
  • STM32获取温度3种方法
    在STM32微控制器上直接获取CPU温度并不像在一些包含内置温度传感器的高端微处理器(如某些ARMCortex-A处理器)上那样直接。STM32微控制器通常不内置专门的温度传感器。不过,你可以通过几种方法来估算或测量与CPU温度相关的数据。方法一:外部温度传感器添加温度传感器:使用如DS1......