【打印虎】中学生也可以!自制PM2.5检测器

近年来,全国各大城市雾霾的问题越来越严重,已经显著影响到大家的健康,到了必须引起重视的时刻了。为了让家人对PM2.5的情况有个了解,心中有数,虎哥专门研究了一下PM2.5检测器。研究之后,发现目前PM2.5检测器完全可以自己动手制作。虎哥作为一个DIY爱好者,自然心痒难耐,要自己动手搞一搞了。

经过一段时间的摸索,我总算完成了DIY PM2.5检测器的设计和制作。独乐乐不如众乐乐,为了让朋友们有一个健康的生活环境,以最便宜的价格获得一个PM2.5检测器,也为了让大家在制作过程中学习到一点单片机软硬件设计,以及一点点外观结构设计知识,我决定把PM2.5检测器的全部原始资料开源,作为2017年新春的礼物送给大家。源代码包下载链接在文章的末尾处,不想看文章的朋友可以直接把滚动条拉到最后下载。

image001

第一节,      在Arduino UNO上实现创意

在介绍设计细节之前,我们还是先说一下PM2.5检测器的设计需求。首先,我们需要的是一个PM2.5检测器。因此,具有测量PM2.5数值的功能,并且测试数值相对准确,是我们这个设计的第一项需求。第二,我希望设计一个结构简单、易于理解、易于制作、面向教学的PM2.5检测器。因此,“简易”这个条件可以算是另一项需求了。仔细想想,大概也就是这两项设计需求。在满足这些要求的前提下,我们的设计就要开始了。

电路方面,为了让整个设计简单易学,我采用了Arduino UNO作为电路设计基础。在第一节和第二节中,我会首先使用Arduino UNO对这个项目进行原始设计和测试,当测试通过之后,我会再进行PCB电路板的设计(第三节),以及外壳的设计(第四节)。这也就决定了,这个项目的MCU,将使用Arduino UNO的核心元器件ATMega328P。

作为一个PM2.5检测器,必然需要有PM2.5的检测模块。在这个项目中,我采用了国产的攀藤G7作为PM2.5检测模块。这个模块尺寸比较小,测量精度似乎也还可以。有了PM2.5检测模块,还需要一个显示屏输出信息。因为我们并没有太多信息需要展示出来,因此我选择的简单的1602LCD,这个屏幕可以显示16列2行字母或数字信息,足够用了。

总体来说,这个项目的结构非常简单,如图所示。

image003

在面包板上搭建电路的话,需要如下元器件:

元器件 数量
Arduino UNO 1
1602LCD(需要单排针引脚) 1
攀藤G7传感器 1
1/4W直插色环电阻 1.5K 1
1.27mm到2.54mm转接板 1
1.27mm 2x5pin 母头 1
2.54mm 2x5pin 母头 1
面包板 1
导线(杜邦线) 若干

image005

上图给出了一个示意图。右上角的2*5针接口代表了攀藤G7的输出接口。攀藤G7的实际上是这个样子的:

image006 image008

这里有一个需要注意的问题:攀藤G7的接口,并不是2.54mm的接口,而是更小的1.27mm接口。为了用杜邦线接上这个接口,我们需要一个转接板:

image009

这样的转接板,我们不使用中间的2.0mm的部分,只使用1.27mm以及2.54mm的部分。焊接上两个2x5pin的母头之后,攀藤G7就可以用杜邦线连接了。

image010

按照上面的介绍,就可以搭建面包板试验环境了。如果稍懂一些数字电路知识的话,可以看出这个连接非常简单,其中包括了电源和地的连接,以及数据线的连接。对于LCD1602来说,我们连接了所有的数据线,至单片机的GPIO端口。之后我们会在软件中通过操作这些端口电平高低的方式,把内容输出到LCD1602上。对于攀藤G7来说,我们只连接了它的串口输出,至单片机的串口输入(RXD,端口0),这样,我们就可以接收到从攀藤G7串口输出的所有内容了。

更具体的细节信息,可以参考Arduino UNO的设计文档,以及ATMega328P、攀藤G7、LCD1602的说明书(数据手册)。在这些资料中,详细说明了模块每一个引脚的功能。详细介绍需要大量的篇幅,有兴趣的朋友可以找说明书以及介绍单片机编程的书籍来深入学习,我们这里就略过了。攀藤G7以及LCD1602这两个说明书,包含在了PM2.5源代码包中,文章末尾处有下载链接,可以下载。

第二节,      Arduino软件刷入

如果你按照上一节的方式,连接好了电路板,就可以使用Arduino提供的软件环境,给Arduino UNO刷入软件了。我们提供的软件源代码,可以在PM2.5源代码包中的PM2.5目录下找到,文件名是pm2.5.ino,可以用Arduino打开。我用的是Arduino 1.6.13版,如果最新的1.8.x版使用有问题的话,可以下载这个旧版本使用。

软件刷入非常简单,把Arduino主板插入电脑的USB端口之后,Windows会自动安装驱动(如果是正版Windows)。如果驱动安装有问题,可以百度查询Arduino驱动安装的方法。驱动安装完成之后,在Windows设备管理器中可以看到:

image011

你的COM端口号数字可能与我不同,没有关系,等一会刷入的时候,在Arduino软件中可以选择这个端口号。

然后是安装、启动Arduino。当然,如果你还没有下载Arduino的话,要先下载。如何下载、安装Arduino这里就不讲了,如果有需要可以百度。因为Arduino安装包尺寸比较大,源代码包里面也不包含Arduino安装包。

启动Arduino之后,可以看到这样一个界面。

image013

在这个界面上,点击菜单“文件”-“打开…”,并找到源代码包中的pm2.5.ino文件,打开这个文件。观察窗口的右下角,如果显示的是Arduino/Genuino Uno,以及刚才在设备管理器中看到的COM端口号,那就可以按下向右的箭头,开始刷入软件了。否则,要先通过菜单“工具”-“开发板”以及“工具”-“端口”进行调整。

image015

按下箭头之后等一会,一般需要一分钟左右,可以看到Arduino UNO主板上的一些LED闪烁,再之后,就可以看到Arduino软件显示“上传成功”。

image017

如果这里有失败信息,最常见的问题是你的USB线接触不良,或者使用的Arduino版本不对导致的。检查一下再重试吧。

这里需要特别提示一点,由于Arduino UNO刷入固件的时候,需要用RXD端口,因此这时候RXD端口不能与攀藤G7连接。要把连接Arduino UNO以及攀藤G7的数据线(上面示意图中的蓝色线)拔下之后,才能正确刷入软件。刷入完成之后,再连接上,这时应该可以看到显示屏上的输出信息了!

下面,给对软件开发有兴趣的朋友,简单解释一下软件的结构,方便大家对软件的学习和改造。如果对C语言还不了解,或者对软件开发不感兴趣,可以略过这一段。首先是开头的数据引脚的定义。可以看到,从数据引脚2到13,全部使用上了。其中引脚2到12连接到了攀藤G7,引脚13对应的是Arduino板子上的LED灯,与输入的攀藤G7或者输出的LCD1602并没有连接。

下面的5个函数,包括WriteLCM, WriteDataLCM, WriteCommandLCM, DisplayOneChar, DisplayListChar,都是用于输出内容到LCD1602的。具体的写入协议,请查看其它相关的教程,或者LCD1602的数据手册,这里就不细讲了。这一组函数的对外接口,是DisplayListChar,用于将一个字符串显示在屏幕上。其他4个函数,都为DisplayListChar服务。

再下面是setup函数。Setup函数是Arduino的入口函数,负责初始化运行环境。在这个函数中,可以看到对所有数据引脚进行了初始化操作,然后使用一系列WriteCommandLCM调用,初始化了LCD1602。如果想知道这一系列调用起到了什么作用,可以查看数据手册,在数据手册中找到详细的解释。在setup函数的最后,还初始化了串口,等会我们要从串口中读取数据。

最后一个函数是loop函数。Loop函数也是Arduino的入口函数,负责执行程序循环。在这个函数中的内容,会被Arduino反复调用,直到单片机断电为止。对于我们的程序来说,这里面的内容,就是从串行口读入数据,然后显示在LCD1602上。这个过程循环往复,就完成了PM2.5检测器的功能。从代码来看,也不复杂。显示采用一系列Serial类的函数,完成从串行口读取数据的工作。读入的数据是什么格式?这个问题又得去问数据手册了。这次,攀藤G7的数据手册,会解释这个问题。拿到PM2.5的测量数据,我们在数组dispbuf中组成了一个字符串,然后通过刚才提到的DisplayListChar函数,显示在屏幕上。这样,我们就完成了这个单片机上所需的所有软件功能了。

第三节,      PCB电路板的设计和制作

做完了以上两节的工作,实际上PM2.5检测器(的核心功能)已经运行起来了。只是工作在面包板上,不仅不够美观,也非常不可靠。很容易碰到某一根线,整个系统就不工作了。为了让家人也能放心使用,我决定要做一个PCB板,解决这些问题。

想做一个独立的PCB电路板,首先一个问题就是,是不是整张Arduino电路板都要复制过来呢?如果仔细观察就会发现,Arduino电路板还是很复杂的,如果整张Arduino电路板都要复制过来,那些贴片元件,特别是USB转串口模块的ATMega16U2芯片,是极难手工焊接的。如果用了这样的方案,就只能请代工厂完成焊接工作,不能自己手工DIY了。

经过研究之后,我发现实际上Arduino电路板上,只有少数几个元器件是工作所必须的,而这些元器件,都可以采用直插元件,这样就大大方便了我们的后续焊接工作,让没有什么焊接经验的同学也可以参与到其中了。

经过简化之后的Arduino电路图,如下所示。

image019

简单说明一下。MCU部分,只保留了晶振和晶振匹配电容C2/C3,以及一个给电源稳压的电容C1。LCD1602的V0引脚,通过一个1.5K电阻接地,可以得到最好的对比度效果。另外整个系统的电源,我设计为使用常见的Micro USB接口提供。这样,每天早上起床之后,或者晚上给手机充电之前,可以使用手机充电器连接PM2.5检测器看一下当天的PM2.5值,就不需要再配其他的电源了。从电路设计图上也可以看到,这个口虽然是USB口,但只使用了USB口上提供的+5V电源,并没有USB通讯功能,所以也就不需要USB通讯相关的芯片、软件了。

电路板上一共只有9个独立元器件,需要焊接:

image020

元器件 数量
28pin窄DIP插座(用于插入ATMega328P) 1
2.54mm 1*16排针(用于连接LCD1602) 1
1.27mm 2*5排母(用于连接攀藤G7) 1
1/4W直插色环电阻 1.5K 1
瓷片电容 22pF 2
瓷片电容 100nF(104) 1
直插无源晶振 16MHz 1
1*5排针(用于连接USB转DIP转接座) 1

这样的设计,让即使是初次拿起电烙铁的同学,也完全可以顺利完成焊接,希望能让大家提高兴趣,深入学习了解电子知识。

整个电子设计,使用EAGLE软件完成。国内使用EAGLE软件的朋友相对比较少,但这个软件在国外开源社区非常流行,对于双面、80cm²以内的PCB电路板设计,可以使用免费版完成。我们这个PM2.5检测器,完全符合条件,大家可以直接使用免费版本进行研究和修改。掌握这个软件,还可以帮我们更好的与国际接轨,学习参考国外开源社区的优良设计。(特别提示,Arduino系列电路板,都是使用这个软件完成的设计。想玩转Arduino的朋友,一定要掌握这个软件哦~)

电路板的原始设计文件,也包含在了源代码包中,可以在pcb目录下找到。其中pmpcb.sch和pmpcb.brd文件是原始设计文件,可以直接在EAGLE软件中打开。Gerbers目录下的所有文件,是用于生产的导出后文件。电路板设计完成之后,可以拿到代工厂进行打样。一般一两周之后,我们就可以拿到打样之后的结果啦~

把PCB板上的所有的零件都焊接好,再做好以下几点:

  1. 把LCD1602显示屏焊接在单排针上面。这个焊接需要比较注意,要把两层PCB板的对应孔位置对齐,如果歪得太多,安装外壳是螺丝很难穿过去。关键点在于,用电烙铁焊接第一个点和第二个点的时候,要特别注意对齐。焊完三个点以上,如果不借助专门的工具,就很难再调整了。
  2. 把USB转DIP转接座焊在单排针上面。与上面第一条情况类似,不重复了。
  3. 安装MCU ATMega328P。这里可能需要IC起拔器。这个工具不贵,建议买一个。如果没有这个工具,从IC座上取下芯片可能会比较困难。
  4. 安装攀藤G7。这个模块没有安装孔位,如果只是简单插上这个模块,模块和PCB板中间会有一个小缝,而且整体晃动时模块会拍打在电路板上。因此我在模块和PCB板中间贴了一片2cm直径,1mm厚度的双面胶。如下图。

image021

贴上这个双面胶之后,所有问题都解决了。

全部焊接完成之后,整个作品已经可以工作,接近完成了:

image022

这样,在上面的表格之外,完成到这步还需要的元器件包括:

元器件 数量
MCU ATMega328P 1
LCD1602 1
攀藤G7 1
USB转DIP转接座 1
2cm直径1mm厚度双面胶 1

第四节,      外观设计与安装

最后,让我们给PM2.5检测器增加一个外壳,这样用起来就更加可靠了。这个外壳,我设计使用亚克力板作为前面和后面两面的面板,其他部分使用标准零件连接。这样,我们只需要找到能切割亚克力板的商家,进行一次切割就可以了。

前面和后面的面板,我使用QCAD软件(免费软件)进行设计。设计完成之后,保存为dxf文件,就可以发送给亚克力切割商家了。这个文件也保存在我们的源代码包中,下载后在frame目录下可以看到。使用QCAD打开这个文件如下图所示。

image024

在这里,我们就不详细介绍QCAD的用法了。有兴趣改造目前设计的朋友,可以百度相关的教程。打印虎也曾经写过一个QCAD使用的教程,【打印虎】用QCAD修改RepRap Prusa i3 3D打印机框架设计图解,可以供大家参考。这个dxf文件实际上只有2D的设计。切割时,要跟商家说好,用4mm厚度的亚克力板进行切割。这个厚度数据是不包含在dxf文件中的。

切割完成之后,我们要先把背板和支撑板安装在一起:

image025

下面,使用M3*8塑料螺丝、螺母以及2.5mm塑料柱,加固PCB电路板USB接口部分。这样,就不怕插拔力量太大对USB接口造成损坏了:

image026

最后只要把前面板、中间的PCB电路板以及后面板组装到一起,就可以了:

image027

总结一下,这一步中需要的零件包括:

零件 数量
亚克力板 1套
M3*16螺丝、螺母、垫片 1套
M3*8塑料螺丝 6
M3*15塑料螺丝 4
M3*10双通尼龙柱 2
M3*15双通尼龙柱 2
M3尼龙螺帽 2
2.5mm白色塑料柱 8

到此为止,全部工作就完成了。是不是特别有成就感呢?

第五节,      结束语

以上所有工作完成之后,你就获得了一个与文章开始处第一张图一样的PM2.5检测器了。当然,所有读到这里的朋友,肯定都有非凡的聪明才智,一定想到了很多可以继续改进的主意。如果你有进一步的改进,也欢迎你开源给后面的朋友,加打印虎QQ2690194554,我帮你加到这篇文章中。当然,如果想购买文章中提到的整套零件,也欢迎加我QQ。

文章结尾处,我们做一个小广告。最近宁波爱用推出了最新的迷你3D打印机,相比于目前市面上的机型,这个3D打印机特别小巧灵活,使用注塑外壳,可以达到很不错的精度。还使用了磁性柔性打印平面,让打印时更容易附着,打印完成后更容易取下。而且,最重要的是,这个3D打印机特别便宜,可以点击这个链接了解详情。

image029

最后,当然不能忘记的是开源包的下载!点击这个链接,可以下载到所有的相关资料。祝大家玩得愉快。