天天看點

單片機設計 智能環境安全監測系統

智能環境安全監測系統

想要更多項目私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();																				//更新顯示
	} 

}

           

繼續閱讀