目    录

1 绪论

1.1 课题研究背景

1.2 课题研究现状

1.2.1 国内研究现状

1.2.2 国外研究现状

1.3 课题的研究工作

1.4 主要研究内容

2 总体方案的设计

2.1 系统概述

2.2 元器件的选择

2.2.1单片机的选择

2.2.2粉尘传感器的选择

2.2.3烟雾传感器的选择

2.2.4甲醛传感器的选择

2.2.5液晶显示屏的选择

2.2.6数据存储模块的选择

3 硬件系统设计

3.1 硬件系统的组成

3.2 单片机系统模块

3.3 PM2.5测量模块

3.4 烟雾测量模块

3.5 甲醛测量模块

3.6 液晶显示模块

3.7 WiFi模块

4 软件程序设计

4.1 概述

4.2 软件搭建

4.3 云平台

5 调试及结果

5.1 实物制作

5.2 实物调试

5.3 成果展示

参 考 文 献

致    谢

附录A 最小系统代码全文

附录B ESP8266代码全文

1 绪论

本章主要阐述了基于单片机的空气检测系统设计的课题研究背景和研究内容。

    1. 课题研究背景

在计划经济年代,我国为了能够尽快赶上世界其他国家的综合国力,采用了牺牲环境为代价的经济发展模式,留下了很多的环境问题。诸如雾霾问题,空气质量偏低。但是当人民的生活水平日益增长,健康和养生成为了人民所关注的热点问题[1]。为了能过更好的解决空气质量的问题,对空气质量检测仪系统的设计和制作非常具有实际意义[2]。

1.2 课题研究现状

1.2.1 国内研究现状

空气质量是影响人民身体健康的重要因素,当前我国已经初步在全国103个城市中建立了空气质量监测站,并形成了全国空气质量监测网络,实现对重点环境问题的空气质量进行实施发布和预测工作[3]。监测工作内容包括对二氧化硫和氮氧化物等悬浮颗粒物的测量,而在珠江三角洲地区,则是建立了复合型的大气监测网络,主要是针对二氧化硫、氮氧化物、臭氧、可吸入颗粒物等问题的监测工作[4]。但是就当前我国环境空气质量监测系统发展现状来看,其中仍然存在一系列问题。

  • 制造工艺水平低。我国通过多年的研究发展,已经具备了空气质量检测仪器的制造能力,但受到相关核心技术和制造工艺等各方面因素的限制,相对于国外的生产制造而言,我国自主研发的仪器就显得较为粗糙,精确程度不高[5]。而且自主研发的仪器质量也存在很大的问题,在长期运行中,空气质量检测系统容易损坏,需要不断进行维修,同时,其稳定性比较差。
  • 检测内容不够全面。目前,我国的空气质量检测系统只能够检测一些比较常规空气污染物,比如二氧化碳,一氧化碳以及空气中硫等元素,只是基本做到了对空气质量的常规监测,但是,对于有机物,重金属的等相关的空气质量监测参数不全面,甚至在对一些特殊空气元素进行监测时不得不依赖于国外的设备进行[6]。
  • 空气质量检测系统网络不够完善。由于我国的一些核心技术和设备相较于国外存在很大的差距,使得我国的设备系统性能指标上也存在着一些差异,同时,我国的空气质量检测站覆盖率还比较低,主要覆盖的都是一些经济发展较好的大型城市[7]。并且集中于东南沿海一带。

1.2.2 国外研究现状

相较于国内而言,国外的空气检测系统更加的完善。在环境检测方面,国外要比国内更加领先,检测技术也更加的先进,并且在这个方面的产品也比国内更多[8]。甚至面对不同的场景拥有不同的空气检测系统,比如根据医院室内专门的空气检测系统,以及基于固态传感器阵列的常规室内空气检测系统,以无线传感器网络为基础的农业环境检测的系统等[9]。飞利浦公司也在生产和环境优化相关的产品,甚至针对生活环境中的气体,像一氧化碳还有甲醛这种对人体造成伤害的气体,还可以增加湿度和清洁细菌功能。在重金属污染物中,国外也是有相对完善和更加先进的设备以及技术来对其进行检测。

1.3 课题的研究工作

本次课题设计中,涉及到了众多传感器的使用,并且对于不同传感器与单片机的连接方式以及数据检测原理也都不同,也会用到液晶显示屏模块。总体来说,此课题是一个相对综合的设计。因此本课题中,需要着重解决各个元器件的使用方式以及相关代码命令的编辑调试工作,同时,要将传感器模块所检测到的数据通过云平台进行数据的保存以及读取,将读取所捕获的数据显示在OLED显示模块中。学会在设计中学习和运用,实现系统功能的完善。

1.4 主要研究内容

本系统主要是制作一个可以测量空气中PM2.5浓度、甲醛浓度和烟雾浓度的装置,并将传感器采集的信息显示在OLED液晶屏上,同时使用ESP8266WiFi模块实现数据的存储。在实物制作的过程中,需要对每个模块所使用的元器件进行筛选评估,对比出本系统中最为合适的元器件。同时了解每一个元器件的功能和使用方式。在确定好硬件的基础上,同时完成软件代码的编写,将各个元器件联合,实现最终预想的功能。

2 总体方案的设计

2.1 系统概述

本次课题具体可分为四大功能区,第一是测量模块,它包含了烟雾测量模块、甲醛测量模块和PM2.5测量模块。它们的主要功能是测量周围环境空气中各个因素的浓度信息,单片机将数据上传到显示模块和WiFi模块。第二是显示模块,主要是一块液晶显示屏,它的主要功能是将测量模块所获取的数据实时显示,实现数据的可视化。第三是单片机模块,主要是使用的Arduino开发板的最小系统,它是最为核心的部分,主要负责接收、处理并且传递测量模块的数据,同时使得各个模块联合起来[10]。第四是WiFi模块,主要是采用的ESP8266WiFi模块,其主要功能是将数据上传至云平台,实现数据的保存。

2.2 元器件的选择

本次课题将会涉及到多个元器件的选择,将通过查阅相关的资料、文献以及所要实现的功能,进行元器件之间的对比、研究。单一的实现某一功能的元器件很多,但在不同的场景下各有优势,同时也要考虑实用和成本的问题,最终确定本次课题最为合适的元器件。

2.2.1单片机的选择

单片机模块是本次课题的核心,他是主要的控制部分,实现对数据信息的传输和处理,也是各个模块联合工作的重要因素。

本次课题预选的单片机模块有两种,一种是STM32单片机,另一种是Arduino单片机模块。

STM32单片机是比较流行的单片机模块,但是其编程使用的是Keil编程软件,主要使用C语言[11]。部分功能实现收费,且编程较为复杂。而且成本也比较高,对于使用者来说STM32单片机模块比较陌生,使用起来较为困难。

Arduino UNO单片机是一款较为便捷灵活的单片机模块,其具有丰富的接口,没有复杂的单片机底层代码,其编程语言是较为简单易懂的C语言完成,使得新手在使用的过程中更加容易上手。而且其自由度、可拓展性能较高。其芯片封装有直插式引脚,方便在万能板上焊接,如图1所示。

 

图1 单片机开发板图

2.2.2粉尘传感器的选择

粉尘传感器采用的是GP2Y1014AU粉尘传感器,GP2Y1014AU粉尘传感器是夏普开发的一款光学灰尘监测传感器模块,在其中间有一个大洞,空气可以自由流过,它里面邻角位置放着红外发光二极管和光电晶体管,红外发光二极管定向发送红外,当空气中有微粒阻碍红外时,红外线发送漫反射,光电晶体管接收到红外,所以信号输出引脚电压发送变化[12]。可测量0.8微米以上的微小粒子、感知烟草产生的烟气和花粉、房屋粉尘等,体积小、重量轻、便于安装,如图2所示。

 

图2 粉尘传感器图

2.2.3烟雾传感器的选择

本次预选的烟雾传感器主要有两种,一种是离子烟雾传感器NIS-07,另一种为MQ-2烟雾传感器。

离子烟雾传感器安全性较高,容易焊接,但是其工作电源电压为9V,而且在工作过程中需要使用其配套的芯片来进行数据的处理,使用方式较为复杂,成本较高。

MQ-2烟雾传感器对液化气、天然气等灵敏度较高,具有良好的重复性和长期的稳定性,且为双路信号输出(模拟信号输出和数字信号输出),工作电压在5V左右,符合课题所选择的单片机模块供电电压。其次MQ-2烟雾传感器响应快、寿命长、成本低且驱动电路简单方便安装使用[13]。所以本次采用MQ-2烟雾传感器作为烟雾检测模块,如图3所示。

图3 烟雾传感器图

2.2.4甲醛传感器的选择

甲醛传感器采用了英国达特甲醛传感器模块WZ-S-K它的检测原理是利用了电化学原理图对空气中的甲醛浓度进行测量,其特点是测量精度较高,响应速度快,而且使用寿命长,功耗低,抗干扰能力强也不需要定期校准[14]。它的供电电压为3.3V到5V之间非常适合供电电压也为 3.3V 的芯片配合使用,如图4所示。

 

图4 甲醛传感器图

2.2.5液晶显示屏的选择

液晶显示屏的选择也是准备了两种。

一种是采用LCD12864模块进行设计,该模块字体大小为16*16,也就是能显示4行汉字,每行最多显示八个,且有字体库也是课程中学习使用的显示模块。但是在实际使用过程中发现,该显示模块为黑白屏,字体大小无法调整,其次是该模块连线较多,线路复杂,且成本高。

第二种是采用OLED液晶显示屏模块进行数据的显示,OLED显示模块虽然没有字体库,但是与单片机模块进行配合,可以显示大小不同的汉字。同时OLED有单色屏和彩色屏之分。可以根据课题需求自行选择。OLED显示模块体积小,连线少,方便使用者进行模块焊接,其成本也较为便宜,如图5所示。

 

图5 OLED显示模块图

2.2.6数据存储模块的选择

关于本课题数据存储方案的选择主要是有两个。

方案一:采用SD卡进行数据存储,SD卡存储空间较大,便于携带。但是SD卡材质轻薄,容易折损、丢失。在数据读取时也不方便,需要配套的SD卡读取器进行数据的读取。

方案二:使用ESP8266WiFi模块连接云平台进行数据的存储。该方案存储数据容量大,数据安全性高,可以通过WIFI连接到使用者的手机或者其他移动端,数据读取方便。且该模块较为方便,结合本次课题,为方便数据读取使用以及后期功能拓展,故而选择ESP8266为存储模块,如图6所示。

 

图6 ESP8266WIFI模块图

3 硬件系统设计

元器件选择确定之后,将着重于硬件系统的设计,主要是选用元器件的连线方式和在系统中主要的作用,分析硬件系统的功能原理。

3.1 硬件系统的组成

根据本次课题所需模块,以及结合整个系统所要实现的功能,决定硬件电路的连接方式,其硬件连接整体框架图如图7所示。电源模块为单片机最小系统提供3.3V或者5V电源。烟雾测量模块、PM2.5测量模块、甲醛测量模块作为系统的数据检测端输入,液晶显示屏模块用于数据的显示,WiFi模块主要是用于数据上传至云平台进行存储。单片机模块是本系统的核心,为整个系统联合提供运算和支持,使得系统能够实现预想的功能。

 

 

图7 硬件整体框架

3.2 单片机系统模块

本次课题主要使用的单片机为Arduino开发板的最小系统,主要是由ATmega328/P芯片、16M晶振以及两个22PF电容焊接而成。

ATmega328/P是基于增强RISC构架的低功耗CMOS 8位微控制器。通过在单个时钟周期内执行功能强大的指令,ATmega328/P可实现接近1MIPS/MHz的读写量[15]。其还有以下特点:

  1. 高性能、低功耗AVR8位微控制器。
  2. 先进的RISC体系结构。
  3. 高耐力非易失性内存段。
  4. 微控制器的特殊功能。
  5. 上电复位和可编程布朗出检测。
  6. 内部校准的振荡器。
  7. 外部和内部中断源。
  8. 六个睡眠模式:空闲,ADC降噪、电源保存、关闭、待机状态,和待机扩展。

本次所使用的ATmega328/P芯片共有28个引脚,每个引脚所对应的功能和编号各有不同,具体如图8所示。

 

图8 ATmega328/P芯片引脚图

ATmega328/P是一款运用十分广泛的芯片其基本参数如表1所示。

表 1 ATmega328/P基本参数

类别

集成电路 (IC)

核心处理器

AVR

闪存容量

32KB

EEPROM存储器容量

1KB

时钟频率

20MHz

接口类型

I2C, SPI, USART

电源电压

最小1.8V 最大5.5V

电源电压表面安装器件

表面安装

封装类型

TQFP

针脚数

32

工作温度范围

-40°C to +85°C

存储器容量, RAM

2KB

输入/输出线数

23

模数转换器输入数

8

速度

20MHz

程序存储器容量

32KB (32K x 8)

振荡器型

内部

包装

托盘

ATmega328/P芯片是整个系统的核心,它负责电路中的信号接收与输出以及数据的处理。在确定了芯片以及芯片引脚的所对应的功能以及芯片的基本参数后,就开始最小系统的电路设计和焊接,具体如图9所示。

 

图9 最小系统电路设计

图中所使用的16M晶振和22PF电容主要是为芯片提供时钟,一般两者搭配使用,否则芯片的工作频率会产生误差,严重时甚至是不能工作。

为了本次课题的方便,最小系统使用万能板焊接。整个最小系统实物图如图10所示。

图10 最小系统实物图

3.3 PM2.5测量模块

本次课题选用的是GP2Y1014AU作为PM2.5测量模块,它是由红外光散射原理制作而成。其可以测量香烟、灰尘等微小颗粒污染物。其相关参数如表2所示。

   

产品名称

GP2Y1014AU

供电电压

5~7V

消耗电流

最大20mA

清洁空气中的电压值

0.9V

最小粒子检出值

0.7μm

灵敏度

0.5V/(mg/m³)

工作温度

-10~65℃(该温度下可正常工作)

存储温度

-20~85℃(该温度下传感器参数不变)

使用寿命

5年

尺寸大小

46mm×30mm×17.6mm

重量大小

15g

表 2 GP2Y1014AU基本参数表

该模块一共有六个引脚。分别是 V-LED、LED-GND、LED、S-GND、VO、VCC。其内部结构图如图11所示。

图11 GP2Y1014AU内部结构图

GP2Y1014AU主要分为发射电路和接收电路两部分。其中引脚1、引脚2、引脚3连接的是发射电路,引脚3控制内部光源发射。引脚5和引脚6连接的是接收电路,负责内部光源的接收。当GP2Y1014AU模块中没有粉尘颗粒时,引脚3控制的内部光源无法被接收电路接收,模块显示无粉尘。当粉尘进入GP2Y1014AU模块时,内部光源经过粉尘颗粒的散射,到达接收电路,模块显示粉尘浓度。

GP2Y1014AU是通过输出电压大小来判定粉尘密度的,根据GP2Y1014AU使用说明书可以大致得到输出电压Vout和粉尘浓度M的表达式(供电电压为5V):

M=(5Vout-3)/29*1000单位为:mg/m3

输出电压与粉尘密度的关系如图12所示。

 

图12 输出电压与粉尘密度关系

由上图可知该模块最小输出值大概在0.9V,最大输出值大概在3.6V。但在实际的使用过程中,0.9V以下也是具有电压的,因此此图仅代表PM2.5浓度过高时的曲线图。

在GP2Y1014AU的实际使用过程中,对LED的时序也是有相关要求的,具体如图13所示。

图13 时序要求图

由图可见其规定的时序周期为10ms,红外从发射到接收需要一定的时间,为了得到一个检测有效值根据信号输出图可以得知将采样时间设置为0.28ms时可以得到一个稳定值。 信号输出图如14所示。

 

图14 信号输出图

当GP2Y1014AU粉尘检测模块时序和电压稳定时,其在洁净空气中,由于没有微小颗粒物进行光反射,接收端几乎接收不到内部光源,也就不会产生电压,或者电压很低,以此判断空气质量良好。当GP2Y1014AU粉尘传感器在粉尘较大或者烟雾浓度较高的环境下,由于空气中微小颗粒对内部光源进行反射,接收端光明电阻的电流导通量改变,使得接收端产生电压值。在使用该传感器模块时,在模块附件的电源与GND之间并联一个220uF的电容,用来稳定此处电路。在V-LED处串联一个150Ω的电阻接入5V电源。具体连接方式如图15所示。

图15 PM2.5模块连接图

3.4 烟雾测量模块

本次课题选用的烟雾测量模块主要是MQ-2烟雾传感器,也称为气体传感器。MQ-2气体传感器所使用的气敏材料是在清洁空气中导电率较低的二氧化锡[16]。当传感器所处环境中存在可燃气体时,传感器的导电率会随着空气中可燃气体浓度的增大而增大。

MQ-2在较宽的浓度范围内对烟雾等有良好的灵敏度,具有寿命长、低成本、驱动电路等优点,而且其具有信号输出指示。MQ-2烟雾传感器结构相对简单,使用起来也相对的容易,其结构图如图16所示:

 

图16 MQ-2结构图

MQ-2烟雾传感器模块对不同的测量气体有着不同的灵敏度,如下图3.4.2所示。同时在相同的气体含量环境中,环境中的温度和湿度也是会影响MQ-2烟雾测量模块的工作图17所示。

图17 MQ-2对不同测量气体灵敏度

图17中的纵坐标为传感器的电阻比(Rs/R0),横坐标为气体浓度。Rs 表示传感器在不同浓度气体中的电阻值,R0表示传感器在洁净空气中的电阻值[17]。

图18 相同浓度丙烷,空气温度和湿度对MQ-2的影响

图18中纵坐标是传感器的电阻比(Rs/ RS0}。Rs表示在含2000ppm丙烷、不同温/湿度下传感器的电阻值。RS0表示在 2000ppm 丙烷、20℃/55%RH环境条件下传感器的电阻[18]。

在本次课题中,主要是看MQ-2模块所反馈的模拟电压数值的大小来判断所测量气体浓度是否超标。MQ-2原理图如图19所示。

图19 烟雾测量模块原理图

3.5 甲醛测量模块

本次课题使用的甲醛测量模块是WZ-S-K型甲醛检测模组,它是由英国达特制造的。该模块能够直接将空气中甲醛含量转换成浓度值,采用标准的数字输出,方便使用者更直观的使用数据。具有测量精准度高、响应速度快、功耗低等特点。其主要有7个引脚,各引脚定义如表3所示。

表3 WZ-S-K引脚定义

Pin1

VCC

3.3V-5V

Pin2

GND

3.3V-5V

Pin3

RST

复位

Pin4

SW

程序接口

Pin5

NC

悬空

Pin6

TXD

传感器发送引脚

Pin7

RXD

传感器接收引脚

在甲醛模块使用的工程中,也需要了解其具体的使用技术指标如表3所示。

表 4甲醛模块技术指标

产品型号

WZ-S-K

检测原理

燃料电池

检测气体

 甲醛

检测量程

 0-2ppm

最大过载

 10ppm

供电电压

 5-7V

预热时间

 <3min

响应时间

T90<40S

恢复时间

 (T10 )<60S

分辨率

 0.001ppm

工作温度

 -20℃~50℃

工作湿度

 10~90RH非凝结

存储温度

 0~20℃

使用寿命

 5年正常使用

质保期

 12 个月

重量

 4g

甲醛测量模块的具体技术指标为使用者更好的使用元器件提供了基本的了解,在实际使用过程中具体电路连接原理如图20所示。

 

图20 甲醛模块原理图

3.6 液晶显示模块

本次课题选用的显示模块为0.96寸的OLED液晶显示屏。OLED液晶显示屏具有自发光的特性,其功耗低、屏幕可视角度大、对比度高等特点是其适应大众消费的主要特点。OLED供电电压可以是5V也可以是3.3V,不需要更改电源电路,更加符合课题所选用的系统模块。其主要有4个引脚,分别是GND、VCC、SCL、SDA。OLED原理图如图21所示。

图21  OLED原理图 

3.7 WiFi模块

本课题是用的是集成电路模块ESP8266WIFI模块,通过不同的指令操作可以实现不同的功能,其指令可以细分为四种类型:

  1. 测试指令:AT+=?;
  2. 查询指令:AT+?;
  3. 设置指令:AT+=<’’’>;
  4. 执行指令:AT+;

具体功能如下图22所示。

图22 ESP8266指令类型

在购买开发板之后,电脑端也要安装使用所对应的驱动程序。以及开发板的相关调试,本次课题主要是使用ESP8266的WiFi模块,进行数据的存储和读取。为了方便在使用过程中电路的连接,其芯片引脚图如下图23所示。

图23 ESP8266芯片引脚图

4 软件程序设计

4.1 概述

本次课题软件部分主要采用Arduino进行代码的编写和调试,主要包括烟雾浓度测量函数、PM2.5测量函数、甲醛浓度测量函数的编写,同时也会使用到云平台连接各个硬件,以及对云平台的设计和ESP8266WIFI模块功能的编写。同时要使各个传感器所收集到的数据通过ESP8266上传到云平台进行保存,同时使用OLED将传感器所获取的数据显示,在云平台界面同步显示。具体流程图如图24所示。

 

图24 系统函数流程图

4.2 软件搭建

本次课题使用的Arduino和ESP8266开发板主要使用Arduino IDE代码开发平台,其是一款便捷灵活、方便上手的开源电子原型平台。 其包含了各种硬件开发板以及软件代码编辑。使用的编程语言简单便捷,连接传感器方便。

相关Arduino软件到相应的官网即可下载。在本次主要说明ESP8266的使用过程中在Arduino中搭建ESP8266的编辑环境以及开发板扩展包。直接找到“点灯科技”官方平台进行扩展包的下载,具体如下图25所示。

 

图25 扩展包下载图

安装完毕过后会得到如图26所示的扩展包。

 

图26 ESP8266扩展包

扩展包安装完毕之后Arduino对应的可使用开发板选项中将会出现所安装的ESP8266的开发板信息,选择所使用的开发板名称,即可对ESP8266进行编程使用。如图27所示。

图27 开发板扩展

 

4.3 云平台

本次课题所使用的云平台是电灯科技的点灯.blinker手机APP,该APP下载可以在点灯科技官网下载对应手机版本,本人使用的是安卓系统手机,直接在应用商城中搜索即可下载使用。APP如图28所示。

图28 点灯APP

 

下载好点灯APP后,打开界面,将ESP8266与手机端连接。连接方式在点灯科技官网可以查询,具体如下图28所示。

 图29 连接图

添加之后,在Arduino中选中ESP8266型号,运行相应指令即可完成云平台连接。指令如图30所示。

 

图30 热点连接指令图

设备连接完毕之后,手机端APP界面如图31所示。

 

图31手机端界面

手机端APP界面可以根据作者需求自行设计。且连接方式较为简单。ESP8266连接完毕后,就可以在Arduino中运行下载相应的指令程序。

5 调试及结果

5.1 实物制作

本次课题所用元器件电路的连接需要先在面包板上进行初步的电路连接,初步的调试、规划元器件的线路,为后续在万能板中元器件的焊接做好准备。面包板接线实物图如图32所示。

 

图 32面包板元器件连接图

在面包板上设计好具体的线路连接后,使用万能板将元器件焊接。具体系统实物如图33所示。

图 33 系统焊接实物图

5.2 实物调试

在所有的元器件焊接完毕之后,需要将Arduino开发板所对应的代码拷入所使用的最小系统板中,同时ESP8266所对应的代码也需要上传到相应的硬件设备。然后需要对所焊接的硬件部分进行系统的调试。

将系统连接电脑端或者5V电源,观察设备的反应,然后按照显示模块、最小系统、PM2.5测量模块、甲醛测量模块、烟雾测量模块、ESP8266模块的顺序,对各个焊接的模块进行调试。

  1. 显示模块:硬件设备通电后,等待程序中的函数初始化。一段时间后,首先观察液晶显示屏上是否有显示,对照电脑端的代码程序,判断显示内容的正确性,如果显示屏上所显示的内容是代码所规定的内容,则说明显示模块工作正常,如图34所示。

 

图34 显示模块工作图

  1. 最小系统模块:将最小系统板中的TXD、RXD连接电脑端,通过Arduino将代码拷入最小系统中,电脑端显示上传成功,则说明最小系统工作正常。
  2. PM2.5测量模块:在硬件设备通电之后,可以点燃卫生纸,然后再熄灭,就会产生烟雾。将PM2.5模块放置在烟雾上,观察显示模块PM2.5的数值是否有明显的变化。如果显示模块中显示的数值变化,则说明PM2.5模块工作正常。如图35所示。

 

 

图35 PM2.5模块测试图

  1. 甲醛测量模块:甲醛模块对空气中甲醛含量测量较为敏感,可以使用生活中甲醛含量较高的物品去靠近甲醛测量模块,如油漆等,同样可以点燃香烟进行测试。观察显示模块中对应数值的变化,数值有明显变化则甲醛测量模块工作正常。
  2. 烟雾测量模块:烟雾测量模块对空气中的烟雾具有较高的灵敏度,可以点燃香烟或者使用打火机。将产生的烟雾靠近烟雾测量模块,其在检测到烟雾时,模块中自带的LED等将会亮起。同时观察显示模块对应数值变化情况,如果数值出现明显的变化,则烟雾测量模块工作正常,如图36所示。

图 36 烟雾模块测试图

  1. ESP8266模块:ESP8266模块的测试需要将手机端的热点打开,打开所使用的点灯Blinker APP,进入自定义的界面,看对应的数据显示栏所显示的数据是否和显示模块所显示的数据一样,如果显示的数据一样,则ESP8266模块工作正常,如图37所示。

图37 ESP8266测试界面

5.3 成果展示

所有的硬件设备都可以正常工作后,就可以对整个系统进行实物的展示,将整个系统的硬件和手机端软件结合。正常的进行系统功能的使用,如图38、39所示。

图38 整体系统使用图

 

图39 点灯平台数据图

 

最小系统代码全文
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11,12);//RX=11,TX=12 
//ESP8266
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET     4   //不用改    OLED
#define screen_x 128
#define screen_y 32
Adafruit_SSD1306 display(screen_x, screen_y, &Wire,OLED_RESET);
#define measurePin A0  //粉尘       
#define ledPower  7              
#define Sensor_AO A1//烟雾
#define Sensor_DO 6
unsigned int sensorValue = 0;
unsigned int samplingTime = 280;
unsigned int deltaTime = 40;
unsigned int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
int h2=0;
int a=3;
String inputString = "";  
boolean stringComplete = false;
 //甲醛
 #define DebugSerial Serial
 #define HCHOSerial Serial
unsigned char FucCheckSum(unsigned char *i, unsigned char ln);
byte buffer[9] = {};
Byte_Ask_Recever_Moce_Code[9]={0xFF,0x01,0x78,0x41,0x00,0x00,0x00,0x00,0x46};//切换到问答模式
Byte_Auto_Send_Mode_Code[9]={0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47};//切换到主动上传模式
//byte Ask_code[9]={0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//问答模式下,请求发送
byte Auto_code[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//主动上传模式,请求发送
int count = 0;
bool bufferComplete = false;
void setup(){
  display.begin(SSD1306_SWITCHCAPVCC,0x3C);
  pinMode(ledPower,OUTPUT);
  pinMode(Sensor_DO, INPUT);
  DebugSerial.begin(9600);
  HCHOSerial.begin(9600);
  mySerial.begin(115200);
  while (mySerial.read()>=0)
  {
    }
  Serial.begin(9600);
  for(int i=0;i<9;i++)
  {
    //HCHOSerial.write(Ask_Recever_Moce_Code[i]);
    HCHOSerial.write(Auto_Send_Mode_Code[i]);//根据需要打开注释切换模式
  }
}
void loop(){

  for(int i=0;i<9;i++){
    HCHOSerial.write(Auto_code[i]);//在问答模式下请求数据
  }  
  get_HCHO();
  h2 = (int)buffer[4]*256+(int)buffer[5];
  DebugSerial.print(" ppb ");
  DebugSerial.print(h2);
  DebugSerial.println(" ug/m3");
  bufferComplete = false;
  delay(1000);
   yuanqijian();
   words();
   display.display(); // 开显示
   delay(2000); 
   fenc();
   display.display(); // 开显示
   delay(2000); 
   jiaquan();
  display.display(); // 开显示 
  delay(2000);
  digitalWrite(ledPower,LOW);
  delayMicroseconds(samplingTime);
  Serial.print("空气质量数值:");
  Serial.println(voMeasured);
  Serial.print("当前实时电压:");
  Serial.println(calcVoltage); 
  Serial.print("P.M2.5浓度:");
  Serial.print(dustDensity);
  Serial.println("ug/m3");
  mySerial.println("f");
  mySerial.print(dustDensity);
  mySerial.println("y");
  mySerial.print(sensorValue);//y
  mySerial.println("j");
  mySerial.print(h2);
}
void yuanqijian()
{
  voMeasured = analogRead(measurePin);
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH);
  delayMicroseconds(sleepTime);
 
  calcVoltage = voMeasured*(5.0/1024);
  dustDensity = 170*calcVoltage-0.1;
  if ( dustDensity < 0)
  {
    dustDensity = 0.00;
  }
  sensorValue = analogRead(Sensor_AO);
Serial.print("烟雾浓度为 = ");
Serial.println(sensorValue);
if (digitalRead(Sensor_DO) == LOW)
{
Serial.println("烟雾浓度过高");
}
delay(1000);
  }
void words()//OLED显示:
{
  display.setTextColor(WHITE);//开像素点发光
  display.clearDisplay();//清屏
  display.setTextSize(1.5);//设置字体大小  
  display.setCursor(6,0);//设置显示位置
  display.print("The smoke concentration is:       ");
  display.println(sensorValue);
}
void fenc()

{ display.setTextColor(WHITE);//开像素点发光
  display.clearDisplay();//清屏
  display.setTextSize(1.5);//设置字体大小  
  display.setCursor(5,0);//设置显示位置
  display.print("PM2.5 concentration is:    ");
  display.print(dustDensity);
  display.println("ug/m3");
  }
  void jiaquan()
{  display.setTextColor(WHITE);//开像素点发光
  display.clearDisplay();//清屏
  display.setTextSize(1.5);//设置字体大小  
  display.setCursor(4,0);//设置显示位置
  display.print("The formaldehyde concentration is:    ");
  display.print(h2);
  display.println(" ug/m3");
  }
void get_HCHO()
{
  int flag_end = false;
  int flag_start = false;
  while (flag_end == false)
  {
    if (HCHOSerial.available() > 0) {//接收到数据
      byte inChar = HCHOSerial.read();
      buffer[count] =inChar;
      if (buffer[count] == 0xFF){//接收到起始标志
        count = 0;  
        flag_start = true;
        DebugSerial.println("start");
      }
      count++;
      if (count >=9){//接收9个byte数据
        count = 0;
        if (flag_start){
          for (int i = 0 ; i < 9 ; i++){
            DebugSerial.print(buffer[i], HEX);//以16进制输出接收到的数据
            DebugSerial.print(",");
          }
          DebugSerial.println("");
          if(buffer[8]==FucCheckSum(buffer,9)){ //校验  
            flag_end=true;
          }
        }
      }
    }
  }
}
unsigned char FucCheckSum(unsigned char *i, unsigned char ln){
  unsigned char j, tempq=0; i+=1;
  for(j=0; j<(ln-2); j++){
    tempq+=*i;
    i++; 
  }
  tempq=(~tempq)+1;
  return(tempq);
}
void serialEvent() {
  while (mySerial.available()) {
    char inChar = (char)mySerial.read();
    inputString += inChar;
    if (inChar == '\n')
    {
      stringComplete = true;
    }
      inputString = "";  
      stringComplete = false;
    }
  }


附录B ESP8266代码全文
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "094c55a3cbe5";
char ssid[] = "jjgw";
char pswd[] = "123321123456";
// 新建组件对象
BlinkerNumber Number1("num-ctg");//PM2.5
BlinkerNumber Number2("num-abc");//烟雾
BlinkerNumber Number3("num-jfr");//甲醛
float dustDensity=0;
int sensorValue=0;
int Y=0;int Z=0;int S=0;
String inputString = "";
boolean stringComplete = false;
void dataStorage()
{
  Blinker.dataStorage("num-ctg", Y);
  Blinker.dataStorage("num-abc", Z);
  Blinker.dataStorage("num-jfr", S);
}
void setup()
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Blinker.begin(auth, ssid, pswd);
  Blinker.attachHeartbeat(heartbeat);
  Blinker.attachDataStorage(dataStorage);
}
void loop()
{
  Blinker.run();
  serialEvent1();
}
void serialEvent1() {
  while(Serial.available()>0){
    char inChar = (char)Serial.read();
     inputString += inChar;
     if(inChar == 'f')
     {
      Y=Serial.parseInt();
      Serial.println(Y);
      Number1.print(Y);
     }
     if(inChar == 'y')
    {
      Z=Serial.parseInt();
      Serial.println(Z);
      Number2.print(Z);
      }
       if(inChar == 'j')
    {
      S=Serial.parseInt();
      Serial.println(S);
      Number3.print(S);  
      }
    }
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐