空气质量检测器
各位生活在帝都、魔都的朋友们是否会有这样的感慨:早晨一推开窗,浓重的雾霾天气,让你鼓不起勇气迈步杀进那个仿佛时刻在摧毁你五脏六腑的外面的世界。各位心灵手巧的Maker小伙伴们,是时候动手做一个空气污染监测装置了。利用一个空气监测传感器搭配Arduino控制器和扩展板,马上就可以搭建出一个简易空气监测装置。即使没有那些专业的监测设备和砖家的报告,你也能科学客观的了解你时刻呼吸的空气质量!
看看下面的照片,制作一个PM2.5刻不容缓啊!!
硬件材料:
1. 粉尘传感器2. DFRduino UNO R33. IO传感器扩展板 V74. 转接模块5. USB下载线
硬件连接:1、I/O扩展板插在UNO上2、粉尘传感器与转接板通过杜邦线连接3、转接板上标有分别标有D和A的两个接口 D --> 数字口 2 A --> 模拟口 0
下图所示:
只要轻松的插上几根线就完成连接,是不是很方便呀?
下载代码,见附件。
我们先简单了解下粉尘传感器,可以对应代码一道看!
(如果觉得不需要了解的话,往下都不需要看了,只需直接下载代码即可使用,打开串口就可以查看检测到的数据了,单位是毫克/立方米)
下面这张图是个粉尘传感器的内部结构图以及硬件说明:
粉尘传感器内部结构图
可以从图看出,在发射端,我们需要驱动一个红外发射管,也就是上图引脚3。对应程序中定义的ledPower。同样,我们也可以看出输出是上图对应的引脚5,输出的是模拟量,对应到程序中的measurePin。
那我们如何得到我们想要的值呢?下图截自datasheet,你可以看出粉尘传感器的输出电压是几乎呈线性的。dustDensity = 0.17 * calcVoltage -0.1; 这个公式曲线近似转换过来的(来自ChrisNafis)。这里dustDensity是粉尘密度值,单位mg/m3。calcVoltage是输出电压值。
我们都知道输出0~5V电压对应UNO模拟口读出的是0~1023。calcVoltage= voMeasured * (5.0 / 1024.0); 这个公式就是模拟值转为电压值。voMeasured 模拟口输出量。
采用时间计算根据datasheet,也就是下面的第二张图可看出,我们需要开启内部的LED并等待280us(微秒),之后再读取输出值。第一张图则表示,整个脉冲持续时间为320us。因此,我们还需再等待40us,才能将LED关闭。
以上就是对程序以及粉尘传感器工作原理的简单说明。
如果没有转接板的,那就接着看下面这张图。
我们需要在引脚1外接一个150欧的电阻,并且并联一个220uF的电容。这也就是我们使用转接板的原因,把这个部分在转接板上完成了,大大方便了连线,也增加了稳定性。 下面来看下实物图上的引脚位置,如果是需要自己外接电阻、电容的朋友们请继续往下看。
粉尘传感器对应的Arduino引脚:
引脚号传感器引脚Arduino 引脚
1V-LED5V(串联一个150欧的电阻)
2LED-GNDGND
3LED数字口2
4S-GNDGND
5Vo模拟口0
6Vcc5V
照着连就可以了,连接完成之后,同样下载上面的样例代码。
benny 发表于 2014-8-22 20:35
楼主,我配的是IIC LCD1602 display module 兼容Gadgeteer显示屏,可以帮忙修改下代码吗?谢谢了。 ...
https://wiki.dfrobot.com.cn/_SKU_DFR0063_IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer 建议你可以先看下这个教程 试写一下 今天加了块LCD keypad shield和电池,update一下代码。
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int measurePin = 1; //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);
lcd.begin(16, 2);
}
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: ");
Serial.println(dustDensity); // unit: mg/m3
lcd.setCursor(0, 0);
lcd.print("Dust Density: ");
lcd.setCursor(0, 1);
lcd.print(dustDensity);
lcd.print("mg/m3 ");
delay(1000);
} Jane 发表于 2015-3-17 09:55
shield是可以的呀
楼主,我最近也在用这个这个粉尘传感器,但是有个问题就是:我在房间里边读出来的模拟值是0,这样密度按照公式算下来也就是-0.1了。我试着搞了一些烟雾,数据如图
直接就是最大值了。在窗外也测试一下,也是0,这样的数据感觉不正常啊。按照手册里输出电压和密度的图表,就算密度为0,输出电压算下来也是0.58左右。
还有我用的arduino uno它的微秒延时是不是很不准啊,采样的280us+40us=320us我用示波器看,都快接近500us了。如图:
有个问题,如何显示PM值? 要是配个显示屏和电池就好了,可以放到户外,。。。。。最好是能和家里的空气净化器连线,监测到PM2.5过高时,就自动开始工作。。。。:victory:
非常实用的项目,而且足够的简单,我把楼主的项目拉进2013年度DF创客社区“梦幻3D打印机大奖”----参赛项目投票帖了,赶快你给你的项目投票去吧。。
头已大:Q 我打开串口为什么看不到数据啊,请指点! xu-H 发表于 2014-1-28 14:21
我打开串口为什么看不到数据啊,请指点!
之前的代码,最后串口显示的语句放到论坛就缺失了,我直接放了个附件,你再试一下吧~ Berlina_Li 发表于 2014-2-27 14:44
今天加了块LCD keypad shield和电池,update一下代码。
成功了吗? 成功了,但是在想办法把pm10的数据转化成AQI空气污染指数。 我擦,我要基于这个结合yeelink做一个云数据采集监控 感谢,开始做了! zeropoint0110 发表于 2014-3-10 10:04
感谢,开始做了!
欢迎随时更贴~ 最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。。。。 丁佳莉 发表于 2014-7-18 11:04
最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。 ...
差不多 是个正常范围内,你可以试试弄点粉尘比较厉害的场景,应该会有较大的变化 Jane 发表于 2014-7-18 13:05
差不多 是个正常范围内,你可以试试弄点粉尘比较厉害的场景,应该会有较大的变化 ...
弄了一个香烟点了放在附近,就是因为数值好像没什么变化,我才开始担心数据有问题的, 顶楼主啊 丁佳莉 发表于 2014-7-18 15:20
弄了一个香烟点了放在附近,就是因为数值好像没什么变化,我才开始担心数据有问题的, ...
香烟应该有反应的 ,估计比较慢,现在有变化了吗? 何处不江南 发表于 2014-7-18 16:18
顶楼主啊
哈哈 稀客呀~ 丁佳莉 发表于 2014-7-18 11:04
最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。 ...
我突然想起来 0.65~0.75这个值算比较大的了,正常应该0.1几,你连线怎么连的,会不会接触不良,发个连接图看看 Jane 发表于 2014-7-18 17:21
我突然想起来 0.65~0.75这个值算比较大的了,正常应该0.1几,你连线怎么连的,会不会接触不良,发个连接 ...
我这个连线很简单的,就是和你的连线图一样啊,用的空气质量转换器。。 Jane 发表于 2014-7-18 17:16
香烟应该有反应的 ,估计比较慢,现在有变化了吗?
还是没反应。。