zuyang 发表于 2016-3-24 16:53:51

商城里卖的PM2.5激光粉尘传感器,对应代码问题很多啊

DFRobot商城里面卖的PM2.5激光粉尘传感器:



商品地址: https://www.dfrobot.com.cn/goods-1113.html

Wiki页面地址: https://wiki.dfrobot.com.cn/_SKU_SEN0177_PM2.5%E6%BF%80%E5%85%89%E7%B2%89%E5%B0%98%E4%BC%A0%E6%84%9F%E5%99%A8


Wiki里面给的代码是这样的:
//******************************
//*Copyright (c) 2015, DFRobot
//*All rights reserved
//*Abstract: Read value of PM1,PM2.5 and PM10 of air quality
//*
//*Version:V2.0
//*Author:Jason
//*Date:Feb.2016
//******************************
#include <Arduino.h>
#define LENG 32
char buf;

int PM01Value=0;          //define PM1.0 value of the air detector module
int PM2_5Value=0;         //define PM2.5 value of the air detector module
int PM10Value=0;         //define PM10 value of the air detector module

void setup()
{
Serial.begin(115200);
}

void loop()
{
if(Serial.available())
{
    Serial.readBytes(buf,LENG);
    if(buf == 0x42 && buf == 0x4d){
      if(checkValue(buf,LENG)){
      PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module
      PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module
      PM10Value=transmitPM10(buf); //count PM10 value of the air detector module
      }         
    }
}
static unsigned long OledTimer=millis();
    if (millis() - OledTimer >=1000)
    {
      OledTimer=millis();
      
      Serial.print("PM1.0: ");//send PM1.0 data to bluetooth
      Serial.print(PM01Value);
      Serial.println("ug/m3");            
   
      Serial.print("PM2.5: ");//send PM1.0 data to bluetooth
      Serial.print(PM2_5Value);
      Serial.println("ug/m3");   
      
      Serial.print("PM10:");//send PM1.0 data to bluetooth
      Serial.print(PM10Value);
      Serial.println("ug/m3");   
    }

}
char checkValue(char *thebuf, char leng)
{
char receiveflag=0;
int receiveSum=0;
char i=0;

for(i=0;i<leng;i++)
{
receiveSum=receiveSum+thebuf;
}
   
if(receiveSum==((thebuf<<8)+thebuf+thebuf+thebuf))//check the serial data
{
    receiveSum=0;
    receiveflag=1;
}
return receiveflag;
}

int transmitPM01(char *thebuf)
{
int PM01Val;
PM01Val=((thebuf<<8) + thebuf); //count PM1.0 value of the air detector module
return PM01Val;
}

//transmit PM Value to PC
int transmitPM2_5(char *thebuf)
{
int PM2_5Val;
PM2_5Val=((thebuf<<8) + thebuf);//count PM2.5 value of the air detector module
return PM2_5Val;
}

//transmit PM Value to PC
int transmitPM10(char *thebuf)
{
int PM10Val;
PM10Val=((thebuf<<8) + thebuf); //count PM10 value of the air detector module
return PM10Val;
}
还是今年二月份更新的,但是,烧到板子上,接好传感器,并没有结果出来。

我自己分析的原因如下:

1.传感器串口的波特率是9600,Wiki页面里面已经写清楚了,代码里面使用的是115200



2.直接使用Serial.readBytes函数,因为传感器是每秒自动发送数据,这样读取的数据起始位是随机的,根本无法继续对数据进行处理。


3.buf的类型为char,应该为unsigned char。类型为char时,会导致checksum出错(认为读取结果有负数),也会导致PM2.5的结果有负数出现。



下面是我修改的代码:

(使用的是软串口)

运行结果:



***********************************************************************************************************Update:2016.3.26
更新了一下程序,更简洁一些





kingaoieong1990 发表于 2018-4-14 10:18:14

我使用了你的Code (貼上了wiki的)
但是我一直都是出 0
然後試了一下
發覺檢測不了第一個 byte 0x42
想問一下會是什麽問題呢?

Youyou 发表于 2018-6-20 12:59:10

我也碰到这个问题了,PM2.5发送的数据是接收到了,但一直都是0,非常奇怪。

kevinzhang19701 发表于 2016-3-29 12:47:48

顺便咨询两个问题:

1. 一处是这里的“,5”是什么意思?



2. 另一处是这里,为什么用millis()作延迟,而不是delay()?我更换为delay()后试过,PM数据突然全变成了5位数!!

Cain 发表于 2016-3-24 16:57:41

厉害,支持了,一直觉得PM2.5的库写得太讨巧

zuyang 发表于 2016-3-24 16:59:59

Cain 发表于 2016-3-24 16:57
厉害,支持了,一直觉得PM2.5的库写得太讨巧

去年还是有PM2.5库的,今年二月代码更新之后就没有用自己写的库了

MoonShine 发表于 2016-3-24 17:02:06

我也试过,还是你仔细啊!

Jason_G 发表于 2016-3-24 23:19:13

您好,这个样例代码是我提供的,对于代码中的问题给你们带来诸多不便,深表歉意,感谢您对提供的样例代码的修正,学习了,非常感谢!
原来的库因为其中使用的硬件串口的库和高版本的IDE存在不兼容的问题,导致模块发送过来的数据读取存在问题,所以没有继续使用。波特率的问题我很纳闷,我测试代码是9600,对数据的处理的确不够严谨。
感谢您的指正!

kevinzhang19701 发表于 2016-3-25 12:12:58

有意思,是细心人。

Cain 发表于 2016-3-29 15:44:16

问下,你编译的环境是?试过在Arduino上,但编译不过的,第一个报错就是数值类型转换没有做

diaosi 发表于 2016-6-17 19:06:43

Cain 发表于 2016-3-29 15:44
问下,你编译的环境是?试过在Arduino上,但编译不过的,第一个报错就是数值类型转换没有做 ...

您好,我看wiki上更新了您的代码。我先上来用软串口不行,换成硬串口出数据了。。是为什么?

Cain 发表于 2016-6-21 11:04:53

diaosi 发表于 2016-6-17 19:06
您好,我看wiki上更新了您的代码。我先上来用软串口不行,换成硬串口出数据了。。是为什么? ...

在wiki中教程样例为了配合教程对程序进行了修改,连接的是硬件串口。在代码开头说明中也有提到,请根据连线图来使用。而楼主的源程序的确使用的是软串口,这样能释放硬件串口,也是个不错的选择

xxl84 发表于 2016-12-21 09:30:05

都是牛人。学习了。

aaaak 发表于 2017-1-13 21:01:20

非常感谢,我在网上找了很多办法,都没有成功,只有这个成功了,让我给Serial口领取特殊值,又充满希望.

独自酒醉 发表于 2017-7-22 23:47:04

刚接触PM2.5,先看看,谢谢!

2289247852018 发表于 2018-1-30 14:35:46

谢谢了,试试看
页: [1]
查看完整版本: 商城里卖的PM2.5激光粉尘传感器,对应代码问题很多啊