Arduino 学习之路IV 求助

关于土壤传感器使用的一些问题

        

Grove - Dust Sensor 粉尘传感器

粉尘传感器可以通过在给定的单位时间内,计算罗脉冲占用时间(LPO时间)来测量空气中的颗粒物水平,该传感器可以为您提供可靠的粉尘数据。它可以检测直径为1微米的粉尘颗粒。
这里我按计算公式在 arduino UNO 写的程序
int pin = 6;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;

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

void loop() {
  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
    Serial.print(lowpulseoccupancy);
    Serial.print(",");
    Serial.print(ratio);
    Serial.print(",");
    Serial.println(concentration);
    lowpulseoccupancy = 0;
    starttime = millis();
  }
}


这里涉及到一个系统时间的问题,粉尘数据采集 是在系统运行30秒内不断在void loop()里读取
 duration = pulseIn(pin, LOW);
然后进行相应运算 原程序并没有设置任何延时  所以读取次数我也不知道   这样得到的值也正常
于是问题就产生了 一旦设置了延时之后 读取值就少了很多,
下面我做了一个读取次数的实验
int i=0;
unsigned long starttime;
unsigned long sampletime_ms = 10000;
void setup()
{
  Serial.begin(9600);
  starttime = millis();
}

void loop()
{
  i += 1;
  if ((millis()-starttime) > sampletime_ms)
  {
    Serial.println(i);
    starttime = millis();
    i=0;
  }
  //delay(2000);
}

这里把延时注释掉了 系统时间 10秒内 显示读取的次数为 24960~25020
而在设置延时后 显示读取的次数为5~7次  
我在使用这个传感器时想和其它传感器一起使用  而当其它传感器的数据含延时时就会大大影响读取的值
我不知道是我对这个传感器工作原理不了解 还是他们说的我对板子的时钟原理不清楚
反正我很困惑 他们有的说不会影响,但按我的编程思路思路来看我觉得肯定会影响的
现在卡在这了,求助,求大神详解
(以后懂了在添加解决方案)


2014/8/6
无奈 时钟无法在有延时的主程序里使用这个传感器的代码从而得到正确的值,在网上看到一篇例子,将该粉尘传感器的程序作为主程序,
通过条件语句 待30s后粉尘数据出现后在运行其他程序
void loop()
{
  duration = pulseIn(dust_pin, LOW);			/*粉尘数据处理*/
  lowpulseoccupancy += duration;
  endtime = millis();
if ((millis()-starttime) > sampletime_ms)
  {
   ratio = ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0);  
   concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; 
  }
if(tempconcentration!=concentration)
    {
	   tempconcentration=concentration;
           .............
    }
}

暂时就只有这样了 不过令程序延时时间长了不少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值