接好线之后,如何写代码读PM2.5传感器数值呢?写代码之前,我们要缕清思路。认真的看懂数据协议,画出简单的流程图,这样能帮我们更好的设计组织代码。
几个关键:
1判断帧头;
2判断接收字节数;
3判断校验和;
4计算PM2.5数值。
根据上面的几点,我们可以画出读取传感器数值的流程图:
读取PM2.5传感器软件流程图
程序中,我们将用到两个关键函数,就是Serial.available()和Serial.read();其中Serial.available()是用来判断串口的接收缓存是否有数据,有数据就返回数据个数,没有就返回0;
Serial.read()是用来读取串口接收缓存数据的,返回一个字节数据,这里我们知道发送的是无符 16进制数,因此使用一个整形变量来接收。。
如果使用的软串口,把Serial换成自己声明的变量就可以了。
下面是读取传感器子函数的源代码:
float GetPM25Data()//读取PM2.5传感器
{
int cnt=0;//帧计数
int data=0;//接收字节
int revbuf[7];//接收缓存
int dsize=0;//串口接收计数
while (softSerial.available()>0){//软串口有效
data = softSerial.read(); //通过软串口读一个字节
dsize++;//读取字节计数
if(dsize>200)//没有遇到正确的帧标志,超时退出
{
return -1;
}
if(cnt==0)
{
if(data==0xAA)//得到帧头
{
revbuf[0] = data;
cnt++;
}
}else{
revbuf[cnt++]=data;
}
if(cnt==7)//帧计数
{
break;//退出循环
}
}
int sum=revbuf[1]+ revbuf[2]+ revbuf[3] + revbuf[4];//计算校验字
if(revbuf[5]==sum && revbuf[6]==0xff )//判断校验字和结束字
{
float vo=((revbuf[1]<<8)+revbuf[2])/1024.0*5.00;//计算PM2.5值
return vo*800; //返回PM2.5读数
}
return -1;//校验字或结束字错误
}
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!