攀藤 G1 PM2.5传感器

本文有更新,请参考 拆了攀登 G1 PM 2.5 传感器 《拆了攀登 G1 PM 2.5 传感器》

最近帮朋友做东西,他要求测试当前环境PM2.5。我首先拿出了珍藏许久的神荣模块。记得当时是90多入手的,当初Taobao上也没几个卖这个模块的,90多是最低价格了。写这篇文章的时候顺手查了一下目前的价格,已经降到了60多,卖家也不少了。很可能是目前出货量大,整体价格都降低下来了。我发现除了线材或者连接器,几乎所有的电子模块都有这样的问题。比方说:MPU6050模块,刚出来的时候居然要五六十,现在只要五六元。

先说一下神荣模块,问题多多,首先是根据他的SPEC,要求连续采集30秒,采集的时候基本上什么也不能做,否则会严重影响精度;另外,他每次计算的数值偏差很大,委婉一点的说法是:能够精确反应当前空气颗粒趋势……对于采集偏差,有资料说可能是因为他是采用发热电阻加热空气来实现流动的,而这样的方式不能确保空气的流通速度,所以结果不是很准确。个人观点:如果你的传感器上没有风扇换气,都是靠不住的。

后来,看到论坛上有人推荐攀藤模块,我在上网考察了一下,感觉上微创联合【参考1】这家很专业,但是不知道为什么他邮费报价很高(25?);最后我在树莓派一号店【参考2】这家买的,155+5元邮费,型号是G1。

简单说一下型号,有 G1 G2 G3,这几个主要差别在于外形尺寸。另外,G1可以输出最近一段测试到的单位个数。

外壳上有一层蓝膜,撕下之后能露出金属外壳(有朋友看照片说这个模块很老,那是因为我照相技术的原因,这个模块应该是2014年10月之后才有的):

image002

可以看到,上面带有一个风扇进行空气交换的。

image004

引脚介绍【参考3】。特别注意,似乎他们他们家的模块G1 G3引脚顺序上有差别?根据你手上的实物进行选择

个

image006

入手之后就开始实验,连接上最小只需要三根线即可让他工作,分别是VCC (Pin1) GND(Pin2)和TXD(Pin5)。我直接将这个模块和蓝牙透传模块连接起来(9600),PC串口即可获得数据非常方便。

image007

因为手头没有能够进行对照测试的仪器,只是简单测试了一下:我用手堵住进气口,过一段PM2.5值会变为0. 可以看一下工作的视频:

上述代码下载

PM2.5Fix

编译器是 Delphi 2010 + CPort VCL

上面说的都是优点,下面说点缺点,貌似我更喜欢负结果?
1. 可能是因为上面有电机的缘故,所以对于电流要求比较高。产品手册说最大电流为 120ma,官网说最大是200ma,实际启动时非常有可能比这个更大,我试图使用万用表测量,无法让其工作未果。因此,如果给Arduino使用,一定不能用Arduino取电,否则有不可预料的后果;我的解决方法是:USB充电宝先是接到一个 USB母头上取电,然后下来的电给G1,蓝牙供电,再直接进入Arduino Pro Micro的VCC;

2. 接口设计上有问题,我买到的那个接口不是很牢固,经常出现串口取不到数据反查一路才发现接口松动,如果能选用更粗大的排插效果会更好;

3. 整体上没有指示灯,无法判断当前工作状态。对于我来说出现问题时首先要把手放在模块上看看是否有震动来判断是否工作;、
4. 只在两个角落预留螺丝孔,如果整体多几个孔位,使用上会更方便;孔径应该是 M2,我手上的M2螺丝太短,没有办法插进去。

5. 手册提供的数据格式似乎有问题,刚开始我看的是卖家介绍网页,以为是卖家搞错了,后来翻了一下手册,手册也是这样写的:

image010

我实际获得的数据是这样的,每一笔串口数据以“BM” 开头,后面是数据,我实验发现 PM1.0 = Data[4]+(Data[5] shl 8) 才是正确值。如果用 (Data[4] shl 8) + (Data[5]) 计算结果明显不正确。【这个问题是Delphi数组下标从1开始导致的,如果你使用VC即可follow spec】刚开始实验我根据手册写成后面的这种形式,结果7000多,疑似身在帝都了;后来琢磨一下写成前面这种,结果为 32 (室内),感觉才正确;

6. 如同文章开头所说,和其他相比价格还是偏贵;

7. 资料偏少,没有官方资料【参考4】缺少寿命方面的详细数据,让人很难信服。特别是带有机械部分的电子设备,寿命通常会远低于电子部分,缺少数据让人很不放心;万一选用的是国产电机,你更无法判断什么时候会悲剧。

最后的总结:如果你是为了简单的研发目的,或者毕业设计,相比其他PM2.5传感器,这款使用简单,结果看起来很准确,非常值得推荐。但是如果你是为了稳定长期的工作,我认为有待时间检验。

参考:
1. http://shop115958317.taobao.com/index.htm?spm=a1z10.1-c.w5002-9767628871.2.jTEb6C 微创联合
2. http://shop110224467.taobao.com/index.htm?spm=2013.1.w5002-6755541327.2.ZK3XMi 树莓派一号店
3. 攀藤 G1 说明书
4. http://www.plantower.com/ 攀藤科技官网

2015年9月5日 放上来说明书 PantengGx

攀藤 G1 PM2.5传感器》上有 23 条评论

  1. eevs

    你好,请问这个相对于夏普GP2Y1010AU0F,精度上应该会高吧。还有检测出来的数据怎么看准不准?我是准备用C51做芯片,那在数据采集上也就是程序写法上跟夏普的差不多吗?感谢解答!

    回复
    1. ziv2013 文章作者

      夏普GP2Y1010AU0F 这个其实不是直接测量 PM2.5 的而是根据公式折算的。另外一个严重的问题是,夏普GP2Y1010AU0F 需要累积三十秒才能有结果。

      攀藤这款是直接激光计数的,1秒就能出结果。不过检测精度因为没有比较设备,无法得知是否精准。我试验的时候是堵住通风口,这时候肯定是下降的,

      也就是说只能通过“趋势”来看看是否正常。

      设备接口是串口,很容易用,具体你看一下说明就好了。

      回复
  2. hhhh

    你好,刚开始接触这个想研究一下,不太懂,想咨询您
    关于连线这块儿,您是从USB取到2个5V电给传感器VCC和蓝牙VCC?然后传感器TX接蓝牙模块RX?能否具体告知一下,小白一枚。。

    回复
    1. ziv2013 文章作者

      因为上面有马达,所以最好直接从电源取电。从USB取到2个5V电给传感器VCC和蓝牙VCC。传感器TX接蓝牙模块RX,数据直接出来的,中间没有 arduino

      回复
  3. Flagplus

    刚上电时电流大概7ma左右,稳定工作后再35~50ma直接波动,几乎没看见50ma+的电流
    不过估计是我的万用表比较烂,电机启动瞬间的高电流捕捉不到。

    现在的G1输出和表中完全一样。。

    然后再吐槽下,关于pin3,4,6的说明死活是找不到啊。。

    回复
    1. ziv2013 文章作者

      恩 不错,我是担心马达转起来瞬间会拉一个很高的出来,不过看你测试的结果还可以。国产的东西资料方面很吝啬的……

      回复
  4. 嘻嘻哈哈

    首先感谢下楼主,你的代码给了我很大帮助。
    另外感觉代码中有点小错误,就是数据读取好像错位了,PM1.0(CF)貌似读成帧长度了,所以一直都是28,往后错两个字节应该就好了

    回复
    1. ziv2013 文章作者

      你说的对,哪里确实应该是有点问题,不过现在我还不确定。我代码写的是
      Value.PM1CF:=ord(Str[4]) + ord(Str[5]) shl 8;
      Value.PM2CF:=ord(Str[6])+ ord(Str[7]) shl 8;
      Value.PM10CF:=ord(Str[8])+ ord(Str[9]) shl 8;
      回头我调试一下看看

      回复
    1. ziv2013 文章作者

      如果要求不高,可以写成 cvs 格式的文件,然后用excel 做折线图。好处是便于处理和分享,缺点是不是实时绘制。如果想实时的话可以试试 TeeChart VCL ,不过我没有试验过…..

      回复
  5. pigi

    好谢谢,那请问 TeeChart VCL 和Cport VCL在哪里可下载到?我看了下大多都是收费的下载 如果方便能不能给我邮箱发一份 谢谢pigicn@qq.com

    回复
  6. 坏明明L

    近期在调试这个模块,在网上搜到了楼主的文章,并详细阅读了。刚开始遇到了和楼主一样的问题,以为是手册提供的数据格式有错误,但反复调试后,发现手册提供的数据格式并没有错,而是接收数据的时候程序写错了,不知道楼主是不是也是这里的问题,想探讨下。。

    回复
  7. 飞扬

    哥们你代码里这个算法貌似有错啊。他这个串口程序的字节序是高位在前,类似于网络序的。

    Value.PM2:=ord(Str[12])+ ord(Str[13]) shl 8;

    那你这样转换就是有错误的。其实直接把两个字节拼在一起组成字节数组,然后转成整数就好了。
    用你这样的方法,得出的结果都会偏小一些了。

    我用Python是这样做的

    pm_at = int.from_bytes(data[12:14], byteorder=’big’)

    回复
    1. ziv2013 文章作者

      您说的对,代码写的有问题,前面有人提出来了。不过我的 G1 坏掉了,没办法验证。 后面我在 G3 的代码上修正了。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注