Arduino制作PM2.5测量仪(使用GP2Y1010AU0F灰尘传感器)

时间:2024-03-06 21:37:36

Arduino制作PM2.5测量仪(使用GP2Y1010AU0F灰尘传感器)

GP2Y1010AU0F灰尘传感器在STM32平台下使用夏普GP2Y1010AU0F灰尘传感器测量PM2.5空气污染指数中已经详细介绍过,本文使用Arduino连接GP2Y1010AU0F灰尘传感器,打造一个低成本的PM2.5测量仪,实时检测空气质量。以下是教程。

一、GP2Y1010AU0F灰尘传感器原理介绍

本文再详细介绍下这个传感器的测量原理。

这是传感器内部电路图传感器内部有红外发光管和光电晶体管,利用光敏原理来工作。传感器的3号引脚控制LED灯,通过发射红外光来检测特别细微的颗粒,如香烟颗粒、细微灰尘,依靠传感器输出脉冲的高度来判断颗粒浓度。

再看下脉冲波形:

这个表示传感器工作时需要一个驱动电平波,时间周期为10ms,其中低电平占时0.32ms(是低电平,没有写错)。
再看看电压取样脉冲:

根据上图可以得到传感器采样的时机,即要在低电平持续0.28ms后,马上取样(这时脉冲的高度最高,为最准确的输出值)。因为低电平长0.32ms,所以采样后再保持低电平0.04ms,然后将电平拉到高电平,持续9.68ms后完成一个工作周期(因为前文说过,一个工作周期为10ms)。

再看下传感器输出电压和粉尘浓度的关系。

根据关系图,我们要写出浓度和电压之间的关系,看下“斜截式方程:y=kx+b”怎么写:

选取电压和浓度关系图上斜线的两点,(0,0.6)、(0.4,3),根据“两点式”得到,浓度转化公式为:

浓度=[传感器输出模拟电压 * 0.1667 - 0.1] * 1000;

二、灰尘浓度与PM2.5指数转换

首先要说的是,PM2.5即细颗粒物是指直径在2.5微米以下的颗粒物,能长时间的悬浮在空气中。而夏普的GP2Y1010AU0F灰尘传感器只是用于检测特别细微的颗粒,如香烟颗粒、细微灰尘,并不能准确测量PM2.5数值,仅仅作为一个参考。

但是这里还将其对照中国的PM2.5指数标准进行转换。

首先看下PM2.5标准。

所以,我们通过传感器获得灰尘浓度后,按照PM2.5指数对应的浓度进行相应转换即可。参考来源:PM2.5指数的中美标准差异

三、传感器控制原理

传感器原理图:

从图中可以看到:

传感器的3号管脚要接单片机的数字输出脚。

当LED=0的时候,传感器内部的PNP三极管导通,红外光二极管发光。
当LED=1的时候,传感器内部的PNP三极管截止,红外光二极管停止发光

Vo需要接到单片机的ADC引脚,测试Vo的电压,就可以根据电压和灰尘浓度的比例图,得到灰尘浓度。

四、GP2Y1010AU0F灰尘传感器与Arduino连接

传感器和Arduino硬件连接:


Sharp pin 1 (V-LED) =>连接在 150欧姆电阻 和 220uf电容的中间
Sharp pin 2 (LED-GND) => GND 接地
Sharp pin 3 (LED) => Arduino PIN 2 (开关LED)
Sharp pin 4 (S-GND) => GND 接地
Sharp pin 5 (Vo) => Arduino A0 pin (空气质量数据通过电压模拟信号输出)
Sharp pin 6 (Vcc) => 5V

实物图:

五、Arduino程序

代码如下:

int dustPin=0;
int ledPower=2;
int delayTime=280;
int delayTime2=40;
float offTime=9680;
float dustVal=0;
float dustVot=0;
float dustDensity=0;
int Pm2_5 = 0;

void setup(){
Serial.begin(9600);
pinMode(ledPower,OUTPUT);
pinMode(dustPin, INPUT);
}
 
void loop(){
// ledPower is any digital pin on the arduino connected to Pin 3 on the sensor
digitalWrite(ledPower,LOW);
delayMicroseconds(delayTime);
dustVal=analogRead(dustPin);
delayMicroseconds(delayTime2);
digitalWrite(ledPower,HIGH);
delayMicroseconds(offTime);
 
delay(1000);

//  将ADC输出值转换为模拟电压值
dustVot = dustVal*0.0049;   

/* 
 * 将采集到的电压值转换为粉尘浓度
 * 公式:浓度=[传感器输出模拟电压 * 0.1667 - 0.1] * 1000;
 * 公式根据根据官方规格书中的《Fig. 3 Output Voltage vs. Dust Density》图表计算得出
 * 公式未经过校准,仅为理论计算值
 * 得出粉尘的浓度,单位为微克每立方米  
 */
dustDensity = ((dustVot*0.1667)-0.1)*1000;  

//  将粉尘的浓度转换为PM2.5指数
//  参考标准为PM2.5中国标准
if (dustDensity < 35) {
  Pm2_5 = dustDensity * 1.4286;
  }
else if (dustDensity < 150) {
  Pm2_5 = (dustDensity - 35)* 1.25 + 50 ;
  }
else if (dustDensity < 250) {
  Pm2_5 = (dustDensity - 150)* 1 + 200 ;
  }
else Pm2_5 = (dustDensity - 250)* 0.8 + 300 ;

Serial.println(Pm2_5);
}

将程序编译后上传,打开串口,即可看到测量到的PM2.5数值。

 

六、参考资料

1.规格书:https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf

2.夏普GP2Y1010AU0F灰尘传感器规格书本地免费下载:夏普原版灰尘传感器GP2yY1010au规格书gp2y1010au_e

3.Arduino ADC转换(将测量值转换为模拟电压值):https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

4.STM32平台下使用夏普GP2Y1010AU0F灰尘传感器测量PM2.5空气污染指数

5.PM2.5指数分级:PM2.5指数的中美标准差异

6.传感器说明书:灰尘传感器GP2Y1010AU0F使用说明.pdf

原创文章,转载请注明: 转载自科技爱好者博客

本文链接地址: Arduino制作PM2.5测量仪(使用GP2Y1010AU0F灰尘传感器) (https://www.lxx1.com/4536)

如果博客对您有帮助,请给我 赞助