MENU

Arduino + 灰尘传感器实现空气质量检测

December 8, 2015 • 开源硬件

上周,传感数据存储项目中期答辩结束。之前实验一直在用DHT11记录温湿度到树莓派,显然记录速度慢,模拟传输量难以达到树莓派IO上限,于是开始尝试转用灰尘传感器...

  淘了一块夏普的GP2Y1010AU0F,这是一款光学空气质量传感器,价格30软妹左右,为本文实验用传感器,下文称其为GP2Y。GP2Y读数快,直接产生模拟电压,其值与粉尘浓度成正比,可测量0.8μm以上的微小粒子。

注意:本文讨论的为广义的空气质量测量并非PM2.5值测量

空气质量指数(AQI)


1.空气动力学直径(以下简称直径)直径小于或等于2.5微米的颗粒物称为细颗粒物(PM2.5)。[[来源:维基百科]][1]

2.GP2Y测量的是>=0.8um粒子浓度( μg/m³ ),而PM2.5指数则计算 <=2.5μm 粒子浓度( μg/m³ ),所以测量值并不能准确反映当地的空气质量指数(AQI)。

3.AQI值换算过于复杂,需测量SO2、NO2、PM10、PM2.5、O3、CO等六项值,再分别换算成空气质量分指数(IAQI),最后最求各项分指数最大值作为空气质量指数(AQI)。[[来源:维基百科]][2]

fcfaaf51f3deb48ffa788e54f21f3a292df57822.png
342ac65c10385343db9d8d189013b07eca8088bc.png

传感器规格


电源电压:5-7V
工作温度:-10-65摄氏度
消耗电流:20mA最大
最小粒子检出值:0.8微米
灵敏度:0.5V/(0.1mg/m3)
清洁空气中电压:0.9V 典型值

检测原理


  其原理如下图,传感器中心有个洞可以让空气自由流过,其内部对角安放着红外线发光二极管和光电晶体管,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量,即使非常细小的如烟草烟雾颗粒也能够被检测到,通常在空气净化系统中应用。

skitch.png

硬件连接


Sharp pin 1 (V-LED) => 5V 串联1个 150欧姆的电阻 (最好在电阻一侧和GND之间再串联一个 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
1d571d9b033b5bb5c652f32132d3d539b400bccf.png
GP23.jpg

Arduino代码


Version 1 输出 - 电压 - >=0.8μm粒子浓度( μg/m3 )

int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2
  
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
  
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
  
void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
}
  
void loop(){
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);
  
  voMeasured = analogRead(measurePin); // read the dust value
  
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);
  
  // 0 - 5V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (5.0 / 1024.0);
  
  // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
  // Chris Nafis (c) 2012
  dustDensity = 0.17 * calcVoltage - 0.1; //得出浓度( mg/m³ )
  
  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);
  
  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);
  
  Serial.print(" - Dust Density: ");
  Serial.print(dustDensity * 1000); // 这里使用更为广泛的单位( μg/m3 )
  Serial.println(" μg/m³ ");
  delay(1000);
}

Version 2 输出 (dustVal/1024)-0.0356) 120000 0.035 模拟值

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

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);
if (dustVal>36.455)
Serial.println((float(dustVal/1024)-0.0356)*120000*0.035);
}

version 2 - 测得数据与空气质量对照:
3000 + = 很差
1050-3000 = 差
300-1050 = 一般
150-300 = 好
75-150 = 很好
0-75 = 非常好

方案实现


WeChat_1451221250.jpeg

Version 1 得出数据,与AQI值大致接近

A62900F8-8D0B-4D35-8177-87485A140714.png

Version 2 得出数据,按照换算,可见现时空气质量一般

105328AD-A824-4ABB-98C7-5A5121EA4502.png

静止态时,第一行为电压

skitch-1.png

总结


  根据测量反馈数值得知,灰尘或烟雾数量与电压正相关,灰尘增加间隔表现出较高电压值,而烟雾为细微粒子,密度高,会扩散,因此连续表现出较高输出电压,结论与上图吻合。判定值与电压关系可从说明文档得出,没能够描绘出变化曲线。。。。下一步,将其与yeelink结合,尝试用公众号更新pm2.5也是挺好玩的...

GP2Y官方说明文件及参考链接

GP2Y1010AU0F中文说明.pdf
GP2Y1010AU0F英文说明.pdf
果壳-自制Arduino检测器,随时关注空气质量
推酷-使用夏普GP2Y1010AU0F灰尘传感器检测空气质量

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 2 条评论
  1. 这传感器这么便宜,准确度多高啊,有过对比么?

    1. @virusdefender在粉尘传感器非专业市场一般就是GP2Y1051AUOF和PPD42NJ这两种啦,都是用红外LED传感,数据稳定性差不多,但毕竟也就是几十块的那种非专业传感器,而且还用电压值模拟空气质量值确实会有偏差。资料说能检测到最小为0.03um的粒子,所以它主要用于空气净化装置(大概检测到一定值就启用净化),但不是用于精确测量空气质量值的。当geek玩玩也是好哒~