查看: 25201|回复: 49

空气质量检测器

[复制链接]
本帖最后由 Jane 于 2014-2-28 16:40 编辑

各位生活在帝都、魔都的朋友们是否会有这样的感慨:早晨一推开窗,浓重的雾霾天气,让你鼓不起勇气迈步杀进那个仿佛时刻在摧毁你五脏六腑的外面的世界。

各位心灵手巧的Maker小伙伴们,是时候动手做一个空气污染监测装置了。利用一个空气监测传感器搭配Arduino控制器和扩展板,马上就可以搭建出一个简易空气监测装置。即使没有那些专业的监测设备和砖家的报告,你也能科学客观的了解你时刻呼吸的空气质量!

看看下面的照片,制作一个PM2.5刻不容缓啊!!

4437e612ec591286b47960.jpg

Img325982836.jpg


W020130131397248834647.jpg



硬件材料:


硬件连接:
1、I/O扩展板插在UNO上
2、粉尘传感器与转接板通过杜邦线连接
3、转接板上标有分别标有D和A的两个接口
        D --> 数字口 2
        A --> 模拟口 0

下图所示:
                                                                     1.jpg























只要轻松的插上几根线就完成连接,是不是很方便呀?

下载代码,见附件。

我们先简单了解下粉尘传感器,可以对应代码一道看!

(如果觉得不需要了解的话,往下都不需要看了,只需直接下载代码即可使用,打开串口就可以查看检测到的数据了,单位是毫克/立方米)


下面这张图是个粉尘传感器的内部结构图以及硬件说明:


                                                                                             2.png
  粉尘传感器内部结构图


可以从图看出,在发射端,我们需要驱动一个红外发射管,也就是上图引脚3。对应程序中定义的ledPower。同样,我们也可以看出输出是上图对应的引脚5,输出的是模拟量,对应到程序中的measurePin


那我们如何得到我们想要的值呢?
下图截自datasheet,你可以看出粉尘传感器的输出电压是几乎呈线性的。dustDensity = 0.17 * calcVoltage -0.1; 这个公式曲线近似转换过来的(来自ChrisNafis)。这里dustDensity是粉尘密度值,单位mg/m3。calcVoltage是输出电压值。


                                                                                  3.png

我们都知道输出0~5V电压对应UNO模拟口读出的是0~1023。calcVoltage= voMeasured * (5.0 / 1024.0); 这个公式就是模拟值转为电压值。voMeasured 模拟口输出量。


采用时间计算
根据datasheet,也就是下面的第二张图可看出,我们需要开启内部的LED并等待280us(微秒),之后再读取输出值。第一张图则表示,整个脉冲持续时间为320us。因此,我们还需再等待40us,才能将LED关闭。

    4.png             
   5.png

以上就是对程序以及粉尘传感器工作原理的简单说明。


如果没有转接板的,那就接着看下面这张图。


                                                                            6.png


     
我们需要在引脚1外接一个150欧的电阻,并且并联一个220uF的电容。这也就是我们使用转接板的原因,把这个部分在转接板上完成了,大大方便了连线,也增加了稳定性。
   
下面来看下实物图上的引脚位置,如果是需要自己外接电阻、电容的朋友们请继续往下看。


                                                          2.jpg


粉尘传感器对应的Arduino引脚:
引脚号
传感器引脚
Arduino 引脚
  
1
  
  
V-LED
  
  
5V(串联一个150欧的电阻)
  
  
2
  
  
LED-GND
  
  
GND
  
  
3
  
  
LED
  
  
数字口2
  
  
4
  
  
S-GND
  
  
GND
  
  
5
  
  
Vo
  
  
模拟口0
  
6
Vcc
5V


7.png


8.png


照着连就可以了,连接完成之后,同样下载上面的样例代码。






dust_sensor_code.rar

816 Bytes, 下载次数: 28233, 下载积分: 创造力 -1

Jane  管理员
 楼主|

发表于 2014-8-25 10:27:48

benny 发表于 2014-8-22 20:35
楼主,我配的是IIC LCD1602 display module 兼容Gadgeteer显示屏,可以帮忙修改下代码吗?谢谢了。 ...

http://wiki.dfrobot.com.cn/index.php/(SKU%3ADFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer 建议你可以先看下这个教程 试写一下
回复 支持 0 反对 1

使用道具 举报

admin  管理员

发表于 2013-12-7 21:24:06

有个问题,如何显示PM值?
回复 支持 反对

使用道具 举报

社区活动向导  NPC

发表于 2013-12-7 22:01:36

本帖最后由 社区活动向导 于 2013-12-10 11:25 编辑

要是配个显示屏和电池就好了,可以放到户外,。。。。。最好是能和家里的空气净化器连线,监测到PM2.5过高时,就自动开始工作。。。。
非常实用的项目,而且足够的简单,我把楼主的项目拉进2013年度DF创客社区“梦幻3D打印机大奖”----参赛项目投票帖了,赶快你给你的项目投票去吧。。
回复 支持 反对

使用道具 举报

xu-H  学徒

发表于 2014-1-28 14:21:17

我打开串口为什么看不到数据啊,请指点!
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-2-15 13:18:53

xu-H 发表于 2014-1-28 14:21
我打开串口为什么看不到数据啊,请指点!

之前的代码,最后串口显示的语句放到论坛就缺失了,我直接放了个附件,你再试一下吧~
回复 支持 反对

使用道具 举报

Berlina_Li  初级技师

发表于 2014-2-27 14:44:15

今天加了块LCD keypad shield和电池,update一下代码。
  1. #include <LiquidCrystal.h>
  2. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

  3. int measurePin = 1; //Connect dust sensor to Arduino A0 pin
  4. int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2
  5.   
  6. int samplingTime = 280;
  7. int deltaTime = 40;
  8. int sleepTime = 9680;
  9.   
  10. float voMeasured = 0;
  11. float calcVoltage = 0;
  12. float dustDensity = 0;
  13.   
  14. void setup(){
  15.   Serial.begin(9600);
  16.   pinMode(ledPower,OUTPUT);
  17.   lcd.begin(16, 2);
  18. }
  19.   
  20. void loop(){
  21.   digitalWrite(ledPower,LOW); // power on the LED
  22.   delayMicroseconds(samplingTime);
  23.   
  24.   voMeasured = analogRead(measurePin); // read the dust value
  25.   
  26.   delayMicroseconds(deltaTime);
  27.   digitalWrite(ledPower,HIGH); // turn the LED off
  28.   delayMicroseconds(sleepTime);
  29.   
  30.   // 0 - 5V mapped to 0 - 1023 integer values
  31.   // recover voltage
  32.   calcVoltage = voMeasured * (5.0 / 1024.0);
  33.   
  34.   // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
  35.   // Chris Nafis (c) 2012
  36.   dustDensity = 0.17 * calcVoltage - 0.1;
  37.   
  38.   Serial.print("Raw Signal Value (0-1023): ");
  39.   Serial.print(voMeasured);
  40.   
  41.   Serial.print(" - Voltage: ");
  42.   Serial.print(calcVoltage);
  43.   
  44.   Serial.print(" - Dust Density: ");
  45.   Serial.println(dustDensity); // unit: mg/m3
  46.   
  47.   lcd.setCursor(0, 0);
  48.   lcd.print("Dust Density: ");
  49.   lcd.setCursor(0, 1);
  50.   lcd.print(dustDensity);
  51.   lcd.print("  mg/m3 ");
  52.   
  53.   delay(1000);
  54. }
复制代码
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-2-27 18:50:42

Berlina_Li 发表于 2014-2-27 14:44
今天加了块LCD keypad shield和电池,update一下代码。

成功了吗?
回复 支持 反对

使用道具 举报

Berlina_Li  初级技师

发表于 2014-3-4 11:22:24

成功了,但是在想办法把pm10的数据转化成AQI空气污染指数。
回复 支持 反对

使用道具 举报

lauren  高级技师

发表于 2014-3-4 11:54:32

我擦,我要基于这个结合yeelink做一个云数据采集监控
回复 支持 反对

使用道具 举报

zeropoint0110  学徒

发表于 2014-3-10 10:04:19

感谢,开始做了!
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-3-11 21:34:02


欢迎随时更贴~
回复 支持 反对

使用道具 举报

丁佳莉  见习技师

发表于 2014-7-18 11:04:47

最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。。。。
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-7-18 13:05:55

丁佳莉 发表于 2014-7-18 11:04
最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。 ...

差不多 是个正常范围内,你可以试试弄点粉尘比较厉害的场景,应该会有较大的变化
回复 支持 反对

使用道具 举报

丁佳莉  见习技师

发表于 2014-7-18 15:20:12

Jane 发表于 2014-7-18 13:05
差不多 是个正常范围内,你可以试试弄点粉尘比较厉害的场景,应该会有较大的变化 ...

弄了一个香烟点了放在附近,就是因为数值好像没什么变化,我才开始担心数据有问题的,
回复 支持 反对

使用道具 举报

何处不江南  初级技匠

发表于 2014-7-18 16:18:38

顶楼主啊                              
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-7-18 17:16:15

丁佳莉 发表于 2014-7-18 15:20
弄了一个香烟点了放在附近,就是因为数值好像没什么变化,我才开始担心数据有问题的, ...

香烟应该有反应的 ,估计比较慢,现在有变化了吗?
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-7-18 17:19:15


哈哈 稀客呀~
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2014-7-18 17:21:21

丁佳莉 发表于 2014-7-18 11:04
最后得到的数据dustdensity的值应该是多少?我一般都在0.65到0.75之间。。。不太能确定这个数据对不对。。 ...

我突然想起来 0.65~0.75这个值算比较大的了,正常应该0.1几,你连线怎么连的,会不会接触不良,发个连接图看看
回复 支持 反对

使用道具 举报

丁佳莉  见习技师

发表于 2014-7-28 17:13:58

Jane 发表于 2014-7-18 17:21
我突然想起来 0.65~0.75这个值算比较大的了,正常应该0.1几,你连线怎么连的,会不会接触不良,发个连接 ...

我这个连线很简单的,就是和你的连线图一样啊,用的空气质量转换器。。
回复 支持 反对

使用道具 举报

丁佳莉  见习技师

发表于 2014-7-28 17:14:30

Jane 发表于 2014-7-18 17:16
香烟应该有反应的 ,估计比较慢,现在有变化了吗?

还是没反应。。
回复 支持 反对

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail