arduino接收串口数据 使用ESP8266 和YW51 A3C10 PM2.5传感器
esp8266使用arduino接收YW51 A3C10 PM2.5传感器数据。
PM2.传感器
根据数据手册,得知传感器
项目名称 | 数据 |
---|---|
波特率 | 2400 |
字节数 | 7 |
起始位 | 0xAA |
结束位 | 0xFF |
传感器一共七位数据,分别是
名称 | 功能 |
---|---|
起始位 | 0xAA |
VoutH | 传感器输出电压高位 |
VoutL | 传感器输出电压地位 |
VrefH | 数据手册没写 |
VrefL | 数据手册没写 |
校验位 | 用来校验 |
结束位 | 0xFF |
校验位计算方法: 校验位=VoutH+VoutL+VrefH+VrefL
灰尘浓度Ud=浓度系数k * (VoutH*256 + VoutL) * 2.5 / 1024
浓度系数根据数据手册填写。
Arduino代码
float GetPM25Data(); //定义PM2.5读取的函数
void setup()
{
Serial.begin(2400); //开启串口
Serial.println("serial start"); //输出串口已打开
}
void loop()
{
int pm25=0;
pm25 = GetPM25Data(); //调用函数
Serial.println(pm25); //输出PM2.5的值
delay(2000);
}
float GetPM25Data()//读取PM2.5传感器,波特率:2400; 校验位:无; 停止位:1 位; 数据位:8;数据包长度为7字节
{
int cnt,pmval,readcmd[7];
unsigned char gdata,eFlag,rbytes=0;
float pm25;
cnt=0;
eFlag =0;
while(Serial.available()>0)
{
gdata = Serial.read();//保存接收字符
if(gdata==0xAA&&eFlag==0) //起始位是0xAA
{
eFlag=1;
}
if(eFlag==1)
{
readcmd[rbytes++]=gdata;
}
cnt++;
if(cnt>100)
{
return 0;
}
if(rbytes==7) //一共7位数据
{
break;
}
}
if(rbytes==0)
return 0;
if(readcmd[6]!=0xFF) //结束位为OxFF
return 0;
pmval = readcmd[1];
pmval<<=8; //左移8位
pmval+=readcmd[2]; //arduino里面16进制2进制自动转换的
pm25 = pmval*5.0/1024.0;//计算PM2.5值
pm25*=800.0; //系数800是随便用的值 真实值要根据数据手册写
for (rbytes = 0; rbytes < 7;rbytes++ )
{
Serial.println(readcmd[rbytes]); //输出原始读到的数据 用于检查数据是否正确
//println输出的数据是10进制数据
}
return pm25;
}