主页 > 案例大全 > 论文知识案例-基于Arduino的智能无线气体传感系统设计与开发

论文知识案例-基于Arduino的智能无线气体传感系统设计与开发

2021-06-08 16:53:44

  本论文中设计了一款基于Arduino的便携式无线气体传感器系统。很多本科教学过程中,乃至实验室中常常需要用到气体传感器。而市场上可购的气体传感器的价格往往偏高,而且功能一般较为单一。本设计中的气体传感器系统价格较低,成本不过几百元。其采用16位精度的AD芯片,系统的采样速率可轻松达到达10ksps(Sample Per Second)。由于采用Arduino编程,可操作性强,可以方便用户改变参数,以及更换所需要的传感器。该传感器系统带有三种基本功能,分别是单点采样,实时显示采样,以及高速采样并通过蓝牙传输数据,能够让使用者方便灵活地根据使用场景选择不同功能。

  由于开源DIY微电子价格低,并且具有集成开发接口,在研究教学领域已经变得日益重要。比如Arduino不仅具有用户控制,数据采集和分析等多种功能,还能与其他仪器方便连接,并且在网络上具有丰富的开发资源。本课题就选用了开源的Arduino制造了一款多功能可编程无线气体传感器系统。

  1.1课题的背景意义以及研究现状

  随着人类迈入21世纪,物质条件一天天更加丰富,人们对于生产生活的安全方面具有了更高的要求。

  然而一方面,严重的大气污染威胁着我们每个人的生命健康安全,值得我们每个人警惕。由于在过去的近30年里,我国作为发展中国家以“高污染、高能耗”的方法快速实现了工业化和现代化,虽然经济水平得到了长足的进步,同时也引发了包括空气污染在内的众多环境问题。根据《2018中国生态环境状况公报》显示,在全国地级及以上城市中,64.2%的城市环境的空气质量超标。由此可见,我国的大气污染问题还是非常严重,值得关注。另外大气的污染物包括有PM2.5、PM10、O3、SO2、NO2等等,种类繁多,其检测也相对困难,科研人员对其的检测和研究是十分有意义的[1-2]。

  另一方面,室内存在的有害气体更是与我们每个人息息相关。室内可能发生的危险主要有天然气和煤气泄漏还有甲醛等有毒气体超标等等。天然气中甲烷含量在95%左右,混合一定比例空气很容易与氧气反应产生剧烈爆炸。而煤气除了爆炸危险以外,更是会让人一氧化碳中毒,使人在睡梦中丧命。抽样调查研究表明,有42.55%的居民,在使用煤气之后没有关闭总阀门的习惯,有85.15%的居民没有安装烟雾报警器。甲醛普遍存在于各种装修材料中,尤其以人造板为甚,故新装修的房子中往往存在着大量的甲醛。甲醛除了会造成头晕喉痛胸闷等不良反应以外,对免疫系统会进行抑制,还会对人有致癌作用[3-4]。

  由此可见,对于气体探测的研究是非常重要的。但是目前市面上并没有一款价格低,并且具有多种功能,支持DIY的高速气体传感器。本文中的设计则有效弥补了这一点。

  1.2气体检测

  气体检测离不开气体传感器,然而气体传感器的种类庞杂,不同类型的传感器有不同的检测方法[5]。

  1.2.1气体传感器分类

  图1-1气体传感器分类

  1.2.1.1电学类气体传感器

  电学气体传感器就是指将气体浓度转化为电学参量,从而达到测量的目的。这种气体传感器主要分成电阻式和非电阻式,在实际使用过程中,最为常见的还是电阻式气体传感器。电阻式传感器有以下几种:接触燃烧式、热传导式和半导体式。本设计中用到的就是半导体式传感器,故在1.2.2中重点介绍。

  1.2.1.2光学类气体传感器

  光学类气体传感器常见的有两种,分别是红外光谱式气体传感器和光离子化式气体传感器。分别介绍如下:

  (1)红外光谱式:本方法的原理是利用不同气体有着不一样的红外吸收光谱,并且气体的浓度和其光谱吸收度在一定范围内是成正比的。通过分析待测气体的红外光谱就能够得到各种组分的浓度。

  (2)光离子化式:光离子化法英文缩写PID(Photoionization Detector),简记为PID法。其作用原理是让光源发出一定能量的光子,让气体分子发生电离,产生离子电流,进而检测出气体浓度。

  1.2.1.3电化学气体传感器

  电化学气体传感器,从某种程度上类似化学电池。令气体在工作电极处产生氧化或者还原反应,从而产生电化学电压,进而得到气体浓度。

  1.2.2半导体气体传感器

  半导体气体传感器的种类繁多,除了SnO2、ZnO等简单金属氧化物外,还有In2O3等的新型金属氧化物,同时,钙钛矿(ABO3)和K2NiF4(A2BO4)作为复合半导体材料也正在被研究[6]。

  传统的SnO2等金属氧化物,可以采用表面电荷层模型进行描述[7]。

  对于空气中的N型SnO2气敏材料来说,随着加热到一定温度,空气中的氧气分子将会以物理吸附过程或化学吸附过程附着在带有负电荷的半导体表面。其中物理吸附过程发生在低温状态(<150℃),表达式如下:

  (1-1)

  化学吸附过程发生在相对高温(150-200℃),表达式如下:

  (1-2)

  (1-3)

  如图1-2所示,吸附态的氧离子在晶粒表面形成了表面电荷层,导致势垒增高阻碍电子流动,从而令电阻增大。

  图1-2空气中SnO2气敏材料的表面电荷模型

  而当气体氛围中有酒精、CO等还原性气体的时候,还原性分子将迅速与氧离子团发生反应,表达式如下:

  (1-4)

  如图1-3所示,经过氧化还原反应后,产生的电子重新进入导带,从而令势垒降低,电导率增大,电阻变小。

  图1-3酒精气体中SnO2气敏材料的表面电荷模型

  1.3课题研究内容

  本设计旨在制作一款便宜,精确度高,具有高速传输能力,能够根据使用需求灵活扩展使用的传感器种类,可以通过蓝牙无线传输数据,同时具有三种采样模式,能够实时显示待测气体浓度,能够更换待测气体显示单位,方便学生学习,辅助老师教学,可供DIY爱好者修改的气体传感器系统。

  2系统总体方案设计

  2.1系统设计要求

  图2-1系统功能说明图

  如图2-1所示为系统具有的功能图示,以下是具体要求:

  (1)开机时显示Welcome画面,并蜂鸣提醒;

  (2)开机进入菜单,有三种选项,第一项开始气体检测,第二项查看历史,第三项基本设置;

  (3)气体检测分为三种模式,第一种单点采样,第二种实时显示采样,第三种高速采样;

  (4)基本设置界面中能够设定气体采样时显示的气体单位,同时可以设置高速采样时的时间间隔;

  (5)充分考虑到传感器的预热,调零等多种步骤;

  (6)气体检测时开启辅助检测的真空泵;

  (7)气体检测时开启紫外指示灯;

  (8)有效按键时蜂鸣器响;

  (9)高速采样时启动蓝牙传输功能;

  (10)留有烧写接口,在程序设计中留有充分的自由度,方便用户根据需要进行更改;

  (11)高速采样的最高速率应大于10ksps。

  2.2方案设计

  本设计采用了ATmega32u4作为主控芯片,这同时也是Arduino Leonardo的主控,可以方便地使用Arduino IDE进行烧写编程。理论上能够支持任何以5V电压驱动,并且有效输出电压在0-5V之间的气体传感器,甚至不必是气体传感器。本文中出于安全考虑,采用MQ-3酒精气体传感器。

  通过用户操作,可以开始进行气体测量,通过AD转换器将传感器输出的模拟电压信号转换为16位数字信号。并通过SPI接口传入单片机。单片机则根据当前所处的不同模式,选择将气体浓度显示在LCD上或是通过蓝牙传输到电脑或手机上。

  系统的结构图如图2-2所示。

  图2-2系统结构图

  系统主要分为6大模块:

  (1)采样模块:采样模块主要是包括了AD芯片,电压跟随器以及外接的气体传感器元件。气体传感器元件将气体浓度参数转化为电压模拟信号,AD又将模拟信号转化为16位数字信号从而传入给主控芯片。软件中则可以设置采样的三种模式,控制采样的开启和关闭,并且设置采样过程中的一些参数。

  (2)键盘控制模块:使用3x4矩阵键盘,其中“2”除了数字含义外还有“↑”向上翻阅菜单作用,“5”还有表示确定的作用,“8”还有“↓”向下翻阅菜单作用,“#”则有退回主界面的作用。

  (3)屏幕显示模块:显示屏幕采用较为简单的LCD1602屏幕,并且由于ATmega32u4芯片的接口数量不足,故采用IIC拓展接口的方法接入该LCD屏幕。

  (4)蓝牙输出模块:采用HC05集成蓝牙模块作为蓝牙输出,在实际编程时,可直接将蓝牙当作串口。

  (5)泵机控制模块:在采样过程中一直开启泵机,泵机采用的是12V电压,故可以采用一个三极管作为开关,使5V电压能够控制12V真空泵的开关。

  (6)12V-5V电源转换模块:电源供电采用12V锂电池。本模块将12V电压转换为稳定的5V电压供给单片机使用,另外12V电源也可以直接给泵机供电。

  通过将本系统拆分成六大模块,可以逐个模块完成。通过模块化的思维设计,能够大大提高设计的效率,步步为营地完成此次项目。

  2.3设计原理

  2.3.1 MQ-3传感器

  MQ-3传感器的有效材料是SnO2,作用原理在1.2.2部分中已经说明了。

  接下来在表2-1中列出MQ-3的一系列参数[8]:

  表2-1 MQ-3重要技术指标

  检测气体酒精蒸气

  检测浓度25-500ppm

  回路电压Vc≤24V DC

  加热电压VH 5.0±0.1V AC or DC

  负载电阻RL 18KΩ

  灵敏度S R0(in air)/RS(125ppm)≥5

  输出电压VS 2.5-4.5V(125ppm)

  浓度斜率α≤0.6(R300ppm/R50ppm)

  响应时间Tres≤10s

  恢复时间Trec≤30s

  预热时间TH 20s

  按照经验公式,在一定区间内输出电压VOUT增加0.1V,被测气体浓度增加20ppm。可以根据此经验公式估算出当前的气体浓度值[9]。

  图2-3 MQ-3分压电路

  另外若要测量并显示传感器的电阻值,电路图如图2-3所示,为MQ-3的基本检测电路。这就是一个简单的分压电路,公式如下:

  (2-1)

  其中RS是传感器电阻,RL是负载电阻,VC是回路电压,VOUT是传感器输出电压。已知负载电阻为18KΩ,回路电压为5V,而VOUT则是传感器输出给AD芯片的待测电压,即可求出RS,再可根据气体浓度对应关系得到气体浓度结果。

  2.3.2主控芯片ATmega32u4

  ATmega32u4同时也是开源微控制器板Arduino Leonardo的控制芯片,使用本芯片可以享受到Arduino开源电子开发平台丰富的库文件资源,以及各种详细资料的好处。

  ATmega32u4属于AVR单片机,使用RISC经典指令集,有135条指令,大多数单周期,乘法双周期,运行速率可达16MHz。在不借助Arduino平台的帮助下,直接用AVR指令进行开发是非常复杂的,需要了解单片机内部各种构造,熟知IO口,定时中断等的各种知识,还要了解各个寄存器的作用,并加以融会贯通的使用。但是如果是借助Arduino开发平台丰富的库文件,那么就没有必要了解单片机内部这么详细的知识,直接用库文件,简单调用函数就能够轻松使用种种复杂的功能。

  ATmega32u4与其它AVR芯片最大的不同就是自带了USB接口,可以免去其他芯片必须采用UART转USB的麻烦,甚至可以直接作为鼠标或者键盘接到电脑。

  接下来在表2-2中列出ATmega32u4的系列指标[10]:

  表2-2 ATmega32u4系列指标

  微控制器ATmega32u4

  工作电压5V

  I/O线道26条

  可编程PWM线道4

  8位定时器2

  10位定时器1

  16位定时器2

  Flash 32K

  SRAM 2.5K

  EEPROM 1K

  微控制器ATmega32u4

  工作电压5V

  I/O线道26条

  可编程PWM线道4

  PCINT中断8

  INT中断5

  另外ATmega32u4还支持UART、SPI、IIC等传输格式,还有片上输出比较调制器和片上模拟比较器。还有看门狗功能,并且片上自带晶振。总结来看是一款非常优秀的芯片。

  2.3.3 IIC端口拓展以及LCD显示

  首先说明所使用的LCD1602屏幕的特点。LCD1602是由16行以及2列一共32个显示单元组成的,每个显示单元则由5x8个可显示亮暗的点阵组成。一个显示单元可以显示一个符号,则LCD1602只能同时显示32个字符。

  单片机将要显示的数据传入LCD1602内部的显示数据RAM也即显存RAM中。每个显存RAM中存有一个字节的数据,对应着一个字符产生ROM中存储的字符模组,然后LCD1602就会将对应的字模从显存ROM中取出,从而进行显示[11]。

  LCD1602与单片机连接可以占据8个或者4个I/O口,为了节省I/O口,采用了IIC端口拓展的方式与LCD进行连接[12]。

  IIC(Inter-Integrated Circuit)全称集成电路总线,是一种半双工连接模式。

  图2-4 IIC总线连接图

  如图2-4所示,IIC仅有两条数据线,一条是SCL时钟信号线,另一条是SDA数据线。IIC协议的要点有以下三条:

  (1)数据稳定性:SCL时钟高电平期间SDA数据保持稳定,时钟低电平期间方可跳转。

  (2)起始和结束条件:SCL为高电平时,SDA出现下降沿为开始条件,SDA上升沿为结束条件。

  (3)应答(ACK):主机每传输8个比特,需从机应答一次,0为应答,1为不应答。

  如图2-5,现说明具体传输格式。发送数据时先发送MSB,主机在传输发送数据时首先发送7bit从机地址和1bit读写位,来确定从机对象以及确认接下来读写操作。读写位是“0写1读”。

  图2-5 IIC具体传输格式

  2.3.4 SPI端口以及AD芯片连接

  首先介绍SPI传输格式,SPI是一种单主机,双全工,串行口的传输格式。

  图2-6 SPI连接图

  如图2-6所示,SPI有四条数据线,分别是串行时钟口(SCLK),片选口(CS),主机输出从机输入口(MOSI)和主机输入从机输出口(MISO)。而且传输数据都是先传输高位MSB。

  SPI格式优点在于能够以比特为单位传输数据,能够通过控制SCLK信号达成这一点;缺点在于没有应答机制。

  SPI格式没有一个统一的规范,自由度较高,可以根据时钟极性(CPOL)和时钟相位(CPHA)两两组合得到四种不同的模式,如表2-3所示[13]。

  表2-3 SPI接口的四种模式

  MODE CPOL CPHA控制采样时钟沿时钟空闲电平

  0 0 0上升沿采样低电平

  1 0 1下降沿采样低电平

  2 1 0下降沿采样高电平

  3 1 1上升沿采样高电平

  采样过程中的ADC芯片选用Linear Technology公司开发的LTC1864。本芯片传输格式与一般的4线SPI不同,更加精简。只有SDO(Serial Data Out)和SCK口,没有片选SS和SDI,反而多了CONV(convert)控制信号口。根据图2-7中LTC1864工作时序可知,应该采用SCK上升沿采样,时钟空闲状态为高电平的的模式,也就是MODE3[14]。

  图2-7 LTC1864工作时序

  3系统硬件设计

  3.1接口及引脚配置情况

  图3-1 ATmega32u4最小系统

  如图3-1所示,为ATmega32u4主控芯片的最小系统图。在表3-1中将接口和引脚的配置情况列举如下。

  表3-1接口及引脚配置情况

  接口或引脚配置

  SPI接口(PB1、PB2和PB3)连接AD芯片以及ISP下载口

  IIC接口(PD0和PD1)连接LCD1602显示屏

  PD4、PD7、PE6和PB4-PB7 3x4矩阵键盘

  PC6真空泵开关

  PD5和PB0 TX和RX指示灯

  PC7 uvLED指示灯

  PD6蜂鸣器

  PD2和PD3蓝牙接口

  PF7 AD转换控制

  PF6传感器模块开关

  3.2各模块设计情况

  3.2.1气体传感模块

  图3-2气体传感器模块

  如图3-2所示为气体传感器模块。使用了LTC1864作为AD芯片,本芯片由单电源5V供电,具有16位精度,具有差分输入功能。AD的最大采样速率是250ksps(sample per second),主要是由于??????????转换时间较长达到了3.3us。而在实际运行过程中,程序运行也需要花费时间,比如检测按钮,比如蓝牙传输等操作都需要花费时间,那么实际最高采样速率应该在10-50kHz左右。如果减去不必要的程序,那么采样速率还能再高。

  考虑到传感器内源电阻非常大,有必要在前面加上高速电压跟随器。通过电压跟随器的高阻抗来减小对入端信号的影响,提高检测精度。另外还可以通过电压跟随器来减小,高阻抗时由于AD芯片中使用的电容再分配技术带来的电流尖峰影响。

  选用的是单电源驱动,增益带宽积为14MHz的高速运放LT1211。作为电压跟随器,闭环增益默认为1,则认为可以通过14MHz的高频信号,完全符合需求。

  使用R12、R13和C12是为了消除反射,当负载传感器的内阻过大时,电流就会在运放输入端和负载端形成震荡,此时会严重干扰信号的读取,故采用这样一个滤波结构用于滤除高频噪音信号。

  在传感器模块的公共地使用了一个三极管控制电源的通断,便于程序设计时控制传感器加热功能,并且节省电池电能。

  3.2.2电源模块

  图3-3电源模块

  如图3-3所示,为电源模块。采用了TI公司生产的LM2596这款5V稳压器,能够将12V电源稳定地转换为5V电源。需要确定入端电容值,输出端电容值以及L1电感值,以负载电流为3A为标准计算,查数据手册可以得到上述电容和电感的数值[15]。

  系统直接由12V锂电池供电,采用DC005封装的直流插头。在考虑单片机供电问题的时候,很重要的一点就是锂电池和USB供电端不能够同时给系统供电,否则就会产生电路故障。在这里充分利用了DC005的设计,在锂电池供电时,插上插头,就会让上图中USBGND端与公共地端断开,也即从物理上将USB推出电路从而达到了保护电路的目的。

  另外在选择封装的时候,应该要注意到,电感L1应该使用绕线电感,不能使用贴片电感,不然会在实际使用过程中出现问题。

  3.2.3真空泵模块

  图3-4真空泵模块

  如图3-4所示,为真空泵模块,J4两端口母头就是用来连接12V真空泵的。

  D5开关端口是属于5V电压体系,那么必须通过一个N沟道三极管作为开关才能够简单地控制通断。选用了IRF7403这一款N沟道MOSFET可以满足需求。

  3.2.4其它模块

  图3-5其它模块

  如图3-5所示,是其它模块的接线图。主要是一些外设转接模块。矩阵键盘就是外接3x4键盘,LCD采用LCD1602型号,蓝牙则使用HC05集成模块,能够直接当作串口使用。

  3.3 PCB设计

  3.3.1元器件封装管理

  硬件设计过程中使用开源的KiCAD5.1.5软件。它的封装非常齐全,可以在封装库中寻找对应元件封装。最终选用的封装如图3-6所示。

  图3-6元件及对应封装

  3.3.2 PCB绘制步骤

  创建工程后,进入原理图编辑器,画好原理图之后,首先在工具栏的“编辑符号字段”中,选择对应元件的封装。随后在菜单栏处点击“工具从原理图更新PCB”选项,从而创建新的PCB文件。

  打开PCB编辑器,即可看到封装元件和连接线了。具体操作如下:

  (1)画出PCB的边框。在层管理器中选择“Edge.Cuts”画出电路板的边框轮廓。然后选择“Margin”画出电路板的电气边界层,我选择电气边界层与边框轮廓的距离为0.3mm。

  (2)进行元件布局。将封装元件安放在合适的位置处,特别注意,要将插接件放在PCB板框边缘处。

  (3)连线。过程中可以使用过孔走线。并且GND、12V以及USBGND等电源部分可以暂时不连接。

  (4)设置禁布区,以及铺铜。选择“添加禁布区”将12V和USBGND等区域框起来,从而与外面区域隔开,并在电路板最外围铺上禁布区。随后进行铺铜操作,在工具栏“编辑填充所有区域”,即可完成铺铜。在top和bottom层做GND等电源层可以防止干扰。

  这就完成了PCB的绘制。随后进行DRC检错,如图3-7所示,没有出现bug。

  图3-7 DRC检错

  最终绘制出PCB板如图3-8所示。

  图3-8 PCB板及其3D图

  3.4本章小结

  在本章中,主要探讨了硬件的绘制,将硬件分为几个模块设计了原理图。首先是介绍了ATmega32u4引脚的使用情况。随后重点介绍了所使用的气体传感模块,使用了16位精度的高速AD芯片,并且前置电压跟随器以保证其精度。电源模块则采用12V锂电池供电,随后使用了12V转5V电压稳定器得到稳定的5V电压。

  画PCB板则使用了Kicad这个开源软件,使用了其中丰富的开源封装库文件。并经过了绘制边框,元件布局,连线,铺铜等步骤后绘制出了PCB板,并且通过了DRC检错测试。

  4系统软件设计

  4.1总体设计

  图4-1系统总体设计

  如图4-1所示,为系统的总体设计,思路的关键还是让用户翻看菜单查找对应想要实现的功能。从菜单栏中可以选择进入三个流程,分别是开始气体检测,查看过往历史以及设置显示单位和设置时间间隔。下面分不同模块介绍其子流程。

  4.1.1菜单设计子流程

  通过简单的菜单设计,从而达到便于用户交互的目的,其中显示模块使用到了Arduino平台中开源的LCD显示库文件,将在下一节中讲到。

  按‘2’起到上翻菜单的作用,按‘8’起到下翻菜单的作用,按‘5’起到确定并进入对应选项的功能。

  图4-2菜单流程图

  4.1.2气体检测子流程

  如图4-3所示,为采样过程的基本流程,关键变量有三个,分别是NUM,表征单词采样,所取的样点数量;INTERVAL_TIME,表征每个点采样的间隔;MAXIMUM_GAP表征采样时最大值和最小值之间的间隔,必须要小于此值,方能通过。包括调零在内,各种气体检测过程都使用到了采样流程。

  图4-3采样流程图

  另外模拟菜单流程图,将气体检测分为了三个部分,分别是快速单点采样,实时采样和高速传输采样。功能如图4-4所示。

  图4-4气体检测流程

  另外,为了方便DIY操作,在程序开头设置了可供用户DIY修改的部分。如表4-1所示。

  表4-1 DIY参数汇总

  DIY参数详情

  HEATING_TIME描述加热时间,单位s

  HEATING_INTERVAL_TIME描述必须再次进行加热的最大间隔时间,单位ms

  ZERO_SETTING_NUM描述调零时,采样多少次

  ZERO_SETTING_INTERVAL_TIME描述调零时,采样间隔时间,单位ms

  ZERO_SETTING_MAXIMUM_GAP描述调零时,采样最大值和最小值的差,数值表示16位数字量

  FAST_NUM描述快速单点采样时,采样多少次

  FAST_INTERVAL_TIME描述快速单点采样时,采样间隔时间,单位ms

  FAST_MAXIMUM_GAP描述快速单点采样时,采样最大值和最小值的差,数值16位数字量

  RealTime_NUM描述实时采样时,采样多少次

  RealTime_INTERVAL_TIME描述实时采样时,采样间隔时间,单位ms

  RealTime_MAXIMUM_GAP描述实时采样时,采样最大值和最小值的差,数值表示16位数字量

  ACQ_NUM描述高速采样时,采样多少次

  ACQ_INTERVAL_TIME描述高速采样时,采样间隔时间,单位us(必须是2的倍数)

  ACQ_MAXIMUM_GAP描述高速采样时,采样最大值和最小值的差,数值表示16位数字量

  ohm_Calculate此函数描述将16位数字量转化为ohm单位

  ppm_Calculate此函数描述将16位数字量转化为气体浓度单位

  4.1.3其它子流程

  (1)翻看历史记录子流程:将快速单点采样的数据存入芯片自带的EEPROM中,翻看历史记录选项中可以看到这些数据。

  (2)设置功能子流程:在设置中可以选择不同的单位,而且可以设置高速采样时的period值,最小分度值为0.1ms。

  4.2库文件介绍

  使用Arduino自带的库文件进行编程,首先就要了解各个库文件的功能,以及常用函数,详情已经包括在附录中的源程序的注释中。本设计所用的库文件如表4-2所示[16]。