单片机设计_智能环境安全监测系统(STM32+ESP8266+DHT11)

智能环境安全监测系统

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

}

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值