目录
一.材料准备
材料:
(1)esp8266开发板
(2)
智能型气体检测模组
JXM-PM2.5
V1.0
JXM-PM2.5传感器
二.产品介绍
产品概述
激光颗粒物探头模组是一款采用激光散射原理检测大气环境中PM1.0、PM2.5、PM10质量浓度及粒子数的传感器模组。该传感器采用国外进口处理芯片以及感光元件,通过微处理器进行信号的采集、处理并以通用数字接口形式输出,实时准确检测大气环境中不同粒径的质量浓度。
应用范围
空气净化器、空气品质检测仪、新风系统、带空气净化功能的空调、汽车以及消费类电子的配套。
工作原理
本传感器基于米氏散射法粒子浓度分析技术,外界空气均匀通过自主研发的风道,采样气体中的粒子通过光束时发生散射现象,信息处理电路通过光电传感器采集散射光的光强信号转换成电压脉冲信号,经前置放大,AD转换后变成数字信号,经噪声处理及最优算法,得出单位体积内等效粒径的颗粒个数,进而得出单位体积内等效粒径的质量浓度。传感器各功能框图如下
技术参数
产品尺寸和引脚定义
参数 |
参数 |
PM2.5/PM10测量范围 |
0-999ug/m³ |
PM2.5/PM10分辨率 |
1ug/m³ |
PM2.5/PM10精度 |
<读数的±10%(25℃) |
颗粒物浓度一致性 |
0-100ug/m³:±10% |
最小检出粒子直径 |
0.3um |
供电电压 |
5V±0.1V |
最大工作电流 |
100mA |
工作温度范围 |
-10-60℃ |
工作湿度范围 |
0-95%RH(相对湿度,非凝露) |
存储温度 |
-30-70℃ |
响应速度 |
<1.5s |
尺寸 |
53*35*23mm |
下图是模组的尺寸图和引脚标识,请根据尺寸合理进行安装使用。
引脚 |
名称 |
备注 |
1 |
VCC |
5V |
2 |
GND |
GND |
3 |
PWM |
—— |
4 |
RX |
TTL电平信号,电平电压为3.3V |
5 |
TX |
TTL电平信号,电平电压为3.3V |
6 |
NC |
—— |
7 |
NC |
—— |
8 |
NC |
—— |
注:传感器接口为1.25T-1-LT-8A立贴式连接。
三.通讯协议
串口通讯协议
-
参数
内容
编码
8位二进制
数据位
8位
奇偶校验位
无
停止位
1位
波特率
9600 bps
-
2.通讯命令
分别为主动上报模式和问询模式,默认工作模式为主动上报模式。
主动上传
(1)切换为主动上传
问询帧 |
发送(TX) |
|||||||
起始位 |
地址 |
命令字 |
通讯模式 |
-- |
-- |
-- |
-- |
校验和 |
0xFF |
0x01 |
0X03 |
0x01 |
0x00 |
0x00 |
0x00 |
0x00 |
0x04 |
应答帧 |
接受(RX) |
|||||||
起始位 |
命令字 |
地址 |
-- |
-- |
-- |
-- |
-- |
校验和 |
0xFF |
0x03 |
0X01 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
0x03 |
(2)主动的上传的一条数据(数据解析见下表)
42 4D 00 1C 00 03 00 18 00 1F 00 34 00 30 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 01 66
2.问询模式
(1)切换为问询模式
问询帧 |
发送(TX) |
|||||||
起始位 |
地址 |
命令字 |
通讯模式 |
-- |
-- |
-- |
-- |
校验和 |
0xFF |
0x01 |
0X03 |
0x02 |
0x00 |
0x00 |
0x00 |
0x00 |
0x05 |
应答帧 |
接受(RX) |
|||||||
起始位 |
命令字 |
地址 |
-- |
-- |
-- |
-- |
-- |
校验和 |
0xFF |
0x03 |
0X01 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
0x03 |
(2)问询数据指令(问询一次数据指令)
问询帧 |
发送(TX) |
|||||||
起始位 |
地址 |
命令字 |
分辨率位 |
-- |
-- |
-- |
-- |
校验和 |
0xFF |
0x01 |
0X07 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
0x07 |
应答帧:42 4D 00 1C 00 03 00 18 00 1F 00 34 00 30 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 01 66
3.数据解析说明
名称 |
说明 |
备注 |
起始位1 |
0x42 |
帧头 |
起始位2 |
0x4D |
帧头 |
帧长度高八位 |
0x00 |
帧长度 |
帧长度低八位 |
0x1C |
帧长度 |
数据1高八位 |
0x00 |
PM1.0质量浓度,单位ug/m³ |
数据1低八位 |
0x03 |
|
数据2高八位 |
0x00 |
PM2.5质量浓度,单位ug/m³ |
数据2低八位 |
0x18 |
|
数据3高八位 |
0x00 |
PM10质量浓度,单位ug/m³ |
数据3低八位 |
0x1F |
|
数据4高八位 |
0x00 |
表示0.1升空气中直径在0.3um以上颗粒物个数 |
数据4低八位 |
0x34 |
|
数据5高八位 |
0x00 |
表示0.1升空气中直径在0.5μm以上颗粒物个数 |
数据5低八位 |
0x30 |
|
数据6高八位 |
0x00 |
表示0.1升空气中直径在1.0μm以上颗粒物个数 |
数据6低八位 |
0x09 |
|
数据7高八位 |
0x00 |
表示0.1升空气中直径在2.5μm以上颗粒物个数 |
数据7低八位 |
0x00 |
|
数据8高八位 |
0x00 |
表示0.1升空气中直径在5.0μm以上颗粒物个数 |
数据8低八位 |
0x00 |
|
数据9高八位 |
0x00 |
表示0.1升空气中直径在10.0μm以上颗粒物个数 |
数据9低八位 |
0x00 |
|
数据10高八位 |
0x00 |
保留 |
数据10低八位 |
0x00 |
|
数据11高八位 |
0x00 |
|
数据11低八位 |
0x00 |
|
数据12高八位 |
0x00 |
|
数据12低八位 |
0x00 |
|
数据13高八位 |
0x00 |
|
数据13低八位 |
0x1E |
|
校验和高八位 |
0x01 |
总加和校验 |
校验和低八位 |
0x66 |
四.接线图
这里由于要使用串口来监测数据 固使用了D7 和D8的两个软串口,别看传感器那么多线,其实我们用不了那么多,三根线就够用
五.代码参考
#include <Arduino.h>
#include <SoftwareSerial.h>
#define LENG 31 //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];
SoftwareSerial PMSerial(D7, D8); // RX, TX
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(9600); //使用串口0
PMSerial.begin(9600);
PMSerial.setTimeout(1500); //设置超时时间为1500毫秒(大于传感器传送数据周期1秒)
}
void loop()
{
if(PMSerial.find(0x42)){ //检测到0x42时,开始读取
PMSerial.readBytes(buf,LENG);
if(buf[0] == 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: ");
Serial.print(PM01Value);
Serial.println(" ug/m3");
Serial.print("PM2.5: ");
Serial.print(PM2_5Value);
Serial.println(" ug/m3");
Serial.print("PM1 0: ");
Serial.print(PM10Value);
Serial.println(" ug/m3");
Serial.println();
}
}
char checkValue(unsigned char *thebuf, char leng)
{
char receiveflag=0;
int receiveSum=0;
for(int i=0; i<(leng-2); i++){
receiveSum=receiveSum+thebuf[i];
}
receiveSum=receiveSum + 0x42;
if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data
{
receiveSum = 0;
receiveflag = 1;
}
return receiveflag;
}
int transmitPM01(unsigned char *thebuf)
{
int PM01Val;
PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
return PM01Val;
}
//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
{
int PM2_5Val;
PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
return PM2_5Val;
}
//transmit PM Value to PC
int transmitPM10(unsigned char *thebuf)
{
int PM10Val;
PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module
return PM10Val;
}
六.最终效果
七.参考文章
最后感谢参考文章: