topdog 发表于 2014-9-21 14:24:58

Microduino UNO结合APM灰尘传感器测PM2.5

本帖最后由 topdog 于 2015-3-23 11:34 编辑

    PM2.5是指大气中直径小于或等于2.5微米的颗粒物,也称为可入肺颗粒物。它的直径还不到人的头发丝粗细的1/20。虽然PM2.5只是地球大气成分中含量很少的组分,但它对空气质量和能见度等有重要的影响。与较粗的大气颗粒物相比,PM2.5粒径小,富含大量的有毒、有害物质且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大。目前受到人们广泛的关注。国内专利编号3531917的APM灰尘传感器测为大家提供了比较实惠的PM2.5测量工具。购买地址可以作为“高大上”日本神荣PPD42NS或者美国GE的替代品。 原理结构如下:

底部heater是个电阻,利用通电后电阻焦耳发热的原理,会在壳体内部产生上升气流。(因此必须垂直的姿势使用。)LED发出红外线脉冲波,遇到空气里的颗粒物反射红外线,通过lens透镜放大传递给PT检测。它的连线很简单一般只接d1连接GND,d3连接5v,d4连接PWM功能的管脚,本实验我们用pin8。lens透镜约6 个月一次清洁一次,在做镜片表面清洁时,请不要 使用有机溶剂或洗洁剂,请不要用硬物擦伤,划伤镜片表面。 有关镜片表面的清洁,可以用棉棒醮上洁净水擦拭后,再用干燥的棉棒擦拭。
         Microduino UNO是一款设计非常新颖的Arduino产品,它可以灵活的更换核心,使原来的管脚赋予新的功能和活力。譬如笔者使用了Microduino core+核心,PIN0、1就是Serial;另外PIN2、3就是Serial1了,支持六路PWM输出端口,分别为7,8,9,10,22和23。UNO购买地址,core+购买地址,FT232RL购买地址。

topdog 发表于 2014-9-21 14:25:45

本帖最后由 topdog 于 2016-1-3 22:50 编辑

一楼代码
/*
作者:topdog
时间:2014年9月21日
使用器材:Microduino UNO;CORE+;FT232RL;APM灰尘传感器.
接线:   UNO                  APM
1,      GND                  D1
2,      5V                   D3
3,      PIN8               D4
*/

int pin = 8;
int sampling=1;
unsigned long duration;//持续时间
unsigned long starttime;
unsigned long sampletime_ms = 30000;//抽样时间 30*1000 30秒就是30000毫秒(ms)
unsigned long lowpulseoccupancy = 0; //low pulse occupancy 占有率
float ratio = 0;//比率
float concentration = 0;//浓度
const float pm25coef=0.00207916725464941;//浓度换算成ug/m^3
unsigned long pm25val;


void setup() {
Serial.begin(9600);
pinMode(8,INPUT);
starttime = millis();
}

void loop() {
if(sampling==1)
{
    duration = pulseIn(pin, LOW);
    lowpulseoccupancy = lowpulseoccupancy+duration;

    if ((millis()-starttime) > sampletime_ms)
   {
    ratio = lowpulseoccupancy/(sampletime_ms*10.0);// Integer percentage 0=>100 整数百分比
    concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve使用说明书曲线
    pm25val=pm25coef*concentration;
   
    Serial.print("lowpulseoccupancy=");
    Serial.print(lowpulseoccupancy);
    Serial.print(",");
    Serial.print("ratio=");
    Serial.print(ratio);
    Serial.print(",");
    Serial.print("concentration=");
    Serial.println(concentration);
   
    Serial.print("PM2.5=");
    Serial.print(pm25val);
    Serial.println("ug/m^3");
   
    lowpulseoccupancy = 0;//复位
    starttime = millis();
}
}
}



topdog 发表于 2014-9-21 14:26:12

本帖最后由 topdog 于 2014-9-21 15:26 编辑

二楼说明,原理阐述以后就是代码的实现,本程序主要应用Arduino的PWM的功能。特别是pulseIn()脉冲宽度测量函数。本实验中使用duration = pulseIn(pin, LOW);读取PIN8引脚的脉冲LOW。如果value是LOW,pulseIn()会等待引脚变为LOW,开始计时,再等待引脚变为HIGH并停止计时。返回脉冲的长度,单位微秒,默认为1ms。如果在指定的时间内无脉冲函数返回。 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。大家要根据实际情况调整。(1秒=1000毫秒=1000000微秒)




topdog 发表于 2014-9-21 14:26:46

本帖最后由 topdog 于 2014-9-21 15:22 编辑

三楼串口数据显示的实验结果。笔者特意吸了支烟来看传感器的反映,第一行pm2.5为0,随着香烟烟雾的迷茫数据逐步升高,等烟灭了,pm2.5数值逐步回落。大家可以参照上海pm2.5官方发布的网址的数据对比一下实验结果。当然我们还可以结合OLED,sd卡模块做成手持设备,或者增加无线模块把数据上传网站。实现更多的功能。

那么今天就交流到这里,有不恰当的地方请大家指正。



zzzddd9000 发表于 2014-9-21 16:01:36

我喜欢这篇文章,写作简洁明快,整个应用的传感器和所用到的mcu,软件完整的提供出来,想模仿制作就方便得多,我一直想做一个空气监测的应用,因为对传感器的选择,和使用感到无从下手,看了这篇文章后决定也模仿楼主的方法制作一个,还请楼主多加帮助。谢谢

井底添蛙 发表于 2014-9-21 16:02:23

赞赞赞            

huang1234 发表于 2014-9-21 16:20:15

赞赞赞!{:soso_e113:}

wasdylb 发表于 2014-9-21 19:29:59

Good {:soso_e179:}

Super169 发表于 2014-9-21 20:58:17

本帖最后由 Super169 于 2014-9-21 21:02 编辑

我也買了一個 PPD42NS, 測量的結果就跟你的差不多, 同一地方, 變化非常大.
就以你的結果為例, concentration 的變化由 52.40 至 16779.27, 相信也是在同一地方吧, 但短時間內就有 三百多倍的變化了.




用來量度的話, 應該相信 52.40 還是 16779.27, 還是取平均數?
細心看數字的變化, 非一般濾波可以找出結果.

測量的目的應該是要找出指標的數值吧, 否則測量儀器就顯得沒價值了, 跟隨機數沒分別.
由於樓主加入了吐煙的變化, 跟我的可能不同.

但樓主有試過不吐煙, 在密閉的室內測試, 結果會是如何?

iascchen 发表于 2014-9-21 21:09:27

赞赞赞赞,内容很丰富啊

topdog 发表于 2014-9-21 21:09:35

Super169 发表于 2014-9-21 20:58 static/image/common/back.gif
我也買了一個 PPD42NS, 測量的結果就跟你的差不多, 同一地方, 變化非常大.
就以你的結果為例, concentrati ...

我的测量环境是在桌面,空气浓度的变化剧烈是可能的。如果那个盒子扣住传感器,有剧烈波动是不正常的。

topdog 发表于 2014-9-21 21:16:43

Super169 发表于 2014-9-21 20:58 static/image/common/back.gif
我也買了一個 PPD42NS, 測量的結果就跟你的差不多, 同一地方, 變化非常大.
就以你的結果為例, concentrati ...

实验数据表明的是吸烟的环境,我吸了口烟碰到传感器上,反应是剧烈的,而且出现了波峰。我和@问天鼓讨论过是否要添加滤波程序的问题,结论是没有必要。lowpulseoccupancy = lowpulseoccupancy+duration;也已经起到了一定的反馈作用。

darkorigin 发表于 2014-9-21 23:05:48

赞赞赞赞赞!5赞!!!!

Super169 发表于 2014-9-22 09:46:12

topdog 发表于 2014-9-21 21:16 static/image/common/back.gif
实验数据表明的是吸烟的环境,我吸了口烟碰到传感器上,反应是剧烈的,而且出现了波峰。我和@问天鼓讨论过 ...

沒有正常的數據變化資料, 很難確定吐煙後的影響.
正如我的情況, 在沒其他因素下, 在幾近密閉的室內, 也會有數十倍的變化.

請問 如果你不向它吐煙, 放在沒其他因素影響的室內, 讓它量度室內的空氣情況, 會有多大的變化?

wasdpkj 发表于 2014-9-22 13:21:01

;P 很详细 赞一个:)
页: [1] 2
查看完整版本: Microduino UNO结合APM灰尘传感器测PM2.5