目 录
摘 要 I
Abstract II
引 言 1
1 控制系统设计 3
1.1 方案选择 3
1.2 系统控制原理 4
2系统硬件设计 5
2.1 单片机的选择与设计 5
2.2 温湿度模块设计 6
2.3 甲醛采集模块设计 8
2.4 显示器模块设计 9
2.5 按键模块设计 10
2.6 报警模块设计 11
2.7 加湿及风扇模块设计 11
3系统软件设计 13
3.1 总流程方案设计 13
3.2 温湿度获取的软件设计 14
3.3 液晶屏LCD1602的软件设计 15
4系统调试 13
4.1 硬件调试 16
4.2 软件调试 16
结 论 17
参考文献 18
附录1 原理图 20
附录2 源程序清单 21
致 谢 31
摘 要
室内的温度和湿度是两种最基本的环境参数,与人们的生活环境息息相关,监控温湿度可以更好地控制我们的生活环境[1]。而甲醛是一种原生质毒物,对人体健康的危害具有长期性、潜伏性、隐蔽性等特点,它无处不在,不仅在新装修的家里也在各种的生产车间,因此为了人们的身体健康设计了一款基于单片机的温湿度及甲醛浓度监控系统[2]。
本设计利用单片机控制功能结合传感器检测功能,提出一种以单片机为主控单元的空气质量监控系统。它的主要功能实现是通过温湿度传感器进行检测,并使数据显示在LCD屏上[3]。此设计通过按键设置温湿度和甲醛浓度的限值。低于湿度设定值时启动雾化片实现加湿功能,高于温度设定值蜂鸣器报警。当甲醛浓度超出标准值时控制风扇转动保持车间内空气流通,减少甲醛浓度。最后结合软件模块设计,利用代码对硬件进行驱动,经软硬件实物调试后,从而实现本设计功能的执行和控制。
本设计不仅能够监控车间温湿度的情况,还可以改善人们在车间长期工作导致的健康问题。本系统设计遵守体积小,质量轻,性价比高的原则,大大提高了轮胎的生产质量和工人的生活质量,这对于生产车间空气质量的研究有着很大的意义将进一步推动目前轮胎工业的进步和发展。
关键词:温湿度传感器; 单片机; 甲醛浓度
Abstract
Indoor temperature and humidity are two basic environmental parameters, which are closely related to people’s living environment[1]. Measuring temperature and humidity can better control our living environment. And formaldehyde is a kind of protoplasm poison, which has the characteristics of long-term, latent and concealed. It is everywhere, not only in the newly decorated home but also in a variety of production workshops. So design a temperature and humidity based on the MCU and formaldehyde concentration monitoring system for peoples’ health[2].
This design uses a single-chip microcomputer control function combined with the sensor detection function to propose an air quality monitoring system with a single-chip microcomputer as the main control unit. The function realization is to detect through the temperature and humidity sensor, and make the data displayed on the LCD screen[3]. This design sets the limits of temperature, humidity and formaldehyde concentration through the buttons. When the humidity is lower than the set value, the atomizer is activated to realize the humidification function and the buzzer alarms above the temperature. The fan will rotate automatically to keep the air circulating in the workshop and reduce the formaldehyde concentration when the formaldehyde exceeds the standard value. Finally, combined with the software module design and used code to drive the hardware, after the hardware and software debugging, so as to achieve the implementation and control of functions.
This design can not only monitor the temperature and humidity of the workshop, but also improve the health problems caused by people working in the workshop for a long time. The design greatly improve the quality of tire production and the quality of life of workers by following the principle of small volume, light weight and high cost performance, which is of great significance to the research on the air quality of production workshops and will further promote the progress and development of the current tire industry.
Keywords: temperature and humidity sensor; singlechip microcomputer; formaldehyde concentration
引 言
随着科技的发展,测量技术也不断精进,人们越来越重视空气质量指数,比如说温湿度、甲醛、一氧化碳、PM2.5等。而在轮胎的生产车间也要实时监控温湿度以防止由于湿度过高导致的轮胎生霉和由于温度过高导致的橡胶发粘、强度下降等情况。除此之外,在生产车间更要监控甲醛的浓度。甲醛是在室温下是一种易溶于有机溶剂的无色且具有刺激性气味的气体。它可用于医学被制成福尔马林溶液。甲醛的毒理作用是通过与蛋白质的结合危害呼吸道、皮肤组织从而致癌致畸。甲醛这种有毒物质被人们吸入后慢慢累积,长期危害人们的身体健康且不易被发觉,如果人们经常待在甲醛浓度高的地方可导致中毒以及不可逆的疾病[4]。已经有报道称某工厂的工人长期吸入甲醛造成一些血液疾病,这种情况已受到国家重视并将甲醛列为一级危险化学品严格管理。因此为了工人们的身体健康和提高轮胎的生产率非常有必要设计一款可以实时监控空气质量的仪器。
由于人们开始追求健康的生活环境,出现了一些甲醛浓度的测定方法。现在,测定方法和标准已经有很多,并形成了较为统一的测定方法。标准规定的方法绝大多数是化学分析法,使用的手段是实验室分析仪器,主要有比色计、分光光度计、化学滴定、气相和液相色谱[5]。但这些方法普遍要求检测人员按照标准采集空气样本,并用专业仪器按照严格的化学实验步骤检测样本的甲醛浓度,费力费时、成本高、自动化程度低,过程复杂,很难做到现场实时控制。同时,各国之间在测试方法上基本相同,但是根据相关国家法律规定不同,得出结果标准也不同,这并不影响结论,只要结果在标准之下即可。
因此,我认为研究带有温湿度控制功能的甲醛浓度监控系统是有必要的,它具有一定的实用价值与广阔的应用前景,能够改善人们在车间长期工作而导致的健康问题以及提高轮胎的生产质量和效率。
本文基于单片机设计的空气质量监控系统,本篇论文共分为四部分,主要内容如下。
第一部分为系统总体方案设计。根据课题要求选择合适的主控制器并设计出系统的总体方案。
第二部分为系统的硬件设计。主要是温湿度采集和甲醛采集模块的选择。还包括显示模块、按键模块、报警模块、加湿及风扇模块的设计。
第三部分为系统的软件设计。简要介绍了总体流程、温湿度和甲醛浓度获取及液晶屏显示实现的方式与流程图。
第四部分为系统调试。完成本系统的硬件焊接及调试,并将编写并调试完的程序烧录到单片机中,搭建系统硬件联调。
1 控制系统设计
本课题实现的是基于单片机的空气质量监控系统的设计,选用单片机为本设计的主控制器,配合各模块协助运行。本系统的主要原理是通过传感器采集车间内温、湿度,并将采集到的参数进行处理,实现温、湿度测量及显示。还可通过按键自行设置温湿度限值,高于温度设定值可报警,低于湿度设定值启动雾化片实现加湿功能,并当甲醛超出设定值时控制风扇转动,保持车间内空气流通,减少甲醛浓度。
本设计的具体任务如下:完成主控制器的选择和主控制电路的设计,使本设计具备信息处理功能;完成室内温湿度的采集及控制功能;完成参数的显示功能;使实物具有按键调节功能及报警功能;并通过设置限值自动开启加湿和风扇功能;完成整体电路的设计及程序的编写,并焊接电路完成实物模型的制作,最后撰写出基于单片机的空气质量监控系统的毕业设计说明书一份。
1.1 方案选择
为了能够改善人们在车间长期工作导致的健康问题,本文拟设计一款带有温湿度功能的甲醛浓度监控系统,通过主控制器来控制各个模块运作,达到项目的要求,这就要求主控制器要具有高速运算的能力,能够将实时温度准确、快速的显示出来,并能控制风扇、加雾片运行,且开发环境完备、开发工具齐全。现阶段有很多控制器均可以满足上述要求,但考虑到成本和操作难易度,有两种方案最贴合实际。
方案一:采用DSP数字信号处理器来进行控制。它是利用数字的形式将信号转换成所需要的形式,高集成度,适用于运算量大的场合,广泛应用于数字控制和运动控制方面以及低功耗、便携手持设备中,但是成本较高[6]。
方案二:采用单片机进行控制。它是拥有中央处理单元、存储器、时钟、定时/计数器、多种功能的串行和并行I/O口的单片微型计算机[7]。它常应用于测控领域,可以通过数据寄存器实现对所使用的端口的控制,且具有完整的开发环境和开发工具,多种应用资料和价格低廉等特点。
根据以上两种方案,可以看出DSP与单片机都广泛的应用于工业自动化中,相比较于单片机,DSP注重数字信号的处理,较为复杂,适用于运算量大的场合,本身针对了不同的需求。而本次设计侧重于控制,并没有很大的运算量,因此,选择功能较为齐全、成本更为低廉的单片机为本设计的主控制系统就可以满足本次设计的需求。
1.2 系统控制原理
为了监测轮胎车间的空气质量,本设计利用单片机控制理论结合传感器检测原理来实现,此空气质量系统设计由温湿度采集模块、甲醛采集模块、参数显示模块、加湿及风扇控制模块、按键模块以及报警模块组成[8]。采用单片机作为微控处理器协助系统各模块的运行,利用温湿度传感器采集参数,并通过显示模块来显示数值,利用按键来设置温湿度限值的报警控制值。设计主要包括三个方面,一个是设置温湿度,根据车间内生产的轮胎等物品及人们适宜的最佳温湿度设置限值;二是报警加湿功能,当低于湿度设定值时触发报警并立即启动雾化片进行加湿,保持车间内的湿度正常;三是报警风扇系统,设置甲醛检测限值,超限则触发报警,蜂鸣器发出警报声及风扇转动,以保证车间内空气质量稳定。风扇启动,将外界空气带入车间内,缓解车间内部有毒气体,在达到降温效果的同时还能起到排风作用,保证车间内部空气通畅,防止轮胎生产时的甲醛浓度增加影响人们的身体健康。系统设计框图如图1.1所示。
图1.1 系统设计框图
2系统硬件设计
2.1 单片机的选择与设计
为了实现课题要求,需要选择一款最适合的单片机来作为主控制器。因为本设计中涉及到温湿度采集模块、甲醛采集模块、显示模块、按键模块、报警模块、加湿及风扇模块。其中,温湿度采集、甲醛采集和按键是输入,显示屏、蜂鸣器、加湿片和风扇是输出,所以需要单片机的I/O口要多,对单片机的处理速度也有一定的要求,且因为需要记录温湿度及甲醛浓度数据并显示,为了方便后期调试,还需要选择可重复烧写程序的单片机,就目前情况,满足条件的单片机有STM32系列单片机和51系列单片机。
首先,传统的51单片机操作简单,具有实行各种功能的指令,但A/D、EEROM等功能需要靠扩展才能运行,使单片机高负荷工作,运行速度缓慢,易高热引发损坏[9]。
对于本次设计,我们选择的是32位微控制器,最高工作频率为72MHz的经济型半导体微控制器STM32F103C8T6单片机,具备性能高、功能消耗低、电路集成等特点,内部自带阻容震荡器、复位电路和时钟模块[10]。此单片机和51系列相比多了很多功能,不但运行速度比51单片机要快很多,自带两个AD转换,使我们在进行甲醛模块设计的时候免去了需要加外部ADC进行转换,非常方便。STM32还有着很强大的通信功能和控制功能。这一点是51单片机无法比拟的。STM32单片机比51单片机多了4个串口进行通信,所以对一些要求用串口进行通信的模块而且就不需要通过CD4052等双串口模块来转换,所以这一点被市场上广泛的运用,32单片机因为本身可以进行多种不同的时钟模数来进行工作,所以在功耗要求比较严格的产品中占有一席之地[11]。综上,最终选择满足课题要求的STM32F103C8T6单片机作为本次设计的主控制器。
STM32是基于Cortex-M3内核的32位的微控制器。20~64K字节SRAM,功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz[12]。
引脚图如图2.1所示。
图2.1 STM32F103C8T6引脚图
主要特点:
引脚个数为48个。
工作频率为72MHZ。
单片机具有2个32位/16通道的ADC模数转换。
使用了3.3V稳压芯片,可以保证最大输出300MA电流。
支持ST-LINK和JTAG调试下载。
存储资源为64kb byte FLASH和20byte Sram。
2.2 温湿度模块设计
2.2.1 温湿度传感器选择
因为本设计需要实时检测车间内的温湿度,根据轮胎所需的车间内温湿度自行设置限值,以此来控制加湿片启动,使车间内温湿度趋于稳定。因为橡胶制品在空气中与氧气发生化学反应易老化和发霉,造成轮胎质量下降、安全性降低等问题,所以必须有一个严格的温湿度范围,一般温度在-10℃-25℃之内,湿度在50%-70%RH之内[14]。因此,使用低功耗、稳定性高的温湿度传感器对车间内温湿度进行监控,并转换为数字信号显示在显示模块上,保证轮胎正常生产加工及贮藏。目前市面上符合要求的主流温湿度传感器有以下两种。
一种是HMP60温湿度传感器,该传感器适合于实验室用的电气设备的场合。但此传感器是探头形式,运用到工厂不易操作且价格昂贵不适用此设计。
一种是DHT11温湿度传感器,40bit二进制数据输出。测量范围:湿度20-90%RH,温度0~50℃[15]。它长期使用也可保持稳定,耗能低,它有四个引脚,可以实现测温功能。
因此,此设计的温湿度采集模块将选用能快速进行采集与处理,价格合适、质量高的DHT11。DHT11实物图如2.3所示。
图2.3 DHT11实物图
2.2.2 温湿度采集原理
本设计采用的是DHT11数字温湿度传感器,它是一款含有已校准数字信号输出的温度和湿度的复合传感器。
DHT11温湿度传感器如果在化学物质复杂的条件下会腐蚀里面的元器件,易发生失灵和老化,性能下降,使用效果不佳,影响测量;如果在一个正常的工作环境下可以长期使用。
DHT11温湿度传感器内部分包括一个随湿度变化而变化的传感器和一个热敏电阻,它在3.5~5.5V可以正常工作,且不需要进行模数转换,这大大简化了硬件设计。
DHT11一共有4个引脚,1脚为VDD连接外部的3~5V电源。其中2脚可接单片机I/O口,3脚可不接,4脚为GND,接地端。这款温度传感器转换时间为75ns,比传统DS1820速度要快很多[16]。检测的结果以数字量方式串行传送。
DHT11温湿度传感器模块电路图如图2.4所示。
图2.4 DHT11温湿度传感器电路图
2.3 甲醛采集模块设计
测量电路由单片机串口和甲醛模块进行串口通信。甲醛传感器由甲醛探头和CH20传感器组成[17]。其原理是将传感器接触到的被测气体立即转化为数据并传输到单片机中,并通过元器件读出数值,一旦超过设置的数值立即报警。
本设计选用空气质量模块,利用电化学原理对空气中存在的甲醛气体进行采集。该模块是一种气体模块,它将电化学的原理与电路设计相结合。它具有使用方便、不易受外界影响、性价比高的特点。
表2-1 传感器参数表
名称 甲醛传感器CH2O/S-10
干扰气体 酒精,一氧化碳等气体
输出数据 UART输出
工作电压 3.3V或5V
预热时间 ≤3分钟
响应时间 ≤60秒
恢复时间 ≤60秒
量程 0~1.00 mg/m3
分辨率 ≤0.01 mg
工作温度 0~50℃
工作湿度 15%RH-90%RH
存储温度 0~50℃
使用寿命 5年(无腐蚀空气)
甲醛模块电路图如图2.5所示。
图2.5 甲醛模块电路图
其中,1-(GND)电源负端,2-UART(TX)电源输出,3-UART(RX)电源输入,4-(VCC)电源正端。
2.4 显示器模块设计
本设计需要清晰的显示出温湿度限定值、实时温湿度与甲醛指数,显示的内容较多,而传统的数码管显示这些内容显然很困难,还要求单片机供电为5V。因此,选择便于控制、容易实现功能、可显示各种字符的性价比更高的LCD液晶显示屏作为本设计的参数显示模块。
LCD液晶显示屏,是集电子和信息处理等多种技术相结合的一种数据显示,它具有非常强大的显示能力,可以一次显示32个字符及各种其他字符,显示器中的字符是5*7的点阵组成的,显示分辨率高。同时,在传输数据时它既可以使用并行也可以使用串行传输,无论哪一种传输方式,在控制方面难度都比较低,容易实现功能。与LED显示屏在单片机技术中的运用相比,性价比更高且使用范围更广,成为了最受欢迎的显示器件。具备成本低、无辐射、易处理、使用便捷、使用年限长等特点。
液晶显示器是由彩色或者黑白像素组成的显示屏,具备简单、灵敏、功耗较低等特点,现在市面上的液晶显示屏,主要有字符型和汉字型液晶显示器,如汉字型LCD12864液晶显示屏、字符型LCD1602液晶显示屏[18]。
由于本系统并不需要直接显示汉字,因此显示模块选择价格相对较低的LCD1602液晶显示屏。
LCD1602的液晶连接电路如图2.6所示。
图2.6 LCD1602电路图
模块中的VSS为接地端;VDD接5V电源;VL为液晶显示器对比度调整端;RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;R/W为读写信号线,高电平时进行读操作,低电平时进行写操作;E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令;D0~D7为8位双向数据线。其内部储存了大量字符,包括外文字符和数字等,多数情况都可以使用。
2.5 按键模块设计
由于本系统只有转换命令、数值加、数值减这3个控制命令,所需按键较少,所以本系统选择独立式按键。如图2.9所示,按键K1的作用是完成进入设置界面,转换设置的参数以及退出设置界面,K1第一次按下时,此时将进入湿度设置界面,如果低于设定值报警时字符闪动(需要结合液晶的控制代码来完成),按下第二次时,进入温度设置界面,按下第三次时,进入甲醛浓度设置界面。再按下K1按键,就跳出参数设置,进入到主界面。按键K2的作用是选中的参数数值上加,按键K3的作用是选中的参数数值下调。
按键连接电路图如图2.7所示。
图2.7 按键连接电路图
K1、K2、K3这3个按键一端接地,另一端分别连在单片机的B12、B13、B14的I/O口,在我们不操控按键的情况下,3个引脚全部出于断开不导通状态,当按键按下去时,此时单片机的引脚和地导通,使得该引脚的电平由高电平变为低电平。因为每个按键实现的操作功能都不同,因此在硬件模块组装时按键和单片机上的功能引脚,一定要按软件C语言编程与之相对应。
2.6 报警模块设计
本设计添加报警模块是为了可以使相关安全管理人员察觉到空气质量的异常,立即采取急救措施,同时防止突然启动加湿片和风扇浪费资源[19]。
报警模块电路图如2.8所示。
图2.8 报警模块电路图
此设计采用STM32单片机,单片机上电后引脚默认是低电平,所以使用8050蜂鸣器,使其高电平导通,就实现了蜂鸣器报警。
2.7 加湿及风扇模块设计
为实现低于湿度设定值立即启用加湿功能,本设计选用电压5V,电流300mA,功率2W,频率108KHz,孔数740,孔径5um的微孔雾化片。微孔雾化片在陶瓷片表面涂有特殊釉层保护层,能耐酸碱且无毒环保。它具有超细喷雾颗粒,大雾化量,电压低功率小、阻抗低效率高的特点。
加湿模块如图2.9所示。
图2.9 加湿模块电路图
如果高于设置的甲醛浓度则自动开启风扇,使其转动气流加速,减少室内甲醛浓度[20]。本设计选用电压5V,电流0.20A,转速为4500-9000RPM的风扇。
风扇模块如图2.10所示。
图2.10 风扇模块电路图
3系统软件设计
3.1 总流程方案设计
程序代码是一个单片机控制系统的灵魂,没有程序控制整个系统就不能运行。基于单片机的室内空气质量监控系统将利用Keil软件来编写C语言程序来驱动硬件的运行。本设计需要编写的模块程序包含了温湿度采集程序、参数显示程序、按键控制程序、声音报警程序。
系统软件设计主程序流程如图3.1所示,按下电源开关后,单片机开始工作,首先把温湿度采集模块以及液晶显示等相关模块进行初始化,初始化完成之后就开始进入while(1)循环中一行一行的执行代码。先从温湿度传感器中,可通过按键设置温湿度限值,其中,通过传感器检测到车间内温、湿度的变化,将获取到的参数显示在液晶屏上,利用按键限制数值,高于温度设定值触发报警,低于湿度设定值触发报警并启动雾化片实现加湿功能,当甲醛超出标准值时触发报警同时使风扇转动保持车间内空气流通,减少甲醛浓度。
系统软件主程序流程图如图3.1所示。
图3.1 系统程序主流程图
3.2 温湿度获取的软件设计
温湿度采集需要利用一定的时序才能获取具体的温湿度值,需要先根据DHT11生产公司提供的时序图,完成温湿度采集基本函数的编写,包含读取温湿度数据函数,写数据函数,匹配函数等,编写完函数后就调用函数完成温湿度的获取。
执行到获取温湿度的时候,首先对总线复位。复位不成功则返回值为1,成功则返回值为0,此时,则开始读取温湿度值,先发送跳过ROM操作的命令,发送读命令,接着读取温湿度低字节,然后读取温湿度的高字节,并合成16位的整型数,最后把判断复位成的变量取反。
温湿度采集软件流程图如图3.2所示。
图3.2 温湿度采集软件流程图
3.3 LCD1602的软件设计
本设计需要利用字符型液晶显示屏LCD1602来显示采集到的具体参数值。LCD1602的软件流程图如图3.3所示。
图3.3 LCD1602显示内容流程图
程序执行到需要利用LCD1602液晶屏来显示特定内容时,需要利用调用函数的方式来显示的内容。具体的显示的流程为:第一步,设置好显示固定字符的初始位置坐标值,也就是利用设置起始坐标函数设置起始坐标;第二步,等待液晶做好将要写数据的准备,如果液晶准备好就会返回数据0,否则返回数据1,直到液晶返回的数据为0为止;第三步,从指针str中把数据一个一个的从设置的起始位置处显示到液晶屏上,直到str写入的数据为结束字符’/0’,此时停止写数据,返回程序执行其他的代码。
4系统调试
4.1 硬件调试
本设计利用电路板来焊接实物,根据系统的方案与需求来购买相关材料。根据绘制好的系统原理图来焊接实物。在焊接过程中要及时检测焊接的电路是否存在虚焊,对照电路图检查是否存在焊接错误现象,以保证焊接的实物可以完成设计的全部功能。焊接完成后将Keil软件编译后的HEX文件下载到单片机上,通电后,检查硬件电路是否可以按照程序运行,完成预期功能。
4.2 软件调试
本次设计的空气质量监控系统,利用C语言的程序编写来实现预期功能,将采用模块化的程序编写方式来完成本论文的程序编写。实物焊接成功后将该驱动程序烧写到单片机中,多次修改直至实现本设计的全部功能。由于温湿度下限及实时温使度及甲醛浓度参数需要显示在LCD1602液晶屏上,因此第一步应该调试LCD显示屏,接着再建立LCD1602.C文件,在编写一个显示函数用于测试液晶屏最终显示的代码。最后建立main.c文件,编写该函数时先把之前建立的头文件(.h文件)包含在最前面,然后再编写voidmain()函数,在main()函数中调用显示函数,把数据显示出来,接着编译代码,生成hex文件,下载到开发板中,查看液晶屏是否按照编写代码的功能执行。如果执行成功,这样就可以完成显示模块的测试。接着可以利用LCD1602的显示功能来测试温湿度获取代码及甲醛浓度代码。这些模块都调通之后,就把功能结合起来在LCD1602.c中编写动作函数,在main函数中调用动作函数,这样就可以逐步的完成了整个控制代码的结合调试。通过这种方式就可以完成这个控制的代码的编写,该种代码编写方式各个C文件分工明确,一旦出现错误,查找非常方便。
结 论
本论文针对空气质量监控系统工作时所存在的问题,利用单片机微控制器的自动化控制功能结合传感器检测功能,设计出一种基于单片机的室内空气质量监控系统,并对其进行了论证与设计STM32F103C8T6作为本系统的控制器,完成系统的程序和总功能的控制执行。利用按键来设置参数的报警控制值,当采集到参数值出现异常时启动蜂鸣器报警,利用LCD1602显示相关参数信息,利用DHT11传感器采集当前的温湿度值,超出温度设定值可报警,低于湿度设定值启动雾化片实现加湿功能,并当甲醛超出标准值时控制风扇转动保持车间内空气流通,减少甲醛浓度。利用keil软件来编写C语言程序代码驱动各硬件模块来实现功能,经软硬件实物调试后,最后完成实物设计实现基于单片机的空气质量监控系统。
在此次毕设中我认为首先要有大体思路计划要实现的功能;其次根据功能去选择相应的硬件型号;再次将一个大的系统进行模块化划分,然后再根据模块进行设计。最后把所有模块进行优化整合,便得到了一个完整的系统。基于这样的思路,最终完成了基于单片机的空气质量检测系统的基本设计。本设计虽然有一定的市场应用前景,但是仍需进一步的改善与提高。目前,不仅刚装修完的室内需要检测温湿度和甲醛气体,同样工厂车间中温湿度和甲醛含量也需要检测。如果吸入大量甲醛会对人体健康造成不可逆的伤害,所以在未来设计一个不仅能够满足生活需要而且还要携带方便的温湿度和甲醛检测仪受到了人们的高度重视。
从这次的毕业设计中,我真真正正的意识到,在以后的学习工作中,要理论联系实际,脚踏实地将所学的理论知识运用到实际中,我想这就是我在这次毕业设计中的最大收获。
参考文献
[1]王耀平. 基于单片机的温湿度监测系统[J]. 电子测试, 2017(4).
[2]Yue-Lin D , Unit N O , Troops. The Realization of Low Power Dissipation Temperature and Humidity Collector Based on STM32[J]. Computer engineering & Software, 2015.
[3]Shigang Cui. Design of a Temperature and Humidity Monitoring System for Plant Growth Cabinets Based on Data Fusion[C]. 中国自动化学会智能自动化专业委员会.2017中国智能自动化会议(CIAC 2017)论文集.中国自动化学会智能自动化专业委员会: 中国自动化学会智能自动化专业委员会, 2017: 375-381.
[4]仝庆华. 基于单片机的甲醛监测报警系统[J]. 山西大同大学学报(自然科学版), 2011(2).
[5]范卫,王法弟,贾晓东,金复生,金锡鹏. 近十年国内有关甲醛的环境与职业危害调查研究[J]. 劳动医学, 2004(2).
[6]金福杰. 便携式室内空气甲醛快速连续监测系统设计研究[J]. 环境科学与管理, 2018(6).
[7]张毅刚,王少军,付宁编著. 单片机原理及接口技术 第2版[M]. 北京: 人民邮电出版社, 2015.01.
[8]张晴,刘青正. 基于单片机的仓库温湿度智能测控系统[J]. 电子世界, 2019(21).
[9]姚希文. 基于STM32的空气质量监测系统的设计[C]. 天津市电子工业协会.天津市电子工业协会2019年年会论文集.天津市电子工业协会: 天津市电子工业协会, 2019: 124-127.
[10]张淑清等编著. 嵌入式单片机STM32原理及应用[M]. 北京: 机械工业出版社, 2019.10.
[11]郑定超. 基于STM32的嵌入式实验教学平台设计[J]. 电子世界, 2016(21): 17-18.
[12]武奇生编著. 基于ARM的单片机应用及实践STM32案例式教学[M]. 北京: 机械工业出版社, 2014.06.
[13]李惠东,桂宏远,纵榜峰. 基于STM32单片机室内有害气体安全监测系统的设计[J]. 数字化用户, 2018(28).
[14]任衍峰,陈建军,李卫国. 环境温湿度对轮胎硫化性能的影响[J]. 轮胎工业, 2017(10).
[15]许岩,全书海,魏五星. 燃料电池发动机空气加湿器的设计[J]. 仪表技术, 2009(12).
[16]颜丽娜,王顺忠,张铁民. 基于DHT11温湿度测控系统的设计[J]. 海南师范大学学报(自然科学版), 2013(4).
[17]段晓丽. 一种基于单片机的甲醛浓度监测系统的设计[J]. 电子技术, 2013(11).
[18]胡祖芳,林峻光,史春笑. 基于LCD液晶屏的温湿度显示[J]. 科技展望, 2017(17).
[19]万松峰. 基于ARM&LINUX的手持式室内甲醛气体检测设备设计[J]. 西华大学学报(自然科学版), 2013(2).
[20]彭璐佳,张莉萍,黄勃,谭莲子,童宏伟. 基于STM32的车载智能风扇系统的设计与实现*[J]. 传感器与微系统, 2018(12).
附录1 原理图
附录2 源程序清单
主程序:
#include “led.h”
#include “delay.h”
#include “sys.h”
#include “timer.h”
#include “usart1.h”
#include “LCD1602.h”
#include “string.h”
#include “stdio.h”
#include “dht11.h”
u16 CH20_MAX_val = 100;//甲醛报警值
u16 CH2O_mgvalue = 0;//甲醛
void Change_data_handle(void);
void SHOW_AND_BAOJING_Handle(void);
u8 KEY_SCAN(void);//按键函数
u8 SHOW_BUF[16],SEND_BUF[16];
u8 key,Temperature,HUM;
u16 HUM_MIN=15;//湿度下限初始值
extern char RxCounter,Usart1RecBuf[64];//串口1接收数据缓存
extern char bUsart1RecFlag; //串口1收到数据标志位
void Get_CH2O(void)//获取甲醛
{
char i = 0;
if(Usart1RecBuf[i+5] == Usart1RecBuf[i]+Usart1RecBuf[i+1]+Usart1RecBuf[i+2]+Usart1RecBuf[i+3]+Usart1RecBuf[i+4])//校验
{
CH2O_mgvalue = Usart1RecBuf[1]*256 + Usart1RecBuf[2];//计算甲醛
bUsart1RecFlag = 0;
}
RxCounter = 0;
}
int main(void)
{
u16 test,test_adc;
delay_init();//延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
KEY_IO_Init();
Usart1_Init(9600);
TIM2_Int_Init(1000,72-1);//定时器初始化,定时1MS
delay_ms(300);
DHT11_Init(); //DHT11初始化
BEEP_DISENABLE();//蜂鸣器初始化
LCD_Init();//1602初始化
LCD_Write_String(0,0," “);
while(1)
{
DHT11_Read_Data(&Temperature,&HUM);//读取温湿度值
Get_CH2O();//获取甲醛值
SHOW_AND_BAOJING_Handle();
Change_data_handle();//按键调节
delay_ms(100);
}
}
extern u8 FLICKER;
void SHOW_AND_BAOJING_Handle(void)
{
unsigned char show_buf[16];//显示缓存区
sprintf(show_buf,“TEMP:%02dC”,(u16)Temperature);//转换显示格式为TEMP:00C
LCD_Write_String(0,0,show_buf);//显示
if(HUM <= HUM_MIN)//湿度低于下限
{
JSQ = 1;
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(9,0,” “);
}
else
{
sprintf(show_buf,“HUM:%02d%%”,(u16)HUM);//转换显示格式为HUM:00%
LCD_Write_String(9,0,show_buf);//显示
}
}
else
{
sprintf(show_buf,“HUM:%02d%%”,(u16)HUM);//转换显示格式为HUM:00%
LCD_Write_String(9,0,show_buf);
JSQ = 0;
}
if(CH2O_mgvalue >= CH20_MAX_val)FAN = 1;else FAN = 0;
if(CH2O_mgvalue >= CH20_MAX_val && FLICKER)//甲醛超限
{
LCD_Write_String(0,1,” ");
}
else
{
LCD_Write_Char(0,1,‘C’);
LCD_Write_Char(1,1,‘H’);
LCD_Write_Char(2,1,‘2’);
LCD_Write_Char(3,1,‘O’);
LCD_Write_Char(4,1,‘:’);
LCD_Write_Char(5,1,CH2O_mgvalue/100+‘0’);
LCD_Write_Char(6,1,‘.’);
LCD_Write_Char(7,1,CH2O_mgvalue%100/10+‘0’);
LCD_Write_Char(8,1,CH2O_mgvalue%10+‘0’);
LCD_Write_Char(9,1,‘m’);
LCD_Write_Char(10,1,‘g’);
LCD_Write_Char(11,1,‘/’);
LCD_Write_Char(12,1,‘m’);
LCD_Write_Char(13,1,‘3’);
}
if(HUM <= HUM_MIN|| CH2O_mgvalue >= CH20_MAX_val)//温度湿度甲醛超限
{
BEEP_ENABLE(); //蜂鸣器报警
}
else
{
BEEP_DISENABLE();
}
}
u8 KEY_SCAN(void)
{
u8 res = 0;
if(!KEY1)
{
delay_ms(10);
if(!KEY1)
{
while(!KEY1);//卡死
res = 1;
}
}
if(!KEY2)
{
delay_ms(10);
if(!KEY2)
{
while(!KEY2);//卡死
res = 2;
}
}
if(!KEY3)
{
delay_ms(10);
if(!KEY3)
{
while(!KEY3);//卡死
res = 3;
}
}
return res;
}
void Change_data_handle(void)
{
u8 key;
static u8 MODE = 0;
key = KEY_SCAN();//读取按键值
if(key == 1)//按键1按下
{
MODE++;
LCD_Clear();//清屏
delay_ms(100);
}
while(MODE)
{
key = KEY_SCAN();
switch(MODE)
{
case 1: //设置湿度
LCD_Write_String(0,0,“Set the HUM “);
LCD_Write_String(0,1,“min:”);
LCD_Write_String(8,1,”%”);
if(key == 2 && HUM_MIN < 99) HUM_MIN += 1;//按键2按下,值加1
if(key == 3 && HUM_MIN > 0) HUM_MIN -= 1;//按键3按下,值减1
LCD1602_write_long(6,1,HUM_MIN,2);
delay_ms(10);
break;
case 2: //设置甲醛
LCD_Write_String(0,0,"Set the CH2O ");
LCD_Write_String(0,1,“max:”);
LCD_Write_String(9,1,“mg/m3”);
if(key == 2 && CH20_MAX_val < 999) CH20_MAX_val += 1;//按键2按下值加1
if(key == 3 && CH20_MAX_val > 0) CH20_MAX_val -= 1;//按键3按下值减1
LCD_Write_Char(5,1,CH20_MAX_val/100+‘0’);
LCD_Write_Char(6,1,‘.’);
LCD_Write_Char(7,1,CH20_MAX_val%100/10+‘0’);
LCD_Write_Char(8,1,CH20_MAX_val%10+‘0’);
delay_ms(10);
break;
default: break;
}
if(key == 1)
{
MODE++;
LCD_Clear();
if(MODE == 3)//按下次数等于3退出设置
{
MODE = 0;
}
}
}
}
LCD1602程序:
#include “LCD1602.h”
#include “delay.h”
#include “sys.h”
u8 BitReversed(u8 x)//把8位数按位逆序
{
u8 temp[8];
u8 i = 0;
u8 j = 7;
u8 result = 0;
for(i = 0;i<8;i++)
{
temp[i] = (x>>i)&0x01;
}
for(i = 0;i<8;i++)
{
result = result|(temp[j]<<(i));
j–;
}
return result;
}
void LCD_Check_Busy(void)
{
LCD1602_RS0;
delay_us(1);
LCD1602_RW1;
delay_us(1);
LCD1602_EN0;
delay_us(1);
GPIO_Write(GPIOC,0Xff);
delay_ms(1);
LCD1602_EN1;
delay_us(100);
}
void LCD_Write_Com(unsigned char com) //写入命令函数
{
LCD1602_RS0;
delay_us(1);
LCD1602_RW0;
delay_us(1);
LCD1602_EN1;
delay_us(1);
com = BitReversed(com);
GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+com);
delay_us(100);
LCD1602_EN0;
}
void LCD_Write_Data(unsigned char Data) //写入数据函数
{
LCD1602_RS1;
delay_us(1);
LCD1602_RW0;
delay_us(1);
LCD1602_EN1;
delay_us(1);
Data = BitReversed(Data);
GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Data);
delay_us(100);
LCD1602_EN0;
}
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) //写入字符串函数
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) //写入字符函数
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
void LCD1602_write_long(unsigned char x,unsigned char y,u32 data,unsigned char num)
{
unsigned char temp[12],i = 12;
while(i–)
{
temp[i] = ’ ';
}
temp[num] = ‘\0’;
while(num–)
{
if(data || data%10)
temp[num] = data % 10 + 0x30;
data = data/10;
}
LCD_Write_String(x,y,temp);
}
void LCD_Clear(void) //清屏
{
LCD_Write_Com(0x01);
delay_ms(5);
}
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOA GPIOB GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHZ
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15; // LCD1602 RS-RW-EN?
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHZ
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOC
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x08); /显示关闭/
delay_ms(5);
LCD_Write_Com(0x01); /显示清屏/
delay_ms(5);
LCD_Write_Com(0x06); /显示光标移动设置/
delay_ms(5);
LCD_Write_Com(0x0C); /显示开及光标设置/
delay_ms(5);
}
DHT11程序:
#include “dht11.h”
#include “delay.h”
void DHT11_Rst(void)//复位DHT11
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//SET INPUT
while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
u8 DHT11_Read_Bit(void)//从DHT11读取一个位;返回值:1/0
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待变为低电平
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待变高电平
{
retry++;
delay_us(1);
}
delay_us(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
if(buf[0] < 100) *humi=buf[0];
if(buf[2] < 100) *temp=buf[2];
}
}else return 1;
return 0;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PG端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PG11端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO口
GPIO_SetBits(GPIOA,GPIO_Pin_8);//PG11 输出高
DHT11_Rst();//复位DHT11
return DHT11_Check();//等待DHT11的回应
}
致 谢
本次方案设计是孟军红老师和张有成老师的悉心指导和严格要求下完成的,从课题的选取、方案的论证到具体的设计和调试,无不凝聚着孟老师的心血和汗水,尤其是在方案设计方面,更是给我带来了许许多多的思路和建议,指点我走上本次设计的正轨。正是两位老师不辞辛苦的指导,才使得我的毕业设计能够在规定时间内顺利完成。在此,我要感谢孟军红老师和张有成老师的谆谆教诲,还要感谢大学四年学习生涯里育我成才的各位老师,是你们的无私奉献、爱岗敬业,使我掌握了专业知识,更是能将专业知识与现实问题相结合,解决相应问题。同时也要感谢在平时的学习中不厌其烦帮助我的同学们,是他们的悉心帮助才让我不轻言放弃,对学习有了钻研的尽头。在学习中我们互相帮助,互相鼓励,使我能够顺利完成自己的学业。还要感谢学院的培养与学校为我们创造的良好的学习环境。
通过这次毕业设计,我学到了四年大学课堂上无法学到的知识和经验,学习到了很多比较前沿的产品的设计方法,更为重要的是,真正的体会到了一次做课题项目的经验,为我以后学习工作奠定了良好的基础。最后,再一次感谢各位老师与同学,是你们的帮助,我的毕业设计才能顺利完成,在这里致以我最诚挚的谢意。