这是小编在学校时期做的一个课题,其功能包括门禁功能、人体感应灯功能、GSM远程短信控制家电功能。整个系统的设计是建立在STM32F407开发板上的,并运用了开发板上的触摸屏进行系统显示。其中门禁功能包括了密码开门和指纹开门两个功能,可以修改系统中的密码和指纹。指纹部分采用的是AS608指纹识别模块,使用了官方提供的函数能实现指纹的录入存储,验证,删除。最后的人体感应灯和GSM远程控制部分则是随便做的。该设计的报告现贴出供有需要的人学习参考,不喜勿喷。
智能家居系统设计
目 录
第一章 绪论
1.1选题背景及意义
智能家居系统概念起源于20世纪 70年代的美国科技公司。随后欧洲、日本等国家均应用了此概念,快速发展出了自己的智能家居系统,例如德国的 EIB 系统、新加坡的8X系统等。韩国、日本也借力于自家的家电制造行业以及移动互联网技术构建了宏大的智能家电网络。进入 20 世纪以来,随着互联网技术、物联网技术以及智能终端不断创新、成熟和普及,实现安全可靠的智能家居系统已不再是梦想。我们可以预测到在不久以后的将来,智能家居将成为家居行业的主流。为了顺应时代的发展,更为了满足人们对美好生活的向往,我们理应顺应这个方向,发展出符合我国国情的智能家居控制系统。
为了满足人们对快捷、方便、舒适、智能化的家居生活有越来越多的需求,我们针对这些需求进行智能家居控制系统的设计、改善。首先是门禁部分,提高门禁系统的安全性、便携性。其次是家庭灯光等设备,提高设备控制的便捷性,多样性。最终为人们提供一个舒适、安全、便捷的居住环境。而通过对智能家居系统的研究,能在理论上推动智能化技术在家居领域深入的发展,并为各类智能化家具新产品的设计与开发提供一定的理论依据,产生巨大的经济效益和社会效益。所以,对该课题的研究具有非常重要的意义。
1.2国内外研究现状
1.2.1国外研究现状
智能家居的概念最先出自国外,始于20世纪70年代。世界上第一幢智能建筑在1984年的美国出现,此后其他国家也先后效仿,如加拿大、澳大利亚以及其他东南亚等经济技术比较发达的国家,先后也提出了各种智能家居的解决方案。例如德国的EIB系统、新加坡的8X系统等。韩国、日本也借力于自家的家电制造行业以及移动互联网技术构建了宏大的智能家电网络。进入21世纪后,通信技术和物联网技术快速发展,给智能家居的发展提供了很好的平台。例如 GPRS、4G、WiFi、蓝牙以及ZigBee等通讯技术的出现,使得智能家居更加人性化、智能化和便捷化。通信技术的不断进步为智能家居提供了更加广泛的前景。但到目前,市面上的智能家居行业都还没有形成统一的行业标准,而且产品的种类繁多,很多技术上的问题也都有待进一步解决,这也使现在人们迫切追求一种完善的符合人性的智能家居系统,来满足人们的生活需求。
1.2.2国内研究现状
智能家居在国内相比国外起步较晚,但发展得却非常迅速。一开始由于技术不够成熟以及研究经费太高,所以需要向国外购买设备及技术,成本较高,难以实现大规模推广使用。而且人们的接受意愿也不高,使得产品的整体销量并不好,也没有多少企业加入研发。而随着近几年技术的发展,我国开始对物联网技术自主研究,在吸收、借鉴国外先进技术的基础上,我国物联网技术以及传感器技术得到了快速发展,智能家居产品逐渐增加。此外,人们的生活水平也逐年提高,逐渐接受了智能家居给生活带来的便利和乐趣,越来越多的人用上了智能家居,使得该行业在这几年有了飞速增长。这让越来越多的企业看到了其中巨大的经济利益,纷纷加入到该领域中来,使得发展智能化家居成了历史发展的必然趋势。未来,我们的智能家居系统也将全面升级,实现全屋智能化,向更高的性能、更高的控制精确度、向更低的功耗、向更加实惠的价格发展,在未来的日子里大放光彩。
1.3本文研究内容
本次智能家居系统主要以stm32F407系列单片机作为主控芯片,实现功能有:家居系统中的门禁功能来保证用户安全(如密码输入、指纹输入);通过传感器模块实现家居环境中人体自动识别,并用来控制灯光部分的开、关以及延时功能;通过手机远程向GSM模块发送短信,并识别短信的内容,根据器内容实现对家庭电器、窗帘、照明的本地或远程控制。
1.4实际应用价值
门锁部分在我看来是每一个家庭实现家居智能化的第一步,也是最重要的一环,涉及家居生活的安全性。传统的机械门锁出门都需要带上一条小小的钥匙,极其容易遗失,钥匙多了又很沉重。反观智能门锁不需要携带钥匙,并且有多种解锁方式,相比机械门锁更安全、更智能、更人性化。
灯光部分在一个家庭生活中也起着非常重要的作用。老式灯光只能通过墙上的固定开关控制,极其不方便,灯的功能单一的同时开关也容易按坏,给人的体验极其不佳。现代化的智能灯光系统则能摈弃这些缺点,它常常带有人体感应功能、远程控制功能、灯光效果设置灯功能。既没有了老式灯的烦恼,又给人的家居生活提供温馨的生活氛围,是一种非常不错的生活体验。
智能家居系统同时也离不开远程控制功能。传统的家居控制方式不足之处在于其应用范围只能在家庭内部控制家电设备,而远程控制系统则扩展了其的应用范围,并且具有可靠性高、安全性强、响应快速等先天性优势,真正让家居的控制实现走出家门。智能家居系统以无线的方式,通过手机等通讯设备,人们可以随心所欲地控制家电设备,以及监视家里的情况,极大的便捷了我们的生活。在实现家居操控的问题上,无线远程操控已成为必然的发展趋势。客观地说,正是因为有了远程控制系统,才让智能家居真正变得方便、自由、舒适。
第二章 门禁功能
2.1密码部分
2.1.1密码输入
该密码部分采用4x4密码按键模块输入。硬件电路如图所示:
4x4矩阵按键原理图:
4x4矩阵按键模块共有8个引脚,自上向下排列,上面四个为列分别为列4、列3、列2、列1,分别连接PF7、PF6、PF5、PF4,下面四个分别为行1、行2、行3、行4,分别连接PF0、PF1、PF2、PF3。将每列都设置成上拉输入模式,每行都设置成推挽输出模式,并且一开始行输出都为低电平。
将第一行变为低电平,其余行为高电平。然后读取列的电平变化,判断某一列是否按下。第一列被按下则PF4被拉低,返回数值1;第二列被按下则PF5被拉低,返回数值2;第三列被按下则PF6被拉低,返回数值3;第四列被按下则PF7被拉低,返回数值4。若没有检测到按下则执行检测下一行的程序。
同理,检测第二行,第三行第四行。当所有程序都执行一遍若还没有检测到按键继续执行下一遍按键扫描。这样就能准确的知道哪个按键被按下,然后根据返回的数值来设置具体按键实现的功能。
密码按键界面设计:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
显示 |
|
删除 |
清除 |
确定 |
2.1.2密码主程序设计
该密码系统设计为有两个6位数字密码,可以进入系统后选择修改密码。首先,系统会不断扫描是否有按键输入。当检测到密码输入时,会将输入的数值保存在一个字符串中,并显示“*”来防止偷窥,可以通过“显示”按键来显示或隐藏密码。密码最多输入6位,输入完成后按确认键,系统就会将字符串的密码一位位地和系统保存的密码进行比较,当存在不同时,系统会显示“密码错误”并清空输入的密码。输入密码正确则跳转进入系统的主界面。
流程图如图所示:
程序实现:
int password(void)
{
int key_num=0,i=0,satus=0;
u16 num=0,num1=0,num2=0;
u8 pwd[7]=" ";
u8 hidepwd[7]=" ";
while(1)
{
key_num=Button4_4_Scan();
if(key_num)
{
if(key_num>=1 && key_num<10 && i>=0 && i<6){ //按键0-9
pwd[i]=key_num+0x30;
hidepwd[i]='*';
i++;
}
if(key_num==10 && i>=0 && i<6){ //按键“0”
pwd[i]=0x30;
hidepwd[i]='*';
i++;
}
if(key_num==12){//显示
satus=!satus;
}
if(key_num==13 && i>0){//删除
pwd[--i]=' ';
hidepwd[i]=' ';
}
if(key_num==14){//清空
while(i--){
pwd[i]=' ';
hidepwd[i]=' ';
}
i=0;
}
if(key_num==15){//返回
return -1;
}
if(key_num==16)break; //确定
}
if(satus==0) LCD_ShowString(95,95,100,16,16,hidepwd);
else LCD_ShowString(95,95,100,16,16,pwd);
}
for(i=0; i<10; i++)
{
if(pwd[i]==Pwd[num])
{ num++; }
else{ num=0;break; }
if(num==6)
{ break; }
}
for(i=0; i<10; i++)
{
if(pwd[i]==Pwd1[num1])
{ num1++; }
else{ num1=0;break; }
if(num1==6)
{ break; }
}
for(i=0; i<10; i++)
{
if(pwd[i]==Pwd2[num2])
{ num2++;}
else { num2=0; break; }
if(num2==6)
{ break;}
}
if(num==6 | num1==6 | num2==6){
Show_Str(88,225,100,16,"密码正确",16,0);
vTaskDelay(1500);
LCD_Fill(95,95,195,111,WHITE);
LCD_Fill(88,225,188,241,WHITE);
return 0;
}
else {
Show_Str(88,225,100,16,"密码错误",16,0);
vTaskDelay(1500);
LCD_Fill(95,95,195,111,WHITE);
LCD_Fill(88,225,188,241,WHITE);
return -1;
}
}