最近看到小伙伴的文章,正好自己手中有一块 Arduino 在积灰,觉得难度应该不大,就淘宝上买了几个零件自己组装了一下。
需要的材料有
- Arduino,通用的几种型号都可以
- 夏普 GP2Y1010AU0F 灰尘传感器,价格大约30块钱左右
- 面包板,方便连线
- 一大把杜邦线
传感器的说明书在这里
传感器中心有个洞可以让空气自由流过,其内部对角安放着红外线发光二极管和光电晶体管,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量,网上资料说可以测量 0.8μm 以上的灰尘,但是我并没有在说明书上找到。
要注意的是这个传感器测量的是每立方空气中颗粒物的重量,基础单位是 $mg/m^3$,不是通常意义上的 PM2.5 或者 AQI。输出电压和灰尘浓度的换算关系见说明书的最后面。
安装电路图是
传感器有六根线输入,颜色分别是蓝、绿、白、黄、黑、红,分别编号为 1-6,也对应上图里面的 1-6 的。
里面不太清楚的是3和6,他们需要和 Arduino 相连,连接方式是
- Sharp pin 3 (LED) => Arduino PIN 2 (开关LED)
- Sharp pin 5 (Vo) => Arduino A0 pin (空气质量数据通过电压模拟信号输出)
不要忘记了里面 150欧的电阻和 220uf 的电容,有的电容是有正负极的,一般画了一条白线的引脚是负极,最好不要接反了。
小伙伴还画了一张实际的走线图,原图在这里
我一开始按照这个走线的,但是输出一直不对,后来发现了问题,就是
图上的红色和蓝色中间会断开,两部分是不通的,直接用两根杜邦线连上就好了,不再拆了,不过就是显的线很乱。
电脑端读取的 Arduino 程序是
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;
Serial.print("Raw Signal Value (0-1023): ");
Serial.print(voMeasured);
Serial.print(" - Voltage: ");
Serial.print(calcVoltage);
Serial.print(" - Dust Density: ");
// 换算成 ug/m^3
Serial.print(dustDensity * 1000);
Serial.println(" ug/m3 ");
delay(1000);
}
我的实拍