关于土壤传感器使用的一些问题
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;
.............
}
}
暂时就只有这样了 不过令程序延时时间长了不少