基于51单片机的多功能智能窗制作
湖北理工学院
电子技术协会
费 晨
何 成 前
智能家居是近年来比较火的话题,初接触的单片机的小白想用一些简单的传感器经51单片机处理后做出相应的警报或 实时显示环境参数的。预期能满足以下功能:
1)当检测到雨水时,能关闭窗户(电机转动)
2)当检测到烟雾有毒气体并超过一定标准时,窗户会强制开启,另外一旁的排气扇(小电机代替即可)会工作,以此同时,蜂鸣器会报警,灯光闪烁。
3)当窗户外边有人驻留时 会通过热释探头检测到红外热源,窗户自动关闭并报警 。
4)当温度、湿度超过或低于某一标准时,能及时开启或关闭窗户,当然这一动作是以外界没有下雨和有盗情为前提的
5)可人性化通过按键开启关闭窗户
刚接触电路知识,就在网上借鉴了些电路,下面来介绍下各个功能电路模块
继电器模块的作用是控制电机的运转,单片机传输信号于继电器模块。继电器上的电源接口位于右侧,用杜邦线与电源相连,可接入电压12V--20V,四个2P接线柱为其开关,每个开关皆为独立模块。每个接口设定为NO,A/B,NC,在断开情况与NO接通,闭合情况下A/B与NC接通。
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
此模块的核心为MQ-2烟雾传感器,其工作原理是使用在清洁空气中导电率较低的二氧化锡(SnO2)作为气敏材料,其导电率与空气中可燃性气体或烟雾的浓度成正比。当测量浓度大于设计浓度时,当输出低电平。此时灯亮,蜂鸣器响起,以起警报作用。经测量,发现使用烟雾作为触发报警媒介的效果要比使用液化器等可燃性气体的效果更好。为了能将采集到的模拟信号转化为数字信号,采用了ADC0832芯片 ,此芯片为分辨率为8,拥有两个通道,这里只需要用一个就足够了。芯片模拟电压输入在0V-5V之间,芯片转化时间极短,稳定性强。
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
ADC0832与单片机接口电路 烟雾感应模块(实物)
设计加入雨滴传感器模块是为了防止无人在家时,由于下雨且窗户未关,因而造成雨水进入室内损坏室内物品的情况发生。此雨滴传感器比较器输出,信号干净,波形好,驱动力强,过15MA,工作电压在3.3V-5V。传感器直接接在最小系统板串口上,感应板上没有水滴时,DO输出为高电平,警报灯熄灭;感应板上有水滴时,DO输出为低电平,警报灯亮起。单片机传送信号至继电器模块,开关闭合通电,电机转动,使窗户闭合。这里直接用现有的模块,且我们只用判断是否下雨,所以直接将数字信号接到到单片机上判断高低电平即可。
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
入室偷盗抢劫事件一直是人们心中挥之不去的梦魇,本设计的人体感应模块可有效感应在窗前逗留的人,继而引发警报,起到防盗效果。HC-SR501人体红外感应模块电平输出在0V-3.3V之间,最长延迟时间有18秒,感应范围大,其感应温度在-15度-70度之间。当有人进入感应范围内输入高电平,警报灯亮,蜂鸣器响起,当人离开时则输入低电平。而且在HC-SR501人体红外感应模块延迟时间内,若有人在其探测范围类持续活动时,也将持续输入高电平,直至探测目标离开为止。
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
HC-SR501人体红外感应器电路原理图 人体感应模块实物图
DHT11温湿度传感器是采用数字信号传输,供电范围在3.3V-5.5V之间,湿度测量范围在5%-95%,温度测量范围在-20度-60度。相对湿度和温度在测量后,将数据传送并直接显示在LCD显示屏上,我们将LCD显示屏置于最小系统板上,方便观看所显示的数值。
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image016.gif
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image018.gif 将蜂鸣器与指示灯令置于一个模块上,可在此直接观察到各主要模块的反应,不同指示灯所对应的模块如下:
当烟雾感应模块与人体感应模块工作时,蜂鸣器响起,发出警
file:///C:/Users/Dell/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg 蜂鸣器电路原理图 指示灯(警报)电路原理图 实物图系统硬件选择与设计
因为单个弄一个模块方便调试,但最后得用杜邦线连起来,容易导致不稳定。
再来看看程序吧
将下列的函数文件放在一个单独的文件夹里,每个功能模块以及单片机系统要用到的中断等功能都要对应着一个c文件和h头文件。
https://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=MzczMjEyfGFmOGQ1ZTU2ZmUyMzdmNTkxYjk2M2EzZjNjODgzZWY0fDE3MzgzNTE2MTg%3D&request=yes&_f=.jpgattach://373212.jpg
MAIN文件夹放控制和主函数文件
TIMER里面是放一个定时器中断和延时函数
FUNCTION里是个部分功能的c文件与h头文件
首先adc0832文件用于让芯片采集到的数据传给单片机,由于芯片有两个通道可供选择输入,因此在c文件里面用了两个对应函数,但只有烟雾一个模块需要采集数据,所以在引用接受数据函数时应选择实际硬件连接的端口所对应的传输函数。然后是dht11温湿度模块文件。由于仅仅是传感器,就需要一个温湿度读取子程序,最后还有个校验,判断传感器是否响应,若响应,则开始传输数据
再是eeprom文件,本设计可以设置温度预定上下限和记住是否处于布防状态,应用eeprom函数可将这些信息储存在单片机里,下次上电这些数据不会丢失,这样就避免了实际生活中停电造成的麻烦。
还有一个key文件,编写的key函数是辨别本系统中的6个按键操作从而实现不同效果,举个例子,有3个键分别是设置、加、减 按设置的次数可以决定设置温度或湿度的上下限值,然后根据实际情况按加减健加减温度预定值。
最后一个是lcd文件,实现了对温湿度和烟雾浓度的显示。
MAIN里是控制函数和主函数,将整个功能函数包括起来,然后运行。显得比较简洁明了。
这里先展示主函数 程序功底不好 ,所以主函数仍然比较繁琐
#include
#include
#include
#include
#include "control.h"
#include "timer.h"
#include "adc0832.h"
#include "dht11.h"
#include "eeprom.h"
#include "key.h"
#include "lcd1602.h"
int main(void)
{
unsigned int testnum;
EA = 0;
Timer0_Init(); //定时器0初始化
EA = 1;
RW=0;
L1602_init();
write_1602com(0x85);
write_1602dat(0xdf);
write_1602com(0x80);
write_1602dat('T');
display();
init_eeprom();
read_eeprom();
write_1602com(0x80);
write_string("Te: C Hu: % ");
write_1602com(0xc0);
if(bufang==1)
write_string("Sg: mg/m3 B");
else
write_string("Sg: mg/m3 ");
while(mode1)
{
// K=1;
while(mo == 0)
{
mode1=0;
mode2=1;
}
if (FlagStartRH == 1) //温湿度转换标志检查
{
TR0 = 0;
testnum = RH();
FlagStartRH = 0;
TR0 = 1;
humidity = U8RH_data_H; //读出温湿度,只取整数部分
temperature = U8T_data_H;
if(temperature>=TH)//超过30°时开窗
{//LED2=0;
while(key3!=0) //开窗
{
n1=1;
n2=0;
while(key3!=0);
n1=1;
n2=1;
}
}
else
{LED2=1;BJ_LED2=1;}
if(temperature<=TL)
{LED2=0;BJ_LED2=0;}
else
{LED2=1;BJ_LED2=1;}
if(humidity>=HH)
{//LED4=0;
;
}
else
{//LED4=1;
;
}
if(humidity<=HL)
{//LED5=0;
;
}
else
{
;
}
}
convdata(adc0832(0));
smog=(dis[1]*100+dis[2]*10+dis[3]+1)*10/250;
if(flag==0)
display();
KEY();
if(smog>=SM) // 烟雾超标,开窗,排气,报警
{
LED1=0;BJ_LED1=0;
n1=1;
n2=0;
alarm=0;
FS=0;
while(key3!=0);
n1=1;
n2=1;
alarm=1;
FS=1;
}
else
{LED1=1;BJ_LED1=1;}
if(K4==0&&bufang==1) //有人驻留,关窗,报警
{ LED3=0;
n1=1;
n2=0;
alarm=0;
while(key4!=0);
n1=1;
n2=1;
alarm=1;
}
else
if(count==0||count==2000)
{LED3=1;}
if(BJ_LED1==0||BJ_LED2==0||BJ_LED3==0||(BJ_LED1==0&&bufang==1))
Onealarm();
else
alarm=1;
n1=1;
n2=1;
FS=1;
while((key3!=0)&&(key1==0)) //key1手动开 key3为限位开关
{
n1=1;
n2=0;
}
while((key4!=0)&&(key2==0)) //key2手动关 key4为限位开关
{
n1=0;
n2=1;
}
}
while(mode2)
{
while (mo == 0)
{
mode1=1;
mode2=0;
}
if (FlagStartRH == 1) //温湿度转换标志检查
{
TR0 = 0;
testnum = RH();
FlagStartRH = 0;
TR0 = 1;
humidity = U8RH_data_H; //读出温湿度,只取整数部分
temperature = U8T_data_H;
if(temperature>=TH)//超过30°时开窗
{LED2=0;BJ_LED2=0;
while((key3!=0)&&(yushui!=0)) //没有雨时开窗
{
n1=1;
n2=0;
if(key3==0)
{
n1=1;
n2=1;
}
}
}
else
{
LED2=1;BJ_LED2=1;
n1=1;
n2=1;
}
if(temperature<=TL)
{LED2=0;BJ_LED2=0;}
else
{LED2=1;BJ_LED2=1;}
if(humidity>=HH)
{
;
}
else
{
;
}
if(humidity<=HL)
{
;
}
else
{
;
}
}
convdata(adc0832(0));
smog=(dis[1]*100+dis[2]*10+dis[3]+1)*10/250;
if(flag==0)
display();
KEY();
if((smog>=SM)&&(K1!=0)) // 烟雾超标,开窗同时风扇转及报警
{LED1=0;BJ_LED1=0;
n1=1;
n2=0;
alarm=0;
FS=0;
while(key4!=0);
n1=1;
n2=1;
alarm=1;
FS=1;
}
else
{LED1=1;BJ_LED1=1;}
if(K4==0&&bufang==1) //有人驻留,关窗,报警
{
n1=0;
n2=1;
alarm=0;
while(key4!=0);
n1=1;
n2=1;
alarm=1;
}
else
if(count==0||count==2000)
{
;
}
if(BJ_LED1==0||BJ_LED2==0||BJ_LED3==0||(BJ_LED1==0&&bufang==1))
Onealarm();
else
alarm=1;
n1=1;n2=1;FS=1;
while((key4!=0)&&(yushui==0)) //有雨 关窗
{
n1=0;
n2=1;
}
while((key3!=0)&&(key1==0)) //手动开
{
n1=1;
n2=0;
}
while((key4!=0)&&(key2==0)) //手动关
{
n1=0;
n2=1;
}
}
return 0
我们只做到显示温度 湿度 烟雾浓度(烟雾需要甲烷等气体)显示 当这些指标不在设置标准范围时会报警 灯亮 另外雨水传感 红外热释防盗模块也能正常传输信号,但电机驱动模块有些故障,其实可直接换用 L298N电机模块就可以了,从一开始我们用的是借鉴而来的继电器驱动电路,虽然碰了一鼻子灰还是没弄好
,但好歹摸索出了一些电路知识。
心得
本作品本作品主要通过TELESKY雨滴传感器;人体红外线热式传感器;MQ2烟雾传感器;DHT11温湿度传感器组合实现其功能。当各个传感器发生变化时,单片机根据相应的变化去执行相应的命令,通过蜂鸣器或指示灯给予提示,去控制窗户的开与关。
完成作品所需成本较小,采用人们最常见的C语言编程,51单片机控制,极为方便。实现成品可能性较大。
但是此窗控系统在一定程度上不是很完善,有的该系统只有简单的开关窗功能,而且没有语音报警功能,只可进行蜂鸣器警报,致使使用者不能了解所发生何种情况,不能即刻的去解除所产生的情况。在发生情况时只是开窗或关窗。曾考虑采用PLC来控制,但是毫无此方面基础,且PLC的成本价较高,不能以很快的速度进入到实际中使用。
同时,由于时间与自身能力的有限,有许多计划中的设计思路未能添加在作品中,如使用蓝牙控制,将事实情况反映给外出主人;未在在烟雾感应处加设排风系统如果当可燃性气体或烟雾超标时,不能以最快的速度排出室内的可燃性气体或烟雾。且作品因为调试原因,未能终完成全部的实物设计,这是此次设计中最大的遗憾与不足。上面提到的尝试互锁式继电器模块失败了,但我们尝试手动焊接烟雾传感器+AD芯片组成的烟雾采集模块可以工作,这个模块也可以跟电机驱动一样可以直接用现成的模块,出于学习知识的原由,我们还是自己动手焊接,今后我们采集数据的时候也会更有把握,熟练一点。
虽然整算不上优秀作品,但是,一个完整的设计过程使我们小组每个成员都受益匪浅,在单片机系统,语言程序设计,电子电路设计及手工操作方面有了极大的收获与长进。未以后更完善,更成功的设计打下了坚实的基础。