硬件列表
-Sharp GP2Y10 空气质量传感器
- DFRduino UNO R3
- IO 传感器扩展板 V7
-转接板(如果没有转接板 可选150欧、220uF电容、面包板)
-杜邦线
步骤一:硬件连接
图 1 完整连接图
1、I/O扩展板插在UNO上
2、粉尘传感器与转接板通过杜邦线连接
3、转接板上标有分别标有D和A的两个接口
D → 数字口 2
A → 模拟口 0
只要轻松的插上几根线就完成连接,是不是很方便呀?
步骤二:烧入代码
按照教程代码烧入DFRduino UNO R3
完成之后,得到一串的数字是不是还是很模糊呀?我们先简单了解下粉尘传感器,可以对应代码一起看。
(当然,如果觉得不需要了解的话,只需直接下载代码即可使用。)
上图是个粉尘传感器的内部结构图以及硬件说明。
可以从图中看出,在发射端,我们需要驱动一个红外发射管,也就是引脚3。对应程序中定义的ledPower。同样,我们也可以看出输出是引脚5,输出的是模拟量,对应到程序中的measurePin。
那我们如何得到我们想要的值呢?
下图截自 datasheet,你可以看出粉尘传感器的输出电压是几乎呈线性的。dustDensity = 0.17 * calcVoltage - 0.1; 这个公式曲线近似转换过来的(来自Chris Nafis)。这里dustDensity是粉尘密度值,单位mg/m3。calcVoltage是输出电压值。
我们都知道输出0~5V电压对应UNO模拟口读出的是0~1023。calcVoltage = voMeasured * (5.0 / 1024.0); 这个公式就是模拟值转为电压值。voMeasured 模拟口输出量。
根据datasheet,也就是上图可看出,我们需要开启内部的LED并等待280μs(微秒),之后再读取输出值。
上图可以看出,整个脉冲持续时间为320μs。因此,我们还需再等待40μs,才能将LED关闭。
以上就是对程序以及,粉尘传感器工作原理的简单说明。
步骤三:没有转接板的情况
还有个问题,有人说如果没有转接板怎么办,那就接着看上面这张图。
看出来了吗?我们需要在引脚1外接一个150欧的电阻,并且并联一个220uF的电容。这也就是我们使用转接板的原因,把这个部分在转接板上完成了,大大方便了连线,也增加了稳定性。
下面来看下实物图上的引脚位置,如果是需要自己外接电阻、电容的朋友们请继续往下看。“
粉尘传感器对应的Arduino引脚:
照着连就可以了,连接完成之后,同样下载教程的样例代码。
PM2.5检测器 代码如下:
int measurePin = 0; // 连接模拟口0
int ledPower = 2; // 连接数字口2
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); //开启内部LED
delayMicroseconds(samplingTime); // 开启LED后的280us的等待时间
voMeasured = analogRead(measurePin); // 读取模拟值
delayMicroseconds(deltaTime); // 40us等待时间
digitalWrite(ledPower,HIGH); // 关闭LED
delayMicroseconds(sleepTime);
// 0 - 5V mapped to 0 - 1023 integer values
// recover voltage
calcVoltage = voMeasured * (5.0 / 1024.0); //将模拟值转换为电压值
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: ”);
Serial.println(dustDensity); // 输出单位: 毫克/立方米
delay(1000);
}