随着互联网、嵌入式与传感器等技术的迅猛发展与普及,使智能化电子产品逐渐涌现在人们的学习、生活及工作中,这些电子产品不仅给人们带来了舒适、便捷,同时使人们更加注重做事的效率。为此在家居环境中提高生活舒适度、智能性以及安全性,使人们可以高效、轻松的完成日常生活中的项事,成为全人类日趋关注的热点。随着人们追求舒适性、便捷性、安全高效的家居体验,使智能家居控制系统作为一种新型的生活方式应运而生,同时这也引发了一个新的研究热点。

摘要

  智能家居控制系统目前已成为现代家居行业的发展趋势,作为一款能够提高人们生活品质,以及能够给人们的居住环境提供便利的产品,越来越受到人们的青睐。目前这一领域存在高成本、高复杂性、标准不统一、服务单一以及产品与人们的需求之间存在着差异等各种各样的问题,文中针对以上存在的问题,设计了一种基于微处理器STM32F103 的智能家居控制系统。文中详细分析、介绍了智能家居控制系统的研究背景、研究意义、研究内容和国内外的研究现状及趋势,同时从经济性、实用便利性、安全稳定性和综合性等角度出发,设计了本文系统的总体架构,它主要由主控节点、终端节点、PC 端和手机移动终端等四部分组成。最后,本文针对智能家居控制系统进行测试与分析。实验测试结果表明:用户在PC 端和手机终端发出的控制命令能够正确的在节点执行,同时该系统具有运行稳定、结构简单、测量精确、灵敏度高、成本低、人机界面直观、使用便利,为智能家居的推广提供了可能。

系统设计方案

  衡量智能家居控制系统设计的好坏主要考虑三个方面:首先系统是否正常运行、设备是否集成度高,其次整个设计是否使用便捷、能够满足实际情况,最后系统涉及的技术是否成熟适用以及各项配置是否经济合理等。这就意味着设计一个成功的智能化产品需要综合考虑诸多方面的因素。
  该系统主要由主控制器、设备控制、客户端和各终端节点组成,其中采用STM32F103作为主控制器,设备控制包括家电控制、温度控制、照明控制等,客户端包括手机移动终端设备和PC机。

系统框图

  系统主要分为下位机软硬件的设计部分和上位机软件设计部分。下位机主控制器STM32F103采集各终端节点上的信息,如温湿度、烟雾浓度、光照强度、气压强度等,各个子模块与主控制器之间通过串口进行数据传输和命令的收发,然后根据对比判断的结果在0.96寸OLED显示屏上面显示出来,一旦检测到报警信号,蜂鸣器将进行报警。上位机主要负责对于采集到的数据进行分析、显示以及下发各种控制指令。系统可通过本地语音控制进行语音交互,实现本地化的智能控制场景的实现。亦可于机智云平台完成各个传感器的阈值设定,完成相关的警报处理。
  智能化家居控制系统的网络控制一般采用有线传输与无线通信两种通信方式。其中有线传输技术发展较成熟、应用较早、行业标准比较完善,主要包括电话线、现场总线和专用总线等,但它布线麻烦、设备扩展性较差、安装和维护成本较高等。无线通信仅利用电磁波信号而不通过线缆,可以在空间中传播的一种通信方式。它主要包括Wi-Fi、蓝牙、ZigBee技术等。其具有布线简单、可移动性、扩展性强、方便快捷、成本低廉等优点,目前智能家居系统中网络控制较多采用无线通信方式。

蓝牙技术(Bluetooth)、Wi-Fi技术及ZigBee技术的对比
无线技术名称 优势 不足
蓝牙技术(Bluetooth) 兼容性较强、普及的范围非常广、安装调试简易、数据传输速度比较快、设备之间实现方便快捷、灵活安全、低成本、低功耗 功耗高、局部通信只能建立在少数设备、信号易干扰不稳定、通信协议较为复杂且芯片成本较高
Wi-Fi技术 传输范围较为广泛、传输的速度较快、技术简单易学、设备应用部署简易 功耗较高
ZigBee技术 低功耗、低成本、短时延、多种组网方式、安全性高、存储量大、工作频段灵活 数据传输距离短

  WIFI,WIFI是目前应用最广泛的无线通信技术,传输距离在100-300M,速率可达300Mbps,功耗10-50mA。
  ZigBee,传输距离50-300M,速率250kbps,功耗5mA,最大特点是可自组网,网络节点数最大可达65000个。
  蓝牙,传输距离2-30M,速率1Mbps,功耗介于ZigBee和WIFI之间。
  这3种无线技术,从传输距离来说,是WIFI>ZigBee>蓝牙;从功耗来说,是WIFI>蓝牙>ZigBee,后两者仅靠电池供电即可; 从传输速率来讲,是WIFI>蓝牙>ZigBee。目前来说,WIFI的优势是应用广泛,已经普及到千家万户;ZigBee的优势是低功耗和自组网;蓝牙的优势组网简单。

电路搭建

  首先,设计了STM32F103C8T6外围电路,包括CPU复位电路、实时时钟及晶振电路等。其次,添加了无线网络通讯以及语音识别的功能,其中无线网络通讯采用ESP8266-01S Wi-Fi模块,语音识别采用LD3320语音识别模块。然后,为整个系统添加一些扩展电路,包括电机控制电路以及串口通讯电路等。电路图以及PCB板的绘制是在AltiumDesigner20.0软件上完成的。

系统电路示意图

系统电路原理图

系统电路PCB图

程序设计

  编写代码所采用Keil MDK µVision5 IDE.
  智能家居控制系统的远程监控界面由机智云APP作为系统软件、通过无线网络连接、各终端节点监控窗口、各界面之间的跳转等组成。智能家居控制系统的远程监控端。
  系统采用星型网络结构进行通信,系统的各个采集单元将采集到的数据传给单片机进行读取、计算,然后单片机将数据推送至OLED显示屏进行显示以及通过ESP8266模块将数据上传至上位机从而实现远程监控数值的目的。
  智能家居控制系统中语音识别程序设计主要包括两部分:模块驱动程序和语音指令程序。其中模块驱动程序主要是对SPI接口的配置,而语音指令程序主要包括是设置语音识别的关键词列表。LD3320芯片在启动ASR(Automatic Speech Recognition,自动语音识别技术)时需提前设置好关键字列表,在语音识别的过程中用户发出的命令需要与关键词条中的条目进匹配,并判断是否能够匹配成功。LD3320语音识别模块最多支持50条关键词,识别关键词的编号不需要连续,用户可以根据需求添加关键词,但需要使用汉语拼音的形式。

关键词列表(部分)
指令编号 关键词条 指令含义
0 “kai qi zhu wo deng” 开启主卧灯
1 “guan bi zhu wo deng” 关闭主卧灯
2 “kai qi ci wo deng” 开启次卧灯
3 “kai qi chu fang deng” 开启厨房灯
4 “kai qi ke ting deng” 开启客厅灯
5 “quan bu kai qi” 全部开启
6 “quan bu guan bi” 全部关闭
7 “cha kan wen shi du” 查看温湿度
8 “cha kan guang du” 查看光度

main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//数据监测
int main(void)
{
u8 t=0;
int key_value; //按键值
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200);
Adc1_Channe_Init(); //ADC初始化
KEY_Init(); //按键引脚初始化
bmp280Init();
while(DHT11_Init());
LED_Init(); //初始化与LED连接的硬件接口
OLED_Init(); //OLED初始化
OLED_Clear(); //OLED清屏
Gizwits_Init();
STMFLASH_Read(FLASH_SAVE_ADDR+10,&A_DHT11_Temp,2); //开机读取温度阈值
STMFLASH_Read(FLASH_SAVE_ADDR+12,&A_DHT11_Hum,2); //开机读取湿度阈值
STMFLASH_Read(FLASH_SAVE_ADDR+14,&A_pre,2); //开机读取气压阈值
STMFLASH_Read(FLASH_SAVE_ADDR+18,&A_gz_value,2); //开机读取光照强度阈值
STMFLASH_Read(FLASH_SAVE_ADDR+20,&A_m2_value,2); //开机读取烟雾阈值
STMFLASH_Read(FLASH_SAVE_ADDR+22,&A_m7_value,2); //开机读取一氧化碳阈值
STMFLASH_Read(FLASH_SAVE_ADDR+24,&A_m135_value,2); //开机读取空气质量阈值
while(1)
{
Get_Data(0);
if(gz_value<=A_gz_value&&mode==0)
{
LED0=0;
curtain_flag=0;
}else if(gz_value>A_gz_value&&mode==0){
LED0=1;
curtain_flag=1;
}
if(last_curtain_flag!=curtain_flag&&mode==0)
{
BUJING_Cotrol(curtain_flag,3,180);
last_curtain_flag = curtain_flag;
}
if(last_curtain_flag!=currentDataPoint.valueCurtain&&mode==1)
{
BUJING_Cotrol(currentDataPoint.valueCurtain,3,270);
curtain_flag = currentDataPoint.valueCurtain;
last_curtain_flag = currentDataPoint.valueCurtain;
}
if(mode==1)
{
LED0=!currentDataPoint.valueLED;
}
if(Pre>=A_pre||m135_value>=A_m135_value||m2_value>=A_m2_value||m7_value>=A_m7_value)
{
BEEP= !BEEP;
}else BEEP = 0;
key_value = KEY_Scan(0);
if(key_value==3)
{
display_contrl++;
}
if(display_contrl%2==0&&t>=10)
{
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(16,0,2);
sprintf((char*)buff,":%2dC",DHT11_Temp);
OLED_ShowString(32,0,buff,16); //显示温度
OLED_ShowCHinese(82,0,2);
sprintf((char*)buff,":%2d%%",DHT11_Hum);
OLED_ShowString(96,0,buff,16);//显示湿度
OLED_ShowCHinese(82,0,2);
OLED_ShowCHinese(0,2,3);
OLED_ShowCHinese(16,2,4);
sprintf((char*)buff,":%2dpa ",Pre);
OLED_ShowString(32,2,buff,16);//显示气压
OLED_ShowCHinese(0,4,5);
OLED_ShowCHinese(16,4,6);
OLED_ShowCHinese(32,4,7);
OLED_ShowCHinese(48,4,8);
sprintf((char*)buff,":%4dppm",gz_value);
OLED_ShowString(64,4,buff,16);//显示光照强度
OLED_ShowCHinese(0,6,9);
OLED_ShowCHinese(16,6,10);
OLED_ShowCHinese(32,6,11);
OLED_ShowCHinese(48,6,12);
sprintf((char*)buff,":%4dppm",m135_value);
OLED_ShowString(64,6,buff,16);//显示空气质量
}else if(display_contrl%2==1&&t>=10)
{
OLED_ShowCHinese(0,0,13);
OLED_ShowCHinese(16,0,14);
OLED_ShowCHinese(32,0,15);
OLED_ShowCHinese(48,0,16);
sprintf((char*)buff,":%4dppm",m2_value);
OLED_ShowString(64,0,buff,16);//显示M2数据
OLED_ShowCHinese(0,2,17);
OLED_ShowCHinese(16,2,18);
OLED_ShowCHinese(32,2,19);
OLED_ShowCHinese(48,2,20);
sprintf((char*)buff,":%4dppm",m7_value);
OLED_ShowString(64,2,buff,16);//显示M7数据
OLED_ShowCHinese(0,4,5);
OLED_ShowCHinese(16,4,6);
OLED_ShowCHinese(32,4,7);
OLED_ShowCHinese(48,4,8);
sprintf((char*)buff,":%4dppm",gz_value);
OLED_ShowString(64,4,buff,16);//显示光照强度
OLED_ShowCHinese(0,6,9);
OLED_ShowCHinese(16,6,10);
OLED_ShowCHinese(32,6,11);
OLED_ShowCHinese(48,6,12);
sprintf((char*)buff,":%4dppm",m135_value);
OLED_ShowString(64,6,buff,16);//显示M135数据
}
userHandle(); //用户数据采集
gizwitsHandle((dataPoint_t *)&currentDataPoint);//机智云协议处理
WIFI_Contection(key_value);//WiFi连接控制
Canshu_Change(key_value);
t++;
delay_ms(100);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//语音助手
#include "sys.h"
void All_Init(void);
void Board_text(unsigned int Code_Val);
int main()
{
All_Init(); //全部初始化
printf("\r\n您请说(^_^)\r\n");
while(1)
{
IWDG_Feed(); //喂狗
LD3320_Subject();//运行LD3320
Board_text(nAsrRes); //LD3320识别到后会运行的程序
}
}
void All_Init(void)
{
NVIC_Configuration(); //设置NVIC中断分组
delay_init(); //延时初始化
uart_init(9600); //串口初始化
LD3320_init(); //LD3320初始化
IWDG_Init(7,625); //看门狗初始化.喂狗8S一次
}
//识别到后会运行的程序
void Board_text(unsigned int Code_Val)
{
if(LD3320_Identified_Flag_bit == LD_ASR_FOUNDOK )
{
LD3320_Identified_Flag_bit=LD_ASR_NONE;
switch(Code_Val) //对结果执行相关操作
{
case CODE_Hello:
printf("你好!");
break;
case CODE_ZWD_ON:
printf("主卧灯已开");
break;
case CODE_ZWD_OFF:
printf("主卧灯已关");
break;
case CODE_CWD_ON:
printf("次卧灯已开");
break;
case CODE_CWD_OFF:
printf("次卧灯已关");
break;
case CODE_CF_ON:
printf("厨房灯已开");
break;
case CODE_CF_OFF:
printf("厨房灯已关");
break;
case CODE_KT_ON:
printf("客厅灯已开");
break;
case CODE_KT_OFF:
printf("客厅灯已关");
break;
case CODE_FC_ON:
printf("风扇已开");
break;
case CODE_FC_OFF:
printf("风扇已关");
break;
case CODE_Self_intr:
break;
case CODE_name:
break;
case CODE_ALL_ON:
printf("全开");
break;
case CODE_ALL_OFF:
printf("全关");
break;
case CODE_GRMS:
printf("单人模式开,普通模式关闭");
break;
case CODE_PTMS:
printf("普通模式开,单人模式关闭");
break;
case CODE_WSDJM:
printf("温湿度");
break;
case CODE_GDJM:
printf("光度");
break;
default:break;
}
}
}

成品

实物模型

视频码上看

元器件清单
器件名称 数量/个
STM32最小系统 2
LD3320语音模块 1
SD卡模块 1
烟雾传感器 1
一氧化碳传感器 1
空气质量传感器 1
光敏电阻传感器 1
OLED显示屏 1
气压传感器 1
温湿度传感器 1
有源蜂鸣器 1
WIFI模块ESP8266 1
LM7805 1
弹簧按键 4
六角自锁按键 2
三极管 2
5V步进电机+驱动板 1
发光二极管 若干
电阻 若干
排针 若干
杜邦线 若干