动手做了一只最最简单的PM2.5传感器GP2Y1010AU0F,效果挺满意的
淘宝上常见的廉价PM2.5传感器,主要就是夏普的GP2Y1010AU0F,以前买的时候二十多,现在已经降到了十六元左右。
虽然这个不能测PM2.5,连PM10也测不了,但是当做灰尘传感器还是蛮可以的。
还有一种五十五块钱的GP2Y1023AU0F,那个是利用高低脉冲的时间来表示PM2.5的数值,卖家说这个才是夏普的原厂产品,可以测试PM2.5。
我都用过,也就那么回事。
攀藤的激光PM2.5传感器,最少都要200左右。所以几十块钱的空气传感器,都是玩具。
攀藤的感觉PM2.5和PM10的数值都偏大,还不是线性的,用来校准夏普的传感器的时候,校准参数非常大。
今天说一下GP2Y1010AU0F这个传感器。
夏普的几种传感器我都买过,有用输出电压表示数据的,有用高低电平脉冲时间表示,也有用串口直接发送数据的。其中GP2Y1010AU0F最便宜,他用电压表示数据,所以要选一个带ADC功能的单片机。
我这里用了STC15W408AS,20脚的那种。
先看电路图
再看驱动电平波形
这个表示要给传感器一个驱动电平波,时间周期为10ms,其中低电平占时0.32ms
再看看电压取样
说明获取电压的时间,要在低电平持续0.28ms后,马上取样。
最后看看取样电压和灰尘的数值比例,这样可以根据测试到的取样电压,来算出灰尘浓度
看看上面的东西,便于理解代码。
下面是传感器的引脚图,总共6根线。
再看看传感器到单片机的接线,就2根,LED和Vo。
当LED=0的时候,传感器内部的PNP三极管导通,红外光二极管发光。
当LED=1的时候,传感器内部的PNP三极管截止,红外光二极管停止发光Vo需要接到单片机的ADC引脚,测试Vo的电压,就可以根据电压和灰尘浓度的比例图,得到灰尘浓度。
根据技术手册,当空气洁净的时候,Vo的范围是0~1.5V,典型值是0.9V。
当空气灰尘浓度很高的时候,Vo的数值不小于3.4V。说白了,就是Vo的范围是0.9~3.4V。
0.9V表示空气很洁净,3.4V表示空气灰尘很多。换算成灰尘浓度,就是0mg/m3到0.5mg/m3我们一般用ug,1mg=1000ug,所以我们这个传感器的范围就是0~500ug/m3,0~500就是PM2.5的范围(其实也就是灰尘浓度,我们测不出PM2.5,这里用灰尘浓度代替了)。
再说一下接线。这个传感器有6根线,其中2根是接单片机的。剩下的4根,2根是给红外发光二极管供电的,所以不能直接上5V,需要串一个150欧的电阻来限流。另外为了稳定供电,还需要在给发光二极管供电的正极和负极上并一个220uf的电容。买传感器的时候,肯定会送一个150欧的电阻,一个220uf的电容。下面也是接线顺序。
那么电阻和电容怎么接?先说VCC和S-GND,分别接5V和GND。然后5V接150欧的电阻,再接到V-LED。LED-GND另外引一根线,接到GND上。然后220uf的电容,正负极分别接到 V-LED和LED-GND上。
简易的接线图如下:
其中LED右边的三极管可以不用接,单片机的引脚开强推挽模式,最大电流20mA,足以驱动LED了,不需要加三极管放大。写了这么多,才轮到代码,真是郁闷。
里面的各种延时,都是打开STC-ISP直接用工具计算的,这里单片机的时钟设置为12M。然后就是ADC的获取,这个也没什么难度。这里没必要把ADC再转为电压了。VCC是5V,所以ADC 1023表示 5V,0.9V就是184。ADC转灰尘浓度,我这里不写了,直接在程序里面写。程序里面还会加上数码管或者液晶屏的显示代码。这里也不写了。主要就是讲一下这种传感器怎么接入。代码很简单,例子很多,我都没翻技术手册,直接用卖家给的Arduino代码改的。本来打算用LCD1602这个5块钱的液晶屏显示的但是看到淘宝上一个用3位数码管显示的,所以临时改了也用数码管。
反正3位4位都可以用,接线的时候,4位的数码管少接一根线就可以了。数码管分共阳极和共阴极。以前数码管都喜欢买共阳极的,因为当年的单片机的输出电流很小,输入电流较大。现在共阴极也很多人买,因为现在的单片机输出电流也可以设置很大,而且共阴极接线方便理解。一句话,随便买。程序里面改一个字符就可以做到共阴或者共阳的切换。都讲到这里了,顺便说一下用单片机直接驱动数码管。下面一个常见的4位数码管的管脚图:
我们知道,一个数码管是由7根横竖线加一个小数点,还有一根共阴或者共阳线组成的,总共有9根线。
数码管7根横竖线,组成了一个8字,这7根横竖线的顺序,从abcdefg来表示。还有1个小数点用h表示。每根横竖线其实就是一个发光二极管,如果数码管是共阴的,那么abcdefgh就是8个发光二极管的正极,1234是发光二极管的负极。反之数码管是共阳的,abcdefgh就是8个发光二极管的负极,1234是发光二极管的正极。数码管除了1个的,还有多个并在一起的。如果1个数码管要9根线,那么2个数码管要18根线?3个数码管要27根线?4个数码管要36根线吗……实际上,多个数码管并在一起,那么他们的abcdefgh都是并联在一起的,通过1234...的通断来选择显示哪个数码管点亮。也就是说,1位数码管需要9根线接单片机,如果小数点不用,那么是8根线。2位数码管需要10根线,3位数码管需要11根线,4位数码管需要12根线。小数点不用的话,则可以再少接一根线。我们这个程序,单片机要留10个IO引脚给3位数码管。看到这里,有些同学可能会有点迷糊,不犯迷糊的同学都是比较笨的。这里涉及到一个同时显示的问题,以及显示相互干扰的问题。如果一个4位的数码管,他要同时显示“1234”这4个数字,岂不是没法显示?因为abcdefgh是连在一起的,我显示“1”的时候,要打开1脚,关掉234脚。显示“2”的时候,要打开2脚,关掉134脚……怎么能做到同时显示啊?其实这个还是利用人眼的视觉停留的特点做的。就是快速的切换显示。只要速度够快,那么人眼看到的就是“1234”同时显示,而实际上他们是轮流显示的。要做到这一点,非常轻松。极少数人的眼睛能分辨的频率为85Hz,大部分75Hz都无法分辨。对数码管这种简单的东西,只要显示的频率达到50Hz,大多数的人就不会感觉到闪烁。
然后就是数码管的一些数字和字符显示的常量。
下面以共阴极的数码管为例:
//共阴极数码管的0 1 2 3 4 5 6 7 8 9 A b C d E F
unsigned char code Dig[16]={0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77,0x7C, 0x39, 0x5E, 0x79, 0x71};
//P 0x73 , U 0x3E , 不亮0x00 ,L 0x38, y 0x6E ,H 0x76
举个例子吧,如果要显示字符0,对共阴极数码管来说,1表示亮,0表示灭。那么数码管的abcdef=1,g=0,h=0,(h是小数点)
用二进制表示这8个开关量,也就是 0011 1111(hgfe dcba),16进制数就是0x3F好了,1~9,你自己数吧。如果是共阳极的数码管,那么1表示灭,0表示亮。字符0的十六进制数,就是0x3F反一下,用~表示取反,就是 ~0x3F。具体到程序里面,对应共阳或共阴的数码管,就是加个~或者去掉~取反。
写教程真累啊,不多说了,具体看程序吧。还有洞洞板的焊接图啥的,我也不发了,自己根据原理图焊。我有空弄两张照片就好了。
焊接图啥的,真心懒的拍照了。。。。
评论