基于单片机的危险气体远程检测报警系统设计

摘 要

为了尽早发现和预防各类危险气体减少对人的危害,保护自己和个人或公共财产的安全,需要使用自动报警器对人进行预警。
本文中作为危险气体检测系统的主要技术采用了传感器和单片机,该系统基于STM32F103单片机无线数据传输系统和通过气体传感器MQ-4对危险气体的浓度进行监测,并通过AD模数转换模块将模拟量转换为数字值,再发送给单片机,LCD1602液晶显示屏显示当前检测到的气体浓度值,单片机通过ESP8266无线模块和手机进行传通讯将当前数据发送至手机上显示,通过按钮设置气体浓度报警上限数值,当气体浓度超过上限值时,启动蜂鸣器进行报警。实现了液晶显示危险气体的浓度和报警的功能,对气体检测报警系统的实现技术展开了较为深入地研究,为有害气体监测技术的实现提供了参考。

关键词:气体监测;传感器;单片机;无线数据传输

1 控制系统设计

1.2系统工作原理
本次设计采用LED1602液晶显示器显示采集到气体浓度值,单片机作用为STM32F103,MQ-4传感器时刻检测当前环境气体浓度。按键用来设定气体浓度报警上限值,通过模转换将采集到的气体浓度值模拟值转换为数字量,并传输给单片机进行计算。ESP8266无线模块用于单片机和手机之间的通信,将采集到的数据无线发送到手机端进行展示。包含两个按键,用来设置气体浓度报警上限值。危险气体浓度值大于设置的上限时,单片机驱动三极管控制蜂鸣器进行报警。系统的工作原理图如1.1所示。

在这里插入图片描述

图1.1 系统工作原理图

2 硬件设计

2.1 主电路
2.1.1 单片机最小系统
单片机最小系统由晶振电路、STM32F103芯片和复位电路组成。只要有这三者存在,单片机就可以正常的工作。[1]
单片机最小系统框图如图2.1所示。

在这里插入图片描述

图2.1 单片机最小系统框图
2.1.2 STM32F103单片机
STM32F103单片机是一款低功耗、高性能的微控制器,是STC公司早期生产用于工业控制的单片机。其作用是控制各种传感器和外设,自行计算处理得到的数据和信号,并进行相应的操作[2],在工业生产中起到大脑的作用。
对于本次设计选择的是STM32F103C8T6单片机。此单片机和51系列相比多了很多功能,不但运行速度比51单片机要快很多,自带2个AD转换,方便我们在设计烟雾的时候免去了需要加外部ADC进行转换,非常方便;
STM32有着很强大的通信功能和控制功能。这一点是51单片机无法比拟的。因为51单片机只有1个串口进行通信,而32单片机具有5个串口进行通信,所以对一些要求用串口进行通信的模块而且就不需要通过CD4052等双串口模块来转换,所以这一点被市场上广泛的运用,32单片机因为本身可以进行多种不同的时钟模数来进行工作,所以在功耗要求比较严格的产品中占有一席之地。
STM32特点:
(1)STM32C8T6系列的起振晶部分采用了RTC,低负载的方式,而没有像传统的比较廉价的圆柱晶振。
(2)引脚个数为48个。
(3)工作频率为72MHZ。
(4)单片机具有3个普通定时器和1个高级定时器。
(5)单片机具有2个2位/16通道的ADC模数转换。
(6)使用了3.3V稳压芯片,可以保证最大输出300MA电流。
(7)支持ST-LINK和JTAG调试下载。
(8)存储资源为64kb byte FLASH和20byte Sram。
STM32实物图如图2.2所示。
在这里插入图片描述

图2.2 STM32F103C8T6 实物图
(1)电源指示灯LED(PWR通常为红色):如果电源指示灯亮亮说明单片机正常运行,如果较暗或者闪烁,表示此单片机可能存在故障。
(2)用户LED(PC13):这个功能的使用大大的方便了我们进行一些比较简单的功能测试,如单片机的运行状态等,方便初学者进行更好的测试。
(3)单片机上采用了跳帽的方式,我们可以对stm32进行3种编程方式。如用户的SARM、闪存和系统的存储器。
(4)为单片机的复位电路。
(5)8M晶振:主要是用于设置单片机系统的频率为72MHZ。
(6)32.768KHz晶振:可供内置RTC使用,避免了需要专门的时钟芯片进行定时器处理等。
2.1.3 晶振电路
晶振电路也是我们常说的时钟电路,整个系统处理信号和其它各部分运行也是一个频率,晶振电路就是为它们提供一个稳定的振荡频率,使系统各部分保持同步。本设计主要是采用两个30μF的电容和一个12MHz的晶振组成。采用了外部时钟方式的配合方法,电容帮助晶振起振使电路可以正常工作。单片机的XTAL2和XTAL1两个接口分别于晶振上的两个引脚相连。
晶振电路原理图如图2.3所示。

在这里插入图片描述

图2.3 晶振电路原理图
2.1.4 复位电路
复位电路的用途:在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能[3]。原理图如图2.4所示。

在这里插入图片描述

图2.4 复位电路原理图

2.2 按键控制电路
在本设计中,一共有2个按键,起到调节上限值的作用,是系统可操作性的保证。作为输入端,按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平,进而实现对系统的手动输入。按键的一段连接单片机的双向I/O口,另一端接地。当按键开关处于张开状态时,I/O引脚和地断开,此时该I/O引脚处于高电平状态[4]。当按下按键时,I/O引脚接地,此时高电平置低电平,并返回一个低电平信号给单片机。
按键开关检测的原理是高低电平检测。 按键切换难免会因其切换时间而导致错误,因此在编写按键函数时要另外去写一个去抖函数,以提高其准确性。 系统通过按键设置计算出的气体浓度报警上限值。按键1代表增,按键2代表减。图2.5为按键控制电路原理图。
在这里插入图片描述

图2.5 按键控制电路原理图

2.3 报警电路
设计报警模块是为了通过蜂鸣器来触发警报,当烟雾传感器检测到的烟雾浓度超过设定烟雾报警上限值时,STM32F103单片机控制三极管驱动蜂鸣器进行蜂鸣,起到报警的作用。
蜂鸣器的一端连着三极管的e引脚,另一端接地,蜂鸣器电路如图2.6所示。三极管使用三极管PNP,起到放大电流和电平特性的功能,因为单个电路中的电路太小,无法提供足够多的触发信号所需的电流,三极管放大电流以后,电流被放大了200倍,足够触发信号,蜂鸣器报警。[15]同时三极管的上拉电阻起到限流的作用,防止电流过大从而击穿蜂鸣器。
在这里插入图片描述

图2.6 蜂鸣器电路原理图
2.4 LCD1602液晶显示电路
本次设计采用LCD1602液晶显示器作为输出显示器。LCD1602的作用是显示文本,本设计需要有两行文本显示,并且不需要彩色。第一行显示当前检测的气体浓度,第二行显示设定气体浓度的阈值。使用LCD1602可以满足本计的全部需求。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电。它需要5V的电压来进行工作,通过改变电压达到控制区域显示,通过单片机输出的数字信号在显示屏上显示出我想要的字符。显示屏具有2行输出,每行16个字符,能够同时显示16×2即32个字符。图2.7是LCD1602液晶屏的引脚图,从图中可以看出,引脚1是电源接地引脚,和单片机的GND联通。引脚2是VCC电源输入引脚,其工作电压为5V。引脚3—VO引脚可以调节显示屏的显示亮度,引脚4—RS引脚用于寄存器的选择,高电平时作为数据寄存器,低电平时作为指令寄存器,引脚5是RW读写信号,用于数据的读写。引脚6—EN引脚为使能端,高电平读取信息,低电平执行指令。引脚7~14是8位双向数据段口,引脚15和引脚16是背景灯的电源引脚。在和单片机进行通信时,和P0口进行连接,中间要有上拉电阻进行连接。[23]本次设计LCD1602液晶显示屏上展示检测到的气体浓度值,并展示气体浓度上限值的设置过程。其引脚连接图如图2.7所示。
在这里插入图片描述

图2.7 LCD1602液晶显示电路图
2.5 ESP8266模块电路
这部分无线通信使用ESP8266无线串行模块作为数据传输模块。ESP8266是一个非常强大的UART WiFi数据传输模块,耗电量非常低,价格非常低,体积非常小,允许嵌入任何具有强大的LWIP控制系统的产品,支持三个AP、STA、AP+STA模型,和简洁而有效的AT指令。ESP8266的工作电压为3.3V,而单片机的工作电压为5V,足够达到其工作电压的要求,还具有价格便宜、体积小的优点。在本次设计中用于单片机和手机之间的无线通信,通过WIFI模块,单片机将气体浓度值发送给手机端,最后显示在APP上。图2.8是ESP8266模块电路图,从图2.8中可以看出,1号引脚连接单片机的A10引脚,5号引脚连接单片机的A9引脚,而2号、4号和8号引脚接地。
在这里插入图片描述

图2.8 ESP8266模块电路
2.6 传感器模块电路
烟雾探测器用于探测场所内的烟雾浓度,也可用于报警,烟雾报警器采用的是离子式烟雾探测器。它广泛应用于各种信号系统。离子烟雾传感器是稳定可靠的,技术先进的传感器,比气敏电阻类传感器性能更佳。[8]
烟雾传感器是用来检测当前位置的烟雾浓度,以达到防灾的目的,烟雾传感器的内部采用的是离子式的烟雾感应,在各种报警系统中都得到了广泛的应用。离子烟雾传感器具有稳定可靠的优点,传感器技术先进,气敏电阻式报警器的性能远不如离子烟雾传感器好。
石油化工厂中排放出的危险气体是本系统所针对的目标,这些气体中绝大多数含有甲烷,所以选择MQ-4传感器,其对甲烷具有很高的灵敏度。以下是该传感器特性:
(1)输入电压范围: 5±0.2V DC;
(2)检测浓度:300~10000ppm(甲烷);
(3)电流消耗:150mA;
(4)使用寿命:5年;
(5)工作温度:-10~50℃;
(6)存储温度:-20~70℃。
(7)尺寸大小:32mm×20mm×22mm。
气敏式烟雾传感器的工作原理:使用空气中电导率较低的二氧化锡,当传感器所在的环境中存在被测的甲烷气体时,传感器的电导率和气体浓度成线性化比,通过数模转换模块,就可以将信号量转换成数字量,从而输出给单片机,最终在LCD1602液晶显示屏上显示出来。其电路原理图如图2.9所示。
在这里插入图片描述

图2.9 传感器的电路原理图

3 软件设计


 **源程序清单**
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "timer.h"
#include "usart1.h"
#include "LCD1602.h"
#include "string.h"
#include "stdio.h"

void Change_data_handle(void);//按键处理
void  SHOW_AND_BAOJING_Handle(void);//显示并处理报警
u8 KEY_SCAN(void);             //按键函数
u8 key,PPM;//按键值,和mq值
u16 PPM_MAX = 50;//烟雾上限报警值
unsigned char Alarm_Buf[16]="Warning";//WIFI报警显示
unsigned char buf[18];//WIFI数据发送缓存区

//串口相关
extern unsigned char RxCounter,Usart1RecBuf[64];
extern char bUsart1RecFlag;
//ESP8266相关函数
#define ESP_RECV_PTYPE_NULL 0
#define ESP_RECV_PTYPE_DATA 1
unsigned char cur_conn_id;
char *strx=0;
void Clear_Buffer(void)//清空缓存
{
	u8 i;
	for(i=0;i<64;i++)
	Usart1RecBuf[i]=0;//缓存
	RxCounter=0;
}
void esp_ap_mode(void)
{
	Clear_Buffer();
	Uart1_SendStr("AT+CWMODE=2\r\n");			//
	strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	while(strx == NULL)
	{
		Clear_Buffer();
		Uart1_SendStr("AT+CWMODE=2\r\n");
		delay_ms(500);
		strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	}
	/*
	<ssid>:字符串参数,接入点名称
	<pwd>:字符串参数,密码最长64字节,ASCII
	<chl>:通道号
	< ecn >:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK
	*/	
	Clear_Buffer();
	Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");						
	strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	while(strx == NULL)
	{
		Clear_Buffer();
		Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");
		delay_ms(500);
		strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	}
	/*
	AT+CIPMUX=1
	OK
	*/
	Clear_Buffer();
	Uart1_SendStr("AT+CIPMUX=1\r\n");						
	strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	while(strx == NULL)
	{
		Clear_Buffer();
		Uart1_SendStr("AT+CIPMUX=1\r\n");
		delay_ms(500);
		strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	}
	/*
	AT+CIPMUX=1时才能开启服务器;关闭server模式需要重启?
	AT+CIPSERVER=1,8080

	OK
	*/
	Clear_Buffer();
	Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");						
	strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	while(strx == NULL)
	{
		Clear_Buffer();
		Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");
		delay_ms(500);
		strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	}	
}
void esp8266_init()
{
	Usart1_Init(115200);
	Uart1_SendStr("ESP8266 Init\r\n");
	Uart1_SendStr("AT\r\n");						//模块测试
	strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
	while(strx == NULL)
	{
		Clear_Buffer();
		Uart1_SendStr("AT\r\n");
		delay_ms(500);
		strx=strstr((const char*)Usart1RecBuf,(const char*)"OK");
	}
	
	esp_ap_mode();
}	
void  esp_send_buf(unsigned char conn_id, char * buf, unsigned char len)
{
		printf("AT+CIPSEND=%d,%d\r\n",cur_conn_id,len);
		strx = strstr((const char*)Usart1RecBuf,(const char*)">");
	  delay_ms(200);
		if(strx==NULL)
		{
				return;
		}	
		Uart1_SendStr(buf);
		strx = strstr((const char*)Usart1RecBuf,(const char*)"SEND OK");
		delay_ms(100);
		if(strx==NULL)
		{
				return;
		}		
}
int main(void)
{	
  u16 test,test_adc;
	
	delay_init();	    	 //延时函数初始化	  
	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	KEY_IO_Init();     
  RELAY_Init();	
	TIM2_Int_Init(999,72-1);  //定时器初始化,定时1MS
  //Tout = ((arr+1)*(psc+1))/Tclk ;
	//Tclk:定时器输入频率(单位MHZ)
	//Tout:定时器溢出时间(单位us)
	delay_ms(300);
  BEEP_DISENABLE();   //蜂鸣器初始化
	LCD_Init();          // 1602初始化 
	Adc_Init();    //ADC初始化
	esp8266_init(); //ESP8266初始化
	//显示报警值
	LCD_Write_String(0,1,"ALARM:  %       ");
	LCD1602_write_long(6,1,PPM_MAX,2);
  while(1)
	{
			test_adc = Get_Adc_Average(ADC_Channel_9,20);//获取通道9的AD值,20毫秒读取一次
			PPM = test_adc*99/4096;//转换成0~99百分比
			PPM = PPM >= 99? 99: PPM;
			SHOW_AND_BAOJING_Handle();//报警处理并显示
      Change_data_handle();//按键处理
			test++;
			if(test>20)
			{
					esp_send_buf(0,buf,11);//发送数据
					test = 0;
			}
			delay_ms(1);
  }
}
extern u8 FLICKER;
void  SHOW_AND_BAOJING_Handle(void)
{
    unsigned char show_buf[16];  
		if(PPM >= PPM_MAX)//mq超限
		{
       memcpy(buf,Alarm_Buf,7);
			 buf[7] = '!';
			 buf[8] = '!';
			 if(FLICKER)//显示值闪烁
			 {
					LCD_Write_String(0,0,"             ");
			 }
			 else
			 {
					sprintf(show_buf,"   MQ:%02d%%",PPM);
					LCD_Write_String(0,0,show_buf);
			 }
		}
		else
		{
			sprintf(show_buf,"   MQ:%02d%%",PPM);
			LCD_Write_String(0,0,show_buf);//显示mq值
			memcpy(buf,show_buf,9);
		}
		
		buf[9] = '\r';
		buf[10] = '\n';
    if(PPM >= PPM_MAX)//超限报警
		{
      BEEP_ENABLE(); 
		}			
		else 
		{
			BEEP_DISENABLE();
		}			
}
u8 KEY_SCAN(void)
{
	  u8 res = 0;
    if(!KEY2)
		{
		   delay_ms(10);
			 if(!KEY2)
		   {
					while(!KEY2);//卡死
					res = 2;		 
		   }
		 }
    if(!KEY1)
		{
		   delay_ms(10);
			 if(!KEY1)
		   {
					while(!KEY1);//卡死
					res = 1;		 
		   }
		 }		 
		 return res;
}
void Change_data_handle(void)
{
    u8 key;

	  key = KEY_SCAN();//读取按键值
	
		if(key == 2 && PPM_MAX < 99)//mq上限最大到99
		{			
				PPM_MAX += 1;
			  LCD1602_write_long(6,1,PPM_MAX,2);//显示
		}
		if(key == 1 && PPM_MAX > 0) //mq上限最小到0
		{
				PPM_MAX -= 1;
			  LCD1602_write_long(6,1,PPM_MAX,2);//显示
		}
}	

结 论

通过以上分析本系统控制器方面采用STM32F103C8T6单片机完全符合本设计的控制需求。MQ-4烟雾传感器完成采集室内的甲烷气体浓度,并通过A/D转换芯片ADC0832将数据传递到LCD1602显示屏上,并设定上限值,只要数值超过设置的上限值就会立马报警,从而通知人及时快速到达现场清理甲烷气体,保障室内甲烷气体正常浓度值的操作。具体工作体现在整体电路的设计与制作,系统调试,程序的编写等多个步骤。其中电路设计为重点,本设计通过五个模块达到了检测室内的气体浓度、达到对应浓度报警、显示当前环境下的气体浓度三个功能。并首次通过自己的努力,在Altium Designer10上绘出PCB图。
本设计成功完成了采集数据、设定数值和显示屏显示的功能,具有精度高,便于携带,成本较低等优点。通过该系统的每个环节从各个方面展现出这个系统的设计思路以及原理。例如从硬件设计和软件设计方面等等。运用了许多技术比如单片机、传感器、信息的采集和处理等方面,对于不同室内空气环境有着很好的监控作用。通过在工厂内的实地测试,可以正常实现所有操作,所以本设计有实际应用价值,可以应用于化工厂附近的住宅区,生产车间等高污染区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值