|
现在空气污染非常严重,家人又有严重的过敏性鼻炎,所以想着利用夏普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);
}
|
|