极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13805|回复: 1

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

[复制链接]
发表于 2014-8-14 22:46:09 | 显示全部楼层 |阅读模式
现在空气污染非常严重,家人又有严重的过敏性鼻炎,所以想着利用夏普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);
}
回复

使用道具 举报

发表于 2014-9-23 16:03:00 | 显示全部楼层
我有做这个传感器的开发了产品,看列出来算法都是针对1代的无尘电压的处理,比如看第二个算法,有dustVal看上去默认大于130,按实际测试看并不符合的。

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


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 21:16 , Processed in 0.038809 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表