雾霾远离我:PM2.5检测器自制解析

电子说

1.3w人已加入

描述

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

  硬件列表

  -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);

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
elecfans 2018-12-16
0 回复 举报
博主看到知道的话麻烦尽快回复我哦,比较急,谢谢啦 收起回复
elecfans 2018-12-16
0 回复 举报
没有扩展板的话这个能做出来吗 收起回复
全部评论

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分