godzilla619 发表于 2014-8-14 22:46:09

关于夏普GP2Y10粉尘传感器算法的问题讨论

现在空气污染非常严重,家人又有严重的过敏性鼻炎,所以想着利用夏普GP2Y10粉尘传感器+arduino做一个自动化空气净化器。当PM2.5值达到一定程度的时候自动打开空气净化器,当PM2.5值降到一定程度的时候就自动关闭空气净化器。
但是在网上找GP2Y10相关资料的时候,官方只给了一个粗略的线性关系图,所以只能在网上找线性关系算法,结果在网上找到了两种算法,不知道哪种是正确的,而且两种算法测量结果相差很大。不知有哪位大侠做过具体的测试,帮小弟解决这个算法的问题。
第一种:
void loop(){
i=i+1;
digitalWrite(ledPower,LOW); // power on the LED
delayMicroseconds(delayTime);
dustVal=analogRead(dustPin); // read the dust value
ppm = ppm+dustVal;
delayMicroseconds(delayTime2);
digitalWrite(ledPower,HIGH); // turn the LED off
delayMicroseconds(offTime);
Serial.println(ppm);
voltage = ppm/i*0.0049;
dustdensity = 0.17*voltage-0.1;
ppmpercf = (voltage-0.0256)*120000;
if (ppmpercf < 0)
    ppmpercf = 0;
if (dustdensity < 0 )
    dustdensity = 0;
if (dustdensity > 0.5)
    dustdensity = 0.5;
String dataString = "";
dataString += dtostrf(voltage, 9, 2, s);
dataString += "volt,";
dataString += dtostrf(dustdensity*1000, 5, 2, s);
dataString += "ug/m3,";
dataString += dtostrf(ppmpercf, 8, 0, s);
i=0;
ppm=0;
Serial.println(dataString);
delay(1000);

// READ DATA
//Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
//switch (chk)
// {
//case 0:Serial.print("OK,\t"); break;
//case -1: Serial.print("Checksum error,\t"); break;
//case -2: Serial.print("Time out error,\t"); break;
// default: Serial.print("Unknown error,\t"); break;
// }
// DISPLAT DATA
Serial.print("");
Serial.print("Current humdity= ");
Serial.print(DHT.humidity,1);
Serial.print("%,\t");
Serial.print("temperature = ");
Serial.print(DHT.temperature,1);
Serial.println("C,\t");

delay(5000);
}
第二种:
void loop(){
i=i+1;
digitalWrite(ledPower,LOW); // power on the LED
delayMicroseconds(delayTime);
dustVal=analogRead(dustPin); // read the dust value
//ppm = ppm+dustVal;
delayMicroseconds(delayTime2);
digitalWrite(ledPower,HIGH); // turn the LED off
delayMicroseconds(offTime);
Serial.println(dustVal);
dustVal = voMeasuredLast+(dustVal-voMeasuredLast)/10;
if(dustVal<150)
dustDensity=0.15*(dustVal-130.0);
else if(dustVal<160)
dustDensity=3+1.7*(dustVal-150.0);
else if (dustVal<220)
dustDensity=5*(dustVal-150.0);
else
dustDensity=dustVal-220.0;



//dustdensity = 0.17*voltage-0.1;
//ppmpercf = (voltage-0.0256)*120000;
//if (ppmpercf < 0)
//ppmpercf = 0;
//if (dustdensity < 0 )
//dustdensity = 0;
//if (dustdensity > 0.5)
//dustdensity = 0.5;
String dataString = "";
dataString += dtostrf(dustVal, 9, 2, s);
dataString += "volt,";
dataString += dtostrf(dustDensity, 5, 2, s);
dataString += "ug/m3,";
dataString += dtostrf(ppmpercf, 8, 0, s);
i=0;
ppm=0;
Serial.println(dataString);
delay(1000);

// READ DATA
//Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
//switch (chk)
// {
//case 0:Serial.print("OK,\t"); break;
//case -1: Serial.print("Checksum error,\t"); break;
//case -2: Serial.print("Time out error,\t"); break;
// default: Serial.print("Unknown error,\t"); break;
// }
// DISPLAT DATA
Serial.print("");
Serial.print("Current humdity= ");
Serial.print(DHT.humidity,1);
Serial.print("%,\t");
Serial.print("temperature = ");
Serial.print(DHT.temperature,1);
Serial.println("C,\t");

delay(5000);
}

wavysong 发表于 2014-9-23 16:03:00

我有做这个传感器的开发了产品,看列出来算法都是针对1代的无尘电压的处理,比如看第二个算法,有dustVal看上去默认大于130,按实际测试看并不符合的。

开发文档里面讲到了这个问题了,假设当前采集电压A,无尘电压为B,比较A和B,如果A大于B就继续计算,如果A小于B,则你设定的B大于实际了,此时把A作为新的B来用,继续采集下一次。


页: [1]
查看完整版本: 关于夏普GP2Y10粉尘传感器算法的问题讨论