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

目录

摘 要 I
Abstract II
绪 言 3
1 控制系统设计 5
1.1 系统方案设计 5
1.2 系统工作原理 5
2 硬件设计 6
2.1 主电路 6
2.1.1 单片机最小系统 6
2.1.2 STM32F103单片机 6
2.1.3 晶振电路 8
2.1.4 复位电路 8
2.2 按键控制电路 9
2.3 报警电路 10
2.4 LCD1602液晶显示电路 10
2.5 ESP8266模块电路 11
2.6 传感器模块电路 11
3 软件设计 13
3.1 系统主程序设计 13
3.2 系统子程序设计 13
3.2.1 LCD1602显示设计 13
3.2.2 ESP8266无线通信设计 13
3.2.3 按键子程序设计 15
3.2.4 气体浓度检测程序设计 16
3.2.5 报警程序设计 16
结 论 17
参考文献 18
附录 源程序清单 20
致 谢 26

摘 要

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

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

Abstract

In order to find and prevent all kinds of dangerous gases as soon as possible to reduce the harm to people, protect themselves and personal or public property safety, it is necessary to use automatic alarm to warn people.
The system is based on STM32F103 microcontroller wireless data transmission system and gas sensor MQ-4 to monitor the concentration of dangerous gases, and then send the analog quantity to digital value through AD digital-to-analog conversion module, then send to the microcontroller, LCD1602 LCD display to display the current detected gas concentration value, the microcontroller through ESP8266 wireless module and mobile phone transmission, send the current data to the mobile phone display, set the upper limit value of gas concentration alarm through the button, when the gas concentration exceeds the upper limit value, start the buzzer for alarm. The liquid crystal display function of hazardous gas concentration and alarm is realized, and the technology of gas detection and alarm system is studied in depth to provide reference for the realization of hazardous gas monitoring technology.

Keywords: gas monitoring; the sensor; single chip microcomputer; wireless data transmission.

绪 言

为了加快经济的发展,人们几乎无休止的开采资源,破坏环境,使本来就已经污染严重的环境再次受到了重大的影响,人类的生存环境变得十分恶劣,人们面临着环境污染不断的严重问题。因此,为了与自然和谐相处,我们迫切需要保护自然环境。自从重视保护环境以来,人类开始利用高科技产品监测自然环境的状况,寻求环境问题的改善和解决方法。危险气体是必须消除的重要污染类型之一。随着化工厂数量的增加,化工厂排放的危险气体的种类增加,设施和仓库泄漏事故的增加,从安全、环保等方面考虑,开发一种检测危险气体的控制器和自动报警装置非常重要。随着单片机技术的快速发展,利用单片机开发的检测设备越来越小,种类也越来越多,但用于气体检测的设备却越来越少。因此,有必要设计一种基于单片机的危险气体检测系统。
本系统设计的危险气体监测系统通过检测被测气体的浓度,当气体浓度超过规定的标准值时,即使用蜂鸣器进行报警。当检测的气体浓度小于报警值时改变报警标准即不报警。人们可以通过超过正常气体浓度规定的标准值时报警器发出的声音察觉到危险从而避开有可能发生的灾害和及时解决危险气体浓度过高引发的问题。
本次设计是基于STM32F103单片机的气体浓度检测系统,通过MQ-4传感器检测当前环境中甲烷气体的浓度,收集到的模拟值通过AD模块转换成数字格式,并传输到单片机,通过LCD液晶屏显示出来。当气体浓度超过最高限值时,蜂鸣器就会被单片机控制开始报警。此外单片机采用ESP8266模块和手机进行通信,将检测到的数据发送给手机端,并展现在APP上。
本设计具备以下功能:
(1)使用传感器收集环境数据并将其模拟值转换成数字格式;
(2)在单片机中处理收集到的数据,实时监测气体浓度;
(3)实现串口通信和液晶屏的程序设计,LCD液晶屏显示实时检测到的危险气体的浓度值;
(4)按键设置报警气体浓度值,超过报警值时,蜂鸣器发出警报;
(5)单片机和手机之间无线通信,在手机上展示数据。

1 控制系统设计

1.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 软件设计

3.1 系统主程序设计
系统的主流程图如图3.1所示。各个模块开始工作开始,实时检测甲烷气体浓度值,并进行相应的报警操作。启动的步骤为:ESP8266wifi模块初始化,MQ-4传感器接收到目前的气体浓度,按下按键设置报警上限。当超出上限值时,单片机驱动三极管来控制蜂鸣器触发警报,单片机将检测到的气体浓度值数据通过ESP8266wifi无线模块发送给手机端进行显示。

图3.1 系统流程图
3.2 系统子程序设计
3.2.1 LCD1602显示设计
LCD1602的作用是显示文本,本设计需要有两行文本显示,并且不需要彩色。第一行显示当前气体浓度,第二行显示设定的气体浓度上限的值。LCD1602液晶显示器一旦开启,就会与单片机进行双向通信。 单片机控制显示器的亮度并显示内容,过一段时间后,液晶屏上会显示出检测到的气体浓度值。 在设置报警值上限时,根据按键动作改变报警值。 单片机控制记录命令的记录引脚显示内容。 然后在显示器上执行该命令,并显示内容。LCD1602显示流程图如图3.2所示。

图3.2 LCD1602初始化流程图
3.2.2 ESP8266无线通信设计
当ESP8266模块与单片机模块相连接时,连接到无线模块供电,按下ESP8266开关,电源指示器就会启动。首先串口初始化开始,然后是整体中断,当有输出信号时进入总中断再开启串口中断。在一定时间段中发送检测到的气体浓度具体数值,建立一个串口的工作方式的设置,最后设置定时器的初值。整个流程进行完毕。串口的作用是单片机和ESP8266无线模块之间进行通信,将检测到的气体浓度值发送给手机,并在手机App上实时动态变换。ESP8266无线通信流程图如图3.3所示。

图3.3 ESP8266无线通信流程图
3.2.3 按键子程序设计
本次设计按键电路功能不多,为设置气体浓度报警上限值。按键的工作原理是检测主程序中的低水平信号,一旦低电平信号被主程序检测到了,单片机就会产生信号中断,并进入按键子程序。两个按键分别起到加和减的作用。
在不同页面表示不同的功能。分别用函数执行不同的操作,注意进行延时操作,防止误差。按键程序流程图如3.4所示。

图3.4 按键程序流程图
3.2.4 气体浓度检测程序设计
利用MQ-4气体传感器对空气中的甲烷气体有较高的灵敏度,当控制器附近的甲烷气体浓度增大时,影响了传感器的电导率的变化,电导率随之增加,将电导率的变化转换为与该气体浓度相对于的模拟输出信号,经过数模转换模块转换成数字量并发送给单片机。图3.5是其流程图。

图3.5 气体浓度检测流程图
3.2.5 报警程序设计
主函数执行后,通过检测来判断是否发生中断,用设定好按键的形式来设定气体浓度的报警上限,检测是否超出了报警上限,通过函数的循环来判断是否超出浓度上限,如果超过,那么蜂鸣器报警。报警流程图如3.6所示:

图3.6 报警流程图

结 论

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

参考文献

[1]高志远,赵小莉,赵亚运.基于单片机仿真教学的应用分析[J].化学工程与装备,2019,1(12):283-284
[2]武文静.电子电路故障诊断与预测技术分析[J].计算机产品与流通,2019,2(12):80
[3]周澄.基于Matlab的电子电路设计与仿真教学研究[J].教育现代化,2019,
6(92):214-215
[4]袁嘉嵘.LabVIEW电子电路模拟仿真设计[J].电子技术与软件工程,2019,5(20):105-106
[5]郭小江.苯气体检测报警器的应用及测量值的不确定度评定[J].工业计量2019,29,4(S1):69-71
[6]黄平.基于单片机的液晶(LCD)图文显示系统设计[J].通信电源技术2019,36(10):69-70
[7]梁丽秀,裴玖玲,孙少杰,周丹.电工电子实习的教学改革实践[J].科技经济导刊,2019,27(26):176
[8]王福鹏. 吸收光谱法气体传感器的背景干扰消除和关键性能提升[D].山东大学,2019
[9]郑三婷.浅谈Proteus仿真软件在单片机教学和电路设计中的应用[J].电子测试,2019,8(10):139-140
[10]杨连阜.电路的分析、设计与检修——“电子产品装配与调试”教学实践与体会[J].天津职业院校联合学报,2019,21(04):24-29
[11]徐靖,吕洁,吕雪英.电子电路仿真技术在电子应用开发中的作用[J].自动化应用,2019,9(01):92-94
[12]唐忠林,甘霖.基于气体传感器的瓦斯浓度监测系统的研究[J].卫星电视与宽带多媒体,2019,5(19):35-36
[13]张其方.可燃气体和有毒气体检测系统应用探讨[J].石油化工自动化,2018,54(05):15-18
[14]张枫,王必晴,王晗,方凌霄.基于单片机的废气监测系统研究与实现[J].福建电脑,2018,34(04):24-26
[15]吴斌,刘榕发.室内空气质量检测分析与报警装置研究[J].电子测试,2018(13):18-19+21
[16] 鲁刚强. 基于液晶显示器的单片机系统设计[J]. 科技资讯,2008:152-255
[17] 黄庆华. 单片机开发技术与实训[M]. 北京: 北京电子工业出版社,2006.(7):1-74
[18]杜洋.A/D转换芯片ADC0832的应用[J].电子制作,2006(01):44-46.
[19]冯黎.Protel 99 SE应用入门(一)[J].电子制作,2005(05):40-41+50.
[20]武芳,蒋汝根,朱璇.Keil和Proteus联调在单片机教学中的应用实例[J].中国教育技术装备,2015(20):47-48.
[21] 黄庆华. 单片机开发技术与实训[M]. 北京: 北京电子工业出版社,2006.(7):1-74
[22] 袁晓溪. 基于单片机的LED显示系统[D].吉林大学,2015
[23] 鲁刚强. 基于液晶显示器的单片机系统设计[J]. 科技资讯,2008:152-255
[24] Gan Y, Wang H, Shan Z, et al. USER DATA PROCESSING METHOD AND DEVICE:, WO/2016/000163[P]. 2016.
[25] Kim H young-Tae. How to use KEIL 8051 C Compiler.Yangseogak pub-lish Company,2001:1-19

附录 源程序清单
#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”);
}
/*
:字符串参数,接入点名称
:字符串参数,密码最长64字节,ASCII
:通道号
< 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(strxNULL)
{
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);//显示
	}

}

致 谢

这次毕业设计中,我要特别感谢我的毕设指导老师孟军红老师和张有成老师。在毕业设计这几个月的时间里,无论对于项目的制作方向,硬件电路的设计,还是软件程序的编写,老师们都给予了我极大的帮助,在我遇到自己无法解决的问题时,老师们都能非常细心的给我解答和建议,在很多方面都给予我很好的指导意见,在老师们的帮助下我的毕业设计才能顺利完成。
在毕业设计过程中,我查阅了大量的有关资料,回顾了大学四年所学的相关课程,通过上网搜索、与同学交流经验、向老师请教等方式,使自己学到了不少知识,尽管前期在硬件的设计调试和程序代码编写的修改过程中经历了不少艰辛,还是在老师和同学的帮助下完成了毕业设计。在撰写整个论文的过程中我学到了许多东西,我独立工作的能力和动手能力得到了很大的提高,并且对自己的工作能力有了信心,对我今后的学习工作都有着非常重要的影响。最后再次感谢在大学期间教导我的各位老师,向你们致以深深的敬意和衷心的感谢!

作者:qq_q992250277

物联沃分享整理
物联沃-IOTWORD物联网 » 基于单片机的远程危险气体检测报警系统设计

发表评论