主要内容和基本要求 采用51单片机作为系统的控制芯片,设计一个窗帘升降器,并采用步进电机控制窗帘的升降,控制平稳,精度高。 基本要求:
1.系统设置窗帘升、降变速功能,可设置三种不同的速度,分别为快速、中速、慢速。
2.能够通过键盘设定窗帘上升或者下降的任意定点位置,通过光感应,还能够自动控制选择窗帘的升降,设置有全开、半开、全关三个位置。
3.能够对设置的状态发出语音提示,并用数码管显示电机转速与窗帘位置值,用点阵显示器显示上升“↑”、下降“↓”停止“Ⅱ”三个状态。
4.系统具有手动、红外线遥控、光感自控等功能。
一、 概述
1.1 引言
在我国智能家居也成为近年来一个最热门的话题之一,作为“居室眼睛”的窗户也成为了其中必不可少的一部分,引发了不少研究。
智能家居控制系统的应用让人们在家中能够享受到更安全、更舒适、更方便的生活,并且使生活更具有人性化,而现代家居中,窗户具有良好的装饰、采光和阻挡灰尘空气循环的主要途径,但同时也是盗窃非法进屋的一个重要途径。
虽然现在很多家庭为了防盗通常采用钢筋结构的防盗网加固在窗户外,这样是起到了防盗功能,但一旦发生火灾等紧急情况,窗外的防盗网大大的降低了人们求生或逃生的机会,所以智能窗户的基本要求不能降低。
但是当前大部分窗户控制系统在一定程度上不是很完善,而且没有安防检测功能,在发生意外时只是开窗或关窗,而使用者完全没有发现的意识。
有的产品没有换风系统,如果当一氧化碳或烟雾超标时,不能以最快的速度排出室内的一氧化碳或烟雾;有的产品没有红外感应安防的功能,不能尽快的通知主人可能有小偷进家。
所以“居室眼睛”智能窗户控制系统它能在下雨且家中无人时,自动关闭以防止雨水进入损坏室内财物,室内有害气体超标则自动开窗,有盗贼入内则自动报警,当室内温湿度过高或过低时,自动监测调节环境,使窗户真正的智能起来,就会给人们的居家生活带来诸多方便,从而进一步提高人们的生活质量。
关键词:STC89C52、居室眼睛、定时、1602液晶、遥控、智能
二、市场分析
2.1窗户分析
当前大部分窗户在有烟雾过大时,或者在下雨天有雨水溅入时都要通过手动去开窗或关窗。在空气比较闷热时(超过26°C),不能自动进行开窗以及通风换风,而且现在很多城市(揭阳、清远、韶关、广州,深圳等等)PM 2.5(可入肺颗粒物)季均浓度都超过了国家空气新标准规定的二级限值35微克/立方米,严重危害人体健康,而现在大部分窗户都没有过滤装置,为了提高人们的生活质量,我们可以通过在窗户上的换风装置上装一个PM 2.5过滤器,而且这个过滤器可以手动卸掉,进行定时清洁。现在大多数的窗户系统都没有安防的功能,当有小偷想从窗户进入偷窃,不能及时发现,造成很大的损失,所以在窗户上装红外检测防盗系统,能够及时报警,尽量避免不必要的损失等等。
2.2 市场需求
目前市场上智能家居虽然集成了家居生活有关的设施,但是对于各部分不能做到细致具体的设计,常常忽略了一些必要的功能(如烟雾检测功能、温湿度检测功能、红外检测报警功能、自动换气功能)或者不够人性化。而窗户是智能家居的一个重要的组成部分,因此更好地实现窗户的智能控制和安全防护提升家居安全性、便利性、舒适性、艺术性显得尤为重要。
三、系统设计方案
3.1功能概述
“居室眼睛”智能窗户控制系统分为两部分设计即电子自动控制部分和机械传动部分,电子控制部分使用STC89C52单片机为核CPU,集成多种传感器实现监测控制;机械传动部分设计在窗户上安装步进
电机,实现精确控制窗户和窗帘的开启。
设计实现如下功能:
1.显示温湿度、烟雾值 、亮度值 、系统时间
2.设定湿度、亮度值、烟雾上下限值功能
3.手动、红外遥控自动开|关窗户功能
4.定时开|关窗户功能
5.下雨时通过温湿度传感器窗户自动关窗功能
6.当室内亮度值达到设定值时自动开|关窗户
7.当室内烟雾|可燃气体达到设定值时,窗户自动开启并且报警和启动换风功能
3.1.1设计原理以及组成结构:
智能窗户控制系统使用机械传动控制窗户的开关与窗帘的开合,机械部分由步进电机提供动力,通过设计动滑轮组在运动部件和窗架间进行传动。电子自动控制系统部分包含湿度温度探测传感器模块、光敏电阻传感器模块、烟雾探测传感器模块、红外检测防盗模块、换风控制模块。各传感器将探测到的变化反映到单片机口,由单片机根据信号的变化(即电平的高低)判断外界环境的变化,然后根据内部设定的程序发出命令,控制机械传动部分实现相应的动作。
#include <reg52.h>//库函数
#include <dht11.h> //库函数//如果 实物 打开
#include <adc0832.h> //AD转换库函数
#define uchar unsigned char//宏定意
#define uint unsigned int//宏定意
#define ulong unsigned long //宏定意
sbit rs=P2^0;//LCD 1602 引脚定意
sbit rd=P2^1;//LCD 1602 引脚定意
sbit lcden=P2^2;//LCD 1602 引脚定意
sbit menu=P2^5; //主功能键
sbit add=P2^4;//加键
sbit dec=P2^3;// 减键
sbit open=P2^6;// 手动 开
sbit close=P2^7;// 手动 关
sbit IR=P3^5; //红外感 应
sbit BEEP=P3^1;// 报警
#define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口
uchar dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各种变量标记 正返转标记
uint sudu,dwbrigfl,humfl; //电机速度 //光度下限/湿度标记
uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//时钟变量 正反转 变量
uint adc0,adc1;
uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限湿度// 上限温度
uint hour,minit,secon,DSdat,VAldat ,time;//时钟变量
uint ONhour,ONminit,ONsecon; // 开窗时间变量
uint OFhour,OFminit,OFsecon; // 关窗时间变量
uchar U8T_data_H,U8RH_data_H;
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,没
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
uchar f=0;
uchar Im[4]={0x00,0x00,0x00,0x00}; // 遥控码存储空间
uchar show[2]={0,0}; // 变量申明
ulong m,Tc; // 变量申明
uchar IrOK; // 变量申明
void delay(uint z);// 开窗时间变量
void write_rvalue(); // 显示函数
//**************以下是各种字幕提示语数组************************
uchar code logo1[]= "Welcome to use ";
uchar code logo2[]="window system ";
uchar code logo3[]="S=253T=85oCU=85%";
uchar code logo4[]="Br= 12:00:00 ";
uchar code logo5[]="window open ";
uchar code logo6[]="window close ";
uchar code logo7[]="GWbrig= LUX ";
uchar code logo8[]="UP-Hum= % ";
uchar code logo9[]="Please input... ";
uchar code logo10[]="Please wait... ";
uchar code logo11[]="UP-TEM= oC ";
uchar code logo12[]="SEtime 12:00:00";
uchar code logo13[]="ONtime 12:00:00";
uchar code logo14[]="OFtime 12:00:00";
uchar code logo15[]="UP-SMO= ";
uchar code logo16[]="KWbrig= LUX ";
void delaymoto() //步进电机每一步间延迟函数
{
uint y=sudu;
while(y--);
}
uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步进电机驱动值数组
uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步进电机驱动值数组
xdata num1 [4] = {0x00,0x00,0x00,0x00,};
xdata num2 [4] = {0x00,0x00,0x00,0x00,};
xdata num3 [4] = {0x00,0x00,0x00,0x00,};
xdata num4 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
xdata num5 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
void delaylog(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=500;y>0;y--);
}
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void SETP_MOTOR_FFW() //反转
{
uint i=0;
for(i=0;i<8;i++) //8步一个循环
{
MOTORSTEP=FFW[i]; //取值赋给P1驱动口
delaymoto();
}
}
void SETP_MOTOR_REV() //正转
{
uint i=0;
for(i=0;i<8;i++) //8步一个循环
{
MOTORSTEP=REV[i]; //取值赋给P1驱动口
delaymoto();
}
}
void write_com(uchar com) //LCD 1602 写指令
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}