一.概述
GP2Y1014AU粉尘传感器是夏普开发的一款光学灰尘监测传感器模块,在其中间有一个大洞,空气可以自由流过,它里面对角位置放着红外发光二极管和光电晶体管,红外发光二极管定向发送红外,当空气中有微粒阻碍红外时,光电晶体管接收到的红外产生变化,所以信号输出引脚电压发送变化。其属性值如下;
供电电压;5-7V
工作温度;-10-65℃
监测最小直径;0.8μm
灵敏度;0.5V/(0.1mg/m3)灰尘浓度每变化0.1mg/m3,输出电压变化0.5V。
二.硬件连接
需要连接1个150欧的电阻,和1个220μF的电容,具体位置如图所示。(实物图片是直接在淘宝上随便找的一家)
三.程序编写
根据产品说明书,我们可以得到输出电压Vout和灰尘浓度M的表达式(供电电压5V情况下);M=(5Vout-3)/29*1000 单位为;μg/m3。
紧接着根据说明书中的对LED的时序要求
检测周期为10ms,红外从发射到接收需要一定时间,那么在什么时候检测才是有效的呢?这个要看说明书中的输出信号图,如下图所示,将采样时间设置为0.28ms可以得到一个稳定值。
故程序如下;
#define measurePin A0//输出引脚连接模拟口A0
#define ledPin 9 //LED引脚连接数字口9
unsigned int samplingTime = 280;//根据前面分析采样时间为280,所以这里为280
unsigned int deltaTime = 40;//测量完后脉冲需要继续保持,保持时间为320-280=40
unsigned int sleepTime = 9680;//LED脉冲周期为10毫秒,故此处为10000-320=9680
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(ledPin, LOW);
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin);
delayMicroseconds(deltaTime);
digitalWrite(ledPin, HIGH);
delayMicroseconds(sleepTime);
calcVoltage = voMeasured * (5.0 / 1024);
dustDensity = 5000*calcVoltage/29 - 3000/29;
if (dustDensity < 0) {
dustDensity = 0.00;
}
Serial.println(dustDensity);
delay(2 * 1000);
}