智能環境安全監測系統
想要更多項目私wo!!!
一、系統總體框圖
二、總體電路圖設計
采用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(); //更新顯示
}
}