上周,传感数据存储项目中期答辩结束。之前实验一直在用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]
传感器规格
电源电压:5-7V
工作温度:-10-65摄氏度
消耗电流:20mA最大
最小粒子检出值:0.8微米
灵敏度:0.5V/(0.1mg/m3)
清洁空气中电压:0.9V 典型值
检测原理
其原理如下图,传感器中心有个洞可以让空气自由流过,其内部对角安放着红外线发光二极管和光电晶体管,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量,即使非常细小的如烟草烟雾颗粒也能够被检测到,通常在空气净化系统中应用。
硬件连接
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
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 = 非常好
方案实现
Version 1 得出数据,与AQI值大致接近
Version 2 得出数据,按照换算,可见现时空气质量一般
静止态时,第一行为电压
总结
根据测量反馈数值得知,灰尘或烟雾数量与电压正相关,灰尘增加间隔表现出较高电压值,而烟雾为细微粒子,密度高,会扩散,因此连续表现出较高输出电压,结论与上图吻合。判定值与电压关系可从说明文档得出,没能够描绘出变化曲线。。。。下一步,将其与yeelink结合,尝试用公众号更新pm2.5也是挺好玩的...
GP2Y官方说明文件及参考链接
GP2Y1010AU0F中文说明.pdf
GP2Y1010AU0F英文说明.pdf
果壳-自制Arduino检测器,随时关注空气质量
推酷-使用夏普GP2Y1010AU0F灰尘传感器检测空气质量