• 大小: 0.13M
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-04-22
  • 语言: C/C++
  • 标签: 控制  手机  远程  系统  

资源简介

格力空调控制系统

1)系统功能介绍

格力空调控制系统采用右侧IAP15F2K61S2单片机作为主控制器,结合实验平台上的OLED、按键、红外、GSMDS18B20以及EEPROM模块进行工作,本系统采用两种方式控制空调,且增设了一种智能调温模式:

第一种方式,GSM控制空调,主要用于远程控制。当夏季或冬季来临时,室内温差变化很大,会对居家的舒适度产生影响。即便人们在外时,也可直接通过GSM模块远程对家中空调进行控制,提前打开,将室温调节到舒适的状态,回到家中便不用再经受等待期,而且发送信息控制模块时,也会收到相应的回执信息,给人提示,更人性化也更方便。

第二种方式,按键控制空调,主要用于室内控制。当人们回到家中,再使用手机控制空调会显得有些不够直接与便捷,因此增设按键控制空调的方式。而按键控制方式比GSM远程控制方式多添加了智能调温的模式,其原理是室温与人体周围的温度有些许差异,因此该模式可根据人身体周围温度,自动改变与设定空调温度,将周围温度迅速调整到人体舒适的状态。

而且这两种方式是相互配合使用的,并不是独立存在的控制方式,因此更显得智能化。具体功能实现方案如下图所示:


图3-88 格力空调控制系统功能实现方案


2)系统硬件设计


图3-89 系统整体硬件电路设计

为了对格力空调控制系统的硬件电路有更加直观的了解,本实验将所有之前介绍过的单独的应用模块电路进行整合,设计出本系统完整的硬件电路,具体单个模块电路功能可再参考之前的实验,这里不作详细介绍。

3)系统软件设计

       本系统的软件设计主要分为三大部分:GSM控制空调、按键控制空调以及主程序实现全部功能,下面分别介绍这三部分具体实现的步骤。

GSM控制空调


图3-90 GSM控制流程图

本部分代码与GSM提高篇实验的串口判断数据方法相同,因此仅列举核心代码串口数据解析函数:

// 短信内容解析

void  ParseGSMData()

{

    if(GetCommand_flag==1){     //如果收到短信控制指令

        GetCommand_flag=0;          //将获取指令标志位清零,避免多次循环,提高效率

        Clear_flag=0;

        if(GSM_Command[1]=='T'){//TOTF则立即判断第二个字母做出动作

            switch(GSM_Command[2])//根据OF,打开或关闭空调

            {

                case    'O':Power_state=1;//电源标志位为1

                        Mode=Read_24c08(0x01);

                        Temp_SET=Read_24c08(0x02);

                        Intelligent_Temp_Flag=0;//由于GSM是远程控制,因此不考虑随身感的情况,所以每次开启空调都会将随身感标志位清零

                if(Mode==1||Mode==3){Mode=1;Mode_SET=Cooling;}//随身感模式是基于制冷制热的自动调节,只需获取其中制冷制热模式相关信息即可

                        else {Mode=2;Mode_SET=Heating;}

                        Power(Power_state); //显示开机

                        SendBack_OK();  //回执OK

                        send(Temp_SET,Mode_SET,Power_state);//打开空调

                        Clear_flag=0;//将清屏标志位开启,以继续开机后的清屏

                        break;

                case    'F':Power_state=2;//关机状态

                        SendBack_OK();

                        send(20,Mode_SET,0);

                        break;

                default:break;

            }

        }

        if(Power_state==1){ //空调确认开机,可对模式与温度进行远程设置

            if(GSM_Command[1]=='M'){//根据M,确定为设置模式,模式1制冷,模式2制热,并发送回执信息

                switch(GSM_Command[5])

                {

                    case    '1':Mode=1;

                            Write_24c08(0x01,Mode);

                            Mode_SET=Cooling;

                            send(Temp_SET,Mode_SET,Power_state);

                            SendBack_OK();

                            break;

                    case    '2':Mode=2;

                            Write_24c08(0x01,Mode);

                            Mode_SET=Heating;

                            send(Temp_SET,Mode_SET,Power_state);

                            SendBack_OK(); 

                            break;

                    default:break;

                }  

            }

            if(GSM_Command[1]=='S'){    //根据S,确定为设置温度,可设置16-30

                Temp_SET=(GSM_Command[4]-'0')*10 (GSM_Command[5]-'0');

                Write_24c08(0x02,Temp_SET);

                send(Temp_SET,Mode_SET,1);

                SendBack_OK();

            }  

        }else//如果空调未打开则发送错误信息

            SendBack_Error();      

    }

}

首先,初始化GSM模块后,串口中断打开,准备接收从手机端发来的有效控制信息。如果单片机判定该信息有效,则进入下一环节,询问空调是否开机,如果没有开机,则回执: ‘The air conditioner is power-off.’,提示用户空调未开机,不可进行有效操作。如果询问结果为,空调已开机,则可以通过相应指令来远程控制空调的模式切换、温度调节以及关机。有效指令格式如下:$TO;用于打开空调,$TF;用于关闭空调,$MODEx用于设置空调模式,MODE1为制冷模式、MODE2为制热模式,$SETxx用于设定空调温度,温度xx范围为1630℃。

②按键控制空调


图3-91 按键控制流程图

本部分代码仅列举核心部分,键值处理以及智能调温模式的算法函数:

switch(KeyValue)         

{

       case 'O': KEY_BEEP();                                    /*开关机按键*/

              Clear_flag=0;

              if(Power_state==1){             //如果当前状态为开机状态,则将空调关机

                     Power_state=2;

                     send(20,Mode_SET,0);

              }else{                                                      //否则打开空调

                     Mode=Read_24c08(0x01);//读取模式与温度

                     Temp_SET=Read_24c08(0x02);

                     if(Mode==1||Mode==3)

                            Mode_SET=Cooling;

                     else

                            Mode_SET=Heating;

                     if(Mode==3||Mode==4) //如果是随身感模式则将随身感标志位置1

                            Intelligent_Temp_Flag=1;

                     else

                            Intelligent_Temp_Flag=0;

                     Power_state=1;

                     Display_Power(Power_state);      

                     send(Temp_SET,Mode_SET,Power_state);

                     Clear_flag=0;                //将清屏标志位开启,以继续开机后的清屏

              }

              break;

       case 'M':  if(Power_state==1){//开机后,制冷制热模式切换                                      

                     Clear_flag=0;

                     KEY_BEEP();

                     Intelligent_Temp_Flag=0;

                     if(Mode_SET==Cooling){

                            Mode=2;

                            Write_24c08(0x01,Mode);

                            Mode_SET=Heating;

                            send(Temp_SET,Mode_SET,Power_state);

                     }else if(Mode_SET==Heating){

                            Mode=1;

                            Write_24c08(0x01,Mode);

                            Mode_SET=Cooling;

                            send(Temp_SET,Mode_SET,Power_state);

                     }

              }                                              

              break;

       case 'T':   if(Power_state==1){             //随身感模式进入与退出

                            Clear_flag=0;

                            KEY_BEEP();

                     if(Intelligent_Temp_Flag==0){

                            Intelligent_Temp_Flag=1;

                            Temp_Control=Temp_SET;         

                    if(Mode_SET==Cooling){    //如果是制冷随身感,则MODE3

                           Mode=3;

                           Write_24c08(0x01,Mode);

                    }else{

                           Mode=4;

                           Write_24c08(0x01,Mode);

                    }                  

                     }else if(Intelligent_Temp_Flag==1){//如果是制热随身感,则MODE4

                            Clear_flag=0;

                            Intelligent_Temp_Flag=0;

                            if(Mode_SET==Cooling){

                                Mode=1;

                                Write_24c08(0x01,Mode);

                            }else{

                                 Mode=2;

                                   Write_24c08(0x01,Mode);

                                   Intelligent_Temp_Flag=0;

                            }

                     }

              }

              break;

       case ' ':   if(Power_state==1){//开机后,增温并保存到EEPROM

                            KEY_BEEP();

                            Temp_SET ;

                            Write_24c08(0x02,Temp_SET);

                            if(Intelligent_Temp_Flag!=1)

                                   send(Temp_SET,Mode_SET,1);

                            }

                     break;

       case '-':    if(Power_state==1){//开机后,降温并保存到EEPROM

                     KEY_BEEP();

                     Temp_SET--;

                     Write_24c08(0x02,Temp_SET);

                     if(Intelligent_Temp_Flag!=1)

                            send(Temp_SET,Mode_SET,1);

                     }

                     break;

       default: break;

}    

/*随身感模式的自动温度控制(调温区间为设定温度的正负三度)*/

void Temp_Adjust()

{

if(Adjust_Flag==1) {

Temp_difference=Temp*0.1-Temp_SET;

       if(Temp_difference>=3)                                                                                                          Temp_Control=Temp_SET-3;

else if(Temp_difference>=2&&Temp_difference<3)                                               Temp_Control=Temp_SET-2;

else if(Temp_difference>=1&&Temp_difference<2)                       Temp_Control=Temp_SET-1;

      else if(Temp_difference<=-1&&Temp_difference>-2)              

Temp_Control=Temp_SET 1;                      

       else if(Temp_difference<=-2&&Temp_difference>-3)               Temp_Control=Temp_SET 2;                                         

       else if(Temp_difference<=-3)                                                                                       Temp_Control=Temp_SET 3;                                        

       else                                                                                                                                Temp_Control=Temp_SET;

       Adjust_Flag=0;

       if(Temp_Control!=Last_Temp_Control){//当前调解温度与上次对比,如相同则不进行调温,如不同,则设定新的温度值

       Last_Temp_Control=Temp_Control;                                       

       send(Temp_Control,Mode_SET,1);     

       }

}

}

首先,初始化定时器T0T1,分别用于检测按键与自动调温。单片机定时扫描按键并读取键值,如果无键按下,则等待;如果有键按下,则判断是否开机,空调已开机则全部按键的功能都可实现,空调未开机则只能实现开机动作。空调开机后,会自动读取上次EEPROM中存储的有关模式和温度的数据,自动设定为上次的状态。相关按键的功能如下:按键‘O’用于空调开关机;

按键‘M’用于设定空调的制冷/制热模式;

按键‘T’用于进入/退出智能调温模式;

按键‘ /-’用于空调增温/降温。

3-16  按键在矩阵键盘位置

1

2

3

模式

4

5

6

智能调温

7

8

9

0

/

C

-

资源截图

代码片段和文件信息

#include “air_conditioner.h“

sbit Irout=P4^4;//控制红外线IO口位定义
unsigned char send_code[67] = {1001001000010000000001000000101001011101000000001000000000000000111 };//有效的67位数据
 void Delay560us() //560us延时
{
uchar i j;
_nop_();
i = 7;
j = 2;
do
{
while (--j);
} while (--i);
}

void Delay4500us() //4.5MS延时
{
uchar i j;

_nop_();
_nop_();
i = 49;
j = 101;
do
{
while (--j);
} while (--i);
}
void Delay20ms() //20ms延时
{
unsigned char i j k;

_nop_();
i = 1;
j = 218;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);

}


void khz_half_T(uint num)//38KHZ载波,占空比为1:2 半个周期13us

uchar i;
   for(;num>0;num--)   

  i = 33;
while (--i);
    Irout=~Irout; //取反
}
}

void send_0(void)    //发送0
{   
   khz_half_T(42);     //560us脉冲     
   Irout=1;    
   Delay560us();  //560us高电平


 void send_1(void)  //发送1 
{   
   khz_half_T(42) ;    //560us脉冲
   Irout=1;    
   Delay560us();    //1125us高电平
   Delay560us();    
   Delay560us(); 


 void send_leadcode(void) //发送引导码 
 { 
   khz_half_T(690) ;   
 Irout=1;      
 Delay4500us(); 
 } 

 void set_1_0(int i uchar one_zore)//对应功能位置1置0
 {
 send_code[i] = one_zore;
 }
 

 void send(uchar temprature uchar mode uchar on_off)  //设定制冷制热与调温,发送全部数据码
{  

char temp = 0;
char mask = 0;
int i_count = 0;

set_1_0(3on_off);//开关机

switch(mode)
{
case 5:set_1_0(21);set_1_0(10);set_1_0(00);break;//制冷
case 2:set_1_0(20);set_1_0(10);set_1_0(01);break;//制热
}
switch(temprature)//温度调节
{
case 16:set_1_0(80);set_1_0(90);set_1_0(100);set_1_0(110);break;
case 17:set_1_0(81);set_1_0(90);set_1_0(100);set_1_0(110);break;
case 18:set_1_0(80);set_1_0(91);set_1_0(100);set_1_0(110);break;
case 19:set_1_0(81);set_1_0(91);set_1_0(100);set_1_0(110);break;
case 20:set_1_0(80);set_1_0(90);set_1_0(101);set_1_0(110);break;
case 21:set_1_0(81);set_1_0(90);set_1_0(101);set_1_0(110);break;
case 22:set_1_0(80);set_1_0(91);set_1_0(101);set_1_0(110);break;
case 23:set_1_0(81);set_1_0(91);set_1_0(101);set_1_0(110);break;
case 24:set_1_0(80);set_1_0(90);set_1_0(100);set_1_0(111);break;
case 25:set_1_0(81);set_1_0(90);set_1_0(100);set_1_0(111);break;
case 26:set_1_0(80);set_1_0(91);set_1_0(100);set_1_0(111);break;
case 27:set_1_0(81);set_1_0(91);set_1_0(100);set_1_0(111);break;
case 28:set_1_0(80);set_1_0(90);set_1_0(101);set_1_0(111);break;
case 29:set_1_0(81);set_1_0(90);set_1_0(101);set_1_0(111);break;
case 30:set_1_0(80);set_1_0(91);set_1_0(101);set_1_0(111);break;
}

temp = mode - 1 + temprature - 16 + 5;//最后四位校验码
mask = temp;
  for (i_count=0; i_count<8; i_count++) //校验码低四位逆序
  { 
temp = (temp << 1) + (mask & 1);
mask >>= 1;
  }
  temp = temp >> 4;
  if(on_off == 0)
{

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3728  2020-05-22 15:43  20、格力空调控制系统\air_conditioner.c

     文件        439  2020-05-22 15:43  20、格力空调控制系统\air_conditioner.h

     文件       5779  2020-05-23 15:02  20、格力空调控制系统\Config.c

     文件        973  2020-05-23 11:49  20、格力空调控制系统\Config.h

     文件       1818  2020-02-14 11:42  20、格力空调控制系统\ds18b20.c

     文件        287  2020-05-22 12:19  20、格力空调控制系统\ds18b20.h

     文件       2083  2020-05-22 12:18  20、格力空调控制系统\EEPROM.c

     文件        332  2020-05-22 12:19  20、格力空调控制系统\EEPROM.h

     文件       7589  2020-05-23 16:36  20、格力空调控制系统\Listings\air_conditioner.lst

     文件      10685  2020-05-23 16:36  20、格力空调控制系统\Listings\Config.lst

     文件       4174  2020-05-23 16:36  20、格力空调控制系统\Listings\ds18b20.lst

     文件       4697  2020-05-23 16:36  20、格力空调控制系统\Listings\EEPROM.lst

     文件       2092  2020-05-22 23:30  20、格力空调控制系统\Listings\key.lst

     文件       3338  2020-05-23 16:36  20、格力空调控制系统\Listings\M_key.lst

     文件      12073  2020-05-23 16:36  20、格力空调控制系统\Listings\oled.lst

     文件      14748  2020-05-25 17:23  20、格力空调控制系统\Listings\template.lst

     文件      71006  2020-05-25 17:23  20、格力空调控制系统\Listings\template.m51

     文件       1371  2020-05-23 16:02  20、格力空调控制系统\M_key.c

     文件        385  2020-05-23 11:24  20、格力空调控制系统\M_key.h

     文件      13343  2020-05-23 16:36  20、格力空调控制系统\objects\air_conditioner.obj

     文件      25527  2020-05-23 16:36  20、格力空调控制系统\objects\Config.obj

     文件      10069  2020-05-23 16:36  20、格力空调控制系统\objects\ds18b20.obj

     文件      11688  2020-05-23 16:36  20、格力空调控制系统\objects\EEPROM.obj

     文件       8373  2020-05-22 23:30  20、格力空调控制系统\objects\key.obj

     文件       9509  2020-05-23 16:36  20、格力空调控制系统\objects\M_key.obj

     文件      22638  2020-05-23 16:36  20、格力空调控制系统\objects\oled.obj

     文件     107095  2020-05-25 17:23  20、格力空调控制系统\objects\template

     文件        996  2020-05-25 17:23  20、格力空调控制系统\objects\template.build_log.htm

     文件      30055  2020-05-25 17:23  20、格力空调控制系统\objects\template.hex

     文件        305  2020-05-25 17:23  20、格力空调控制系统\objects\template.lnp

............此处省略14个文件信息

评论

共有 条评论