格力空调控制系统

(1)系统功能介绍

格力空调控制系统采用右侧IAP15F2K61S2单片机作为主控制器,结合实验平台上的OLED、按键、红外、GSM、DS18B20以及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'){//为TO或TF则立即判断第二个字母做出动作 switch(GSM_Command[2])//根据O或F,打开或关闭空调 { 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范围为16~30℃。

②按键控制空调

图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){ //如果是制冷随身感,则MODE为3 Mode=3; Write_24c08(0x01,Mode); }else{ Mode=4; Write_24c08(0x01,Mode); } }else if(Intelligent_Temp_Flag==1){//如果是制热随身感,则MODE为4 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); } } }

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

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

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

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

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

1 2 3 模式 4 5 6 智能调温 7 8 9 0 开/关 C -

智能调温模式的算法是根据设定温度Temp_SET以及人周围的温度Temp来计算得出的,如果Temp比Temp_SET高或低3℃以上,则调节温度Temp_Control则比Temp_SET低或高3℃,Temp_Control的变化幅值为设定温度Temp_SET的正负3℃,变化单位为1℃。

③主程序实现全部功能

图3-92 主程序功能流程图

本部分代码如下所示:

void main() { OLED_Intial(); //OLED屏初始化 UART_Timer0_Intial(); //定时器与串口初始化 GSM_Intial(); //GSM模块初始化 OLED_ShowString(0,2," GSM is Ready! ");//显示GSM准备好工作了 while(1) { ParseGSMData();//解析短信指令 Key_Scan_Act();//扫描按键并工作 DisPlay_Control(); //显示空调控制的相关信息 } } /*定时器0中断,用于检测按键与显示屏显示 使用两个标志位来分别控制按键的扫描与显示屏的显示,主要是为了降低 显示屏显示程序的运算量大,对按键扫描的实时性造成的干扰。 */ void time0() interrupt 1 //8ms中断 { Control_Flag ; KeyScan_Flag=1; } /*定时器1中断,用于随身感模式中确定自动调控温度的间隔区间*/ void time1() interrupt 3 //50ms中断 { if(Intelligent_Temp_Flag){ Timer1 ; if(Timer1>60) {//随身感模式中3S自动调控一次温度 Timer1=0; Adjust_Flag=1; //自动调温标志位置1 } } }

主程序综合实现全部功能,包含GSM远程控制、按键室内控制以及OELD显示。该综合部分主要难点在于,按键扫描执行的实时性以及OLED显示信息的准确性。

首先,由于按键是利用定时器产生的中断,来进行自动扫描,容易被while(1)循环中大运算量的OLED显示函数干扰,不能做出准确及时的控制,解决本难点的办法是,创建一个显示标志位Control_Flag,利用比扫描按键更长的定时中断来将该位启动,以此定时显示OLED信息,同时确保按键功能的实时性。其次,根据GSM发送来的短信以及按键的功能,OLED需要进行大量的清屏动作,处理不当会造成,OLED显示信息的错误以及频闪,解决该问题的方法是,创建一个清屏标志位Clear_flag,只有当进行有效动作时,才将改位启动,以保证只清一次屏,显示出正确信息。

(4)实验现象

手机远程格力空调控制系统

手机远程格力空调控制系统

手机远程格力空调控制系统

手机远程格力空调控制系统

手机远程格力空调控制系统

图3-93 手机远程调节空调温度

图3-94 按键调节的随身感模式及关机效果

https://v.qq.com/x/page/f3108v0cqpx.html

手机远程格力空调控制系统