一.硬件方案
本次设计主要分五个功能,分别为测温湿度,pm2.5和CO及发送信息和报警。将这几个个功能巧妙的与家居结合,我们已经知道五个单独功能如何实现,现在要将五个功能通过单片机系统化反馈,以达到能实现综合五种功能的智能家居。
设计涉及主硬件为:STC89C52RC单片机,DHT11温湿度传感器,GSM模块,CO传感器,PM2.5传感器,按键设置与LCD1602液晶显示模块,蜂鸣器报警电路,以及超标指示显示模块组成。如图:
二.设计功能
(1)采用DHT11温湿度传感器检测温湿度,PM2.5粉尘传感器检测空气质量,MQ-2(MQ系列可换)烟雾传感器检测可燃气体或烟雾浓度给ADC0832模数转换芯片,0832将模拟量装换成数字量给单片机。
(2)采用LCD1602液晶屏显示温度、湿度、烟雾浓度和pm2.5粉尘数据以及各个指标的阀值。
(3)四个按键:按键1设置、按键2加、按键3减、按键4确定。按键可以设置温湿度的上下限值、烟雾的上限值和粉尘的上限值,设置的值可以存储到单片机(STC系列)内部的EEPROM中,实现掉电存储,设置的值掉电不丢失。
(4)当温湿度值低于下限或高于上限时,或者烟雾浓度高于上限时,或粉尘数据超过上限值时,相应的指示led灯亮,同时蜂鸣器响,实现声光报警。
(5)采用GSM模块发送短信,当各个指标的任何一个指标超过阀值,GSM模块就会向手机发送短信,提示注意,发送内容为各个指标的实时采集数据。
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
四.软件设计
(1)程序流程图
(2)主程序源码
//T:23C P0.12mg/m3
//H:45% C:000mL/m3
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
***********************************************************************/
void main()
{
uint testnum;
uchar ys;
Uart_init(); //串口初始化
RW=0;
init_eeprom(); //EEPROM初始画
read_eeprom(); //读取设定值
L1602_init(); //显示屏初始画
for(ys=0;ys<10;ys++)
{
delayms_1000ms();
}
SendString("AT\r\n"); //GSM初始化指令
delayms_1000ms();
delayms_1000ms();
SendString("AT\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("ati\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("ati\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("ATH\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("AT+CMGF=1\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("AT+CNMI=2,1,0,0,0\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("ATH\r\n");
delayms_1000ms();
delayms_1000ms();
SendString("AT+CSCS=");
SendASC('"');
SendString("UCS2");
SendASC('"');
SendString("\r\n");
delayms_1000ms();
write_1602com(0x80);
write_string("T: C P . mg/m3");
write_1602com(0xc0);
write_string("H: % M: mL/m3");
// Uart_init();
// TH=30;TL=20;HH=80;HL=50;COH=100;PMH=100;
while(1)
{
KEY(); //按键扫描
if(flag==0)
{
if(FlagStartRH==1)
{
testnum = RH();
FlagStartRH = 0;
// TR0 = 1;
humidity = U8RH_data_H; //读出温湿度,只取整数部分
temperature = U8T_data_H;
DA=sum/40;
sum=0;
PM=DA*(float)(DA/4);
MQ=adc0832(1);
display();
}
if(temperature>=TH)
LED1=0;
else
LED1=1;
if(temperature<=TL)
LED2=0;
else
LED2=1;
if(humidity>=HH)
LED3=0;
else
LED3=1;
if(humidity<=HL)
LED4=0;
else
LED4=1;
if(PM/10>=PMH)
LED5=0;
else
LED5=1;
if(MQ>=MQH)
LED6=0;
else
LED6=1;
if(temperature>=TH||temperature<=TL||humidity>=HH||humidity<=HL||PM/10>=PMH||MQ>=MQH) //判断当前检测值
{
Onealarm();
}
else
alarm=1;
if((temperature>=TH||temperature<=TL||humidity>=HH||humidity<=HL||PM/10>=PMH||MQ>=MQH)&&flag_ok==1)
{
TR0=0;
TransmitText();
flag_ok=0;
TR0=1;
}
}
}
}