b9ss 发表于 2015-3-20 19:02:31

这几天雾霾是热门话题 做了个看pm值的东东。很简陋 贴上来求指点

本帖最后由 b9ss 于 2015-3-20 19:08 编辑

arduino真的很好玩 ,去年倒腾了下TBJS给的入门教程,大概知道了基本的模块怎么弄。最近倒腾了个3dprint,准备自己打印结构件玩四轴飞行打望器。这下发现知识不够了还得多实践,于是翻出上次买的各种物件,买了个夏普的灰尘传感器GP2Y10 东拼西凑出来个成品 也不知道准不准,发上来求指点。
纸板裸奔封装

测了几个地方的值 今天环保局给的pm2.5是31美领馆是42发现他们的pm10值差不多是2.5值乘个2,难道有相关关系?
阳台

客厅

卧室开了空气净化器

楼层比较高 去大街上测量的话应该会高不少


贴上代码   lcd会闪,可能自己1602没用对

///*======== lcd1602=====*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10,9, 8, 7, 6);//设置接口

//dust sensor
int sampool_length=10;//样本数量
int sampool = {0,0,0,0,0,0,0,0,0,0};//样本容器

int dustPin=1;//模拟取样针脚
int sampleAnalog=0;//当前样本
int sampleAvg=0;//样本均值
int poolCount=0;//计数器 用于计算

float particle=0;//颗粒数量
float pm=0;//pm值

int ledPower=2;//给led提供电位的数字输出针脚
int delayTime=280;//单位Microsecond
int delayTime2=40;
float offTime=9680;

float sampleVolt;
void setup(){
    Serial.begin(9600);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Local PM2.5");
    lcd.begin(16, 2);
    pinMode(ledPower,OUTPUT);
}

void loop(){
poolCount++;
if(poolCount>=5){
    sampleAvg=getSampleAvg(sampool_length,sampool);
    PM();
    show1602();
    poolCount=0;
}

digitalWrite(ledPower,LOW);
delayMicroseconds(delayTime);
sampleAnalog=analogRead(dustPin);
delayMicroseconds(delayTime2);
digitalWrite(ledPower,HIGH);
delayMicroseconds(offTime);

delay(200);
//Serial.print("Sample: ");
//Serial.println(sampleAnalog);
inQueue(sampool_length,sampool,sampleAnalog);
}
void PM(){
sampleVolt=float(sampleAvg*5)/1024;
   Serial.print("Sample Avg: ");
Serial.println(sampleAvg);
Serial.print("Sample Voltage: ");
Serial.println(sampleVolt);


particle=(sampleVolt-0.0356)*120000;//(sampleVolt)*120000;
Serial.print("Particle: ");
Serial.println(particle);//实际的颗粒数


Serial.print("PM2.5==");
if(sampleAnalog>118)
{
    pm=(sampleVolt*0.172-0.0999)*1000;
    Serial.println(pm);//实际的颗粒数
}
else
{
    Serial.println("unknow");
}
}
//显示到1602
void show1602(){
lcd.setCursor(0,0);
    lcd.print("Local PM2.5");//其实是PM值

    lcd.setCursor(5, 2) ;

    delay(1500);

}

//计算样本均值
int getSampleAvg(int _length,int* _array){
int i=0;
int avg=0;
int count=0;
for(;i<_length;i++){
    if(_array>0){
      avg+=_array;
      count++;
    }
}
if(count>0){
    avg=avg/count;
}
return avg;
}

//简陋的fifo 节约内存
int inQueue(int _length,int* _array,int _value){
int temp;
int i;
if(_length<1){
    return _value;
}
temp=_array;
_array=_value;
i=_length-1;
for(;i>=1;i--){
    _value=_array;
    _array=temp;
    temp=_value;
}
return temp;
}

fly58888 发表于 2015-3-21 13:17:49

通俗易懂,好贴!

peterllloo 发表于 2015-3-21 23:27:52

撸主3d打印机怎么搞的?来个教程呗

sinkr 发表于 2015-3-23 15:32:29

顶贴,收藏,

谢谢楼主的分享,有空也来试一这么实有且有意义的 应用!:lol
页: [1]
查看完整版本: 这几天雾霾是热门话题 做了个看pm值的东东。很简陋 贴上来求指点