一、系统总体框图
二、总体电路图设计
采用STM32开发板、LCD模块、DHT11温湿度传感器模块、MQ-2烟雾传感器模块、热释红外传感器和ov7670摄像头模块设计智能安全环境报警系统。该系统具有视频图像显示,检测环境温度、湿度、烟雾或可燃气体,并在LCD显示屏上显示相关数值,并上传数据给用户端,用户也可通过终端查询相关数据,若某一温湿度、烟雾或可燃气体超过设定值、或未允许的外来人员进入均可触发报警,发送信息提示用户并报警等功能。
运行结果图
四、主代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "stdio.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"
#include "rtc.h"
#include "dht11.h"
#include "piclib.h"
#include "string.h"
#include "math.h"
#include "ov7670.h"
#include "timer.h"
#include "exti.h"
#include "beep.h"
#include "adc.h"
#include "stdio.h"
#include "usart3.h"
#include "usart2.h"
#include "common.h"
#include "image.h"
#include "image7.h"
/*想要更多项目私wo!!!*/
#define title_ 150 //首页界面的起始位置
#define title_k 20
extern u8 ov_sta; //在exit.c里面定义
extern u8 ov_frame; //在timer.c里面定义
extern u8 tempflag,ywflag; //温湿度标志位,烟雾标志位
extern u16 voc; //voc浓度,在usart3里面定义
extern u8 outData; //发送数据标志位。
void olarm(void); //报警函数
/***************************
Function:
int main(void)
Description:
主函数调用各类初始化
***************************/
int main(void)
{
u8 fontx[2]; //gbk码
u8 key;
u8 temperature, humidity;
u8 time=0;
usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
BEEP_Init();
Adc_Init(); //ADC初始化
uart_init(115200); //串口初始化为115200
USART2_init(115200);
usart3_init(9600);
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
W25QXX_Init(); //初始化W25Q128
my_mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
while(font_init()) //检查字库
{
UDP:
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //设置字体为红色
while(SD_Init()) //检测SD卡
{
delay_ms(200);
LCD_Fill(30,70,200+30,70+16,WHITE);
delay_ms(200);
}
key=update_font(20,110,16,"0:"); //更新字库
while(key) //更新失败
{
delay_ms(200);
LCD_Fill(20,110,200+20,110+16,WHITE);
delay_ms(200);
}
delay_ms(1500);
LCD_Clear(WHITE); //清屏
}
POINT_COLOR=0xCD85;
StartingUp(); //开机动画
LCD_Clear(WHITE);
Title(); //首页显示标题
//Show_Str(120,5,300,24,"智能环境安全报警系统",24,0);
while(DHT11_Init()) //DHT11初始化
{
LCD_ShowString(60,70,200,16,16,"DHT11 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
while(OV7670_Init()) //初始化OV7670
{
LCD_Fill(30,190,239,206,WHITE);
delay_ms(200);
}
TIM6_Int_Init(10000,7199); //10Khz计数频率,1秒钟中断
LCD_ShowString(660,130,200,16,16,"DHT11 OK");
RTC_Init(); //RTC初始化
POINT_COLOR=BLUE; //设置字体为蓝色
LCD_ShowString(60,50,200,16,16," - - ");
LCD_ShowString(400,50,200,16,16," : : ");
POINT_COLOR=BLUE;
Show_Str(60,100,200,16,"温度: °C",16,0); //一个字母16/2 5*8=40 Show_Str(60,70,200,16,"温度: C",16,0); LCD_ShowString(60,70,200,16,16,"Temp: C");
Show_Str(150,100,200,16,"湿度: %",16,0); // Show_Str(150,70,200,16,"湿度: ",16,0); LCD_ShowString(150,70,200,16,16,"Humi: %");
Show_Str(60,120,200,16,"烟雾浓度电压值:0.000V",16,0); //LCD_ShowString(60,110,200,16,16,"ADC_CH0_VOL:0.000V");
Show_Str(60,140,300,16,"VOC浓度: . PPM",16,0);
//atk_8266_wifista_test();
ESP8266_Init();
TIM2_Int_Init(9999,7199); //定时一秒
TIM3_Int_Init(9999,7199); //定时两秒
data=mymalloc(SRAMIN,32);
while(1)
{
POINT_COLOR=BLUE; //设置字体为蓝色
if(time!=calendar.sec)
{
time=calendar.sec;
LCD_ShowNum(60,50,calendar.w_year,4,16);
LCD_ShowNum(100,50,calendar.w_month,2,16);
LCD_ShowNum(124,50,calendar.w_date,2,16);
switch(calendar.week)
{
case 0:
Show_Str(235,50,200,16,"星期天",16,0);
break;
case 1:
Show_Str(235,50,200,16,"星期一",16,0);
break;
case 2:
Show_Str(235,50,200,16,"星期二",16,0);
break;
case 3:
Show_Str(235,50,200,16,"星期三",16,0);
break;
case 4:
Show_Str(235,50,200,16,"星期四",16,0);
break;
case 5:
Show_Str(235,50,200,16,"星期五",16,0);
break;
case 6:
Show_Str(235,50,200,16,"星期六",16,0);
break;
}
LCD_ShowxNum(400,50,calendar.hour,2,16,0x80);
LCD_ShowxNum(424,50,calendar.min,2,16,0x80);
LCD_ShowxNum(448,50,calendar.sec,2,16,0x80);
}
delay_ms(10);
if(tempflag) //每1s读取一次温湿度的值
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
LCD_ShowNum(60+40,100,temperature,2,16); //显示温度
LCD_ShowNum(150+40,100,humidity,2,16); //显示湿度
tempflag=0;
if(temperature>35||temperature<20||humidity>65||humidity<25)
{
olarm();
}
}
if(ywflag) //每1s读取一次烟雾传感器的值
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
temp_adc=(float)adcx*(3.3/4096);
adc_data=temp_adc; //要发送的数据保存起来
adcx=temp_adc; //整数
LCD_ShowxNum(180,120,adcx,1,16,0);
temp_adc-=adcx; //小数
temp_adc*=1000;
LCD_ShowxNum(196,120,temp_adc,3,16,0X80);
ywflag=0;
}
//空气质量的值
if(voc==0xffff)
{
Show_Str(280,140,200,16,"预热中...",16,0);
}
else
{
Show_Str(280,140,200,16,"预热完成.....",16,0);
Temp_voc = (float)voc/10.0;
voc_data=Temp_voc; //要发送的数据保存起来
voc_z = Temp_voc;
Temp_voc-=voc_z;
Temp_voc*=10;
LCD_ShowxNum(125,140,voc_z,2,16,0);
LCD_ShowxNum(145,140,Temp_voc,1,16,0);
if(voc_z>25)
{
olarm();
}
}
if(outData==5)
{
sprintf((char*)data,"%02d,%02d,%.1f,%.1f\n",temperature,humidity,adc_data,voc_data);
atk_8266_send_cmd("AT+CIPSEND=0,13","OK",200); //发送指定长度的数据
delay_ms(200);
atk_8266_send_data(data,"OK",100); //发送指定长度的数据
delay_ms(200);
outData=0;
}
key=KEY_Scan(1); //不支持连按
if(key==KEY1_PRES)
{
EXTI8_Init(); //使能定时器捕获
OV7670_Window_Set(12,176,240,320); //设置窗口
OV7670_CS=0;
camera_refresh(); //更新显示
}
camera_refresh(); //更新显示
}
}