ESP8266检测pm2.5 arduino 实现

发布于:2023-01-23 ⋅ 阅读:(533) ⋅ 点赞:(0)

目录

一.材料准备

二.产品介绍

         产品概述

        工作原理

        技术参数

                 产品尺寸和引脚定义

三.通讯协议

串口通讯协议

        2.通讯命令

主动上传

2.问询模式

3.数据解析说明

四.接线图

五.代码参考

六.最终效果

七.参考文章

arduino/Mixly使用ZH03BPM2.5传感器

Arduino气体传感器-PM2.5激光粉尘传感器


一.材料准备

          材料:

        (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%
100-500ug/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立贴式连接

三.通讯协议

  1. 串口通讯协议

    1. 参数

      内容

      编码

      8位二进制

      数据位

      8位

      奇偶校验位

      停止位

      1位

      波特率

      9600 bps

        2.通讯命令

分别为主动上报模式问询模式,默认工作模式为主动上报模式。

  1. 主动上传

        (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;
}

六.最终效果

七.参考文章

最后感谢参考文章:

arduino/Mixly使用ZH03BPM2.5传感器

Arduino气体传感器-PM2.5激光粉尘传感器


网站公告

今日签到

点亮在社区的每一天
去签到