其他分享
首页 > 其他分享> > PM空气质量检测仪

PM空气质量检测仪

作者:互联网

在日常工作中,我们经常会对接一些奇奇怪怪的小设备,他们既没采用大型设备厂家的通讯协议,也没有通用的统计数值的方法。这时候就得需要用到我们的自定义逻辑代码去实现这些设备数据的采集以及数值转换,今天我们将通过济南顾问通讯技术有限公司生产的pm2.5/pm10激光传感器(USB版本)讲解自定义逻辑代码实现数据采集

一、产品

       今天需要用到的产品有:

    1. 海创Box智能采集网关
    2. pm2.5/pm10激光传感器(USB版本)

       如上图所示将pm2.5/pm10激光传感器(USB版本)的USB插口连接到海创Box智能采集网关的USB口上

 

二、通讯协议

       通过厂家给的说明书里的通讯协议我们可得知设备默认参数

示例报文为

AA C0 71 01 CA 01 B9 93 89 AB

具体含义:

因为输出的是,16 进制数据,请转换成 10 进制数进行计算。

PM2.5 值的计算:71 01

PM10 值的计算:CA 01

校验和:

三、节点流

       在桌面打开海创Box智能采集网关可视化开发平台进入可视化编辑器。本次教程需要用到如下节点,在左侧节点栏中拖拽出使用

    1. serial输入栏目,用于读取串口二进制流

    1. 延迟功能栏目,用于延迟消息速率

    1. function功能栏目,用于配置逻辑代码

    1. 调试输出栏目,用于调试输出

       配置界面详情(快速复用请导航到文章末端)

       接下来我们来配置如上图的节点流,首先将左侧节点栏的serial延迟function调试节点分别拖拽到工作区,再点击相应的流节点的端口依次按配置界面所示连接起来,再双击相应流节点进入配置界面配置相应属性

       CRC校验代码如下:

var count=0;
    let buf=0;
    //以0开始取第2位字节点到第7字节的数据
    for(var i=2;i<msg.payload.length-2;i++)
    {
        buf+=msg.payload.readUInt8(i);
    }
    //创建一个2字节的buff将buf转成16进制并取低字节
    var bufTemp=Buffer.alloc(2);
    bufTemp.writeUInt16BE(buf);
    //删除高字节
    bufTemp=bufTemp.slice(bufTemp.length-1);
    if(bufTemp.compare(msg.payload.slice(8,9))==0)
    {
        msg._crc=true;
        return msg
    }
    else
    {
        msg._crc=false;
        node.error('数据位校验失败',msg);
    }

       pm2.5/pm10取值代码如下:

let PM25Value= msg.payload.readUInt16LE(2)/10;
    let PM10= msg.payload.readUInt16LE(4)/10;
    msg.payload={PM25Value:PM25Value,PM10:PM10}
    return msg;

四、部署调试

       经过上面所有步骤后,即可部署程序,部署后可以在右侧的调试窗口看到输出,如下图

五、示例

以上教程可以通过拷贝下面代码实现快速复用,在新建的流程中点击界面右侧菜单栏-导入-剪贴板,在文本框中粘贴下面代码后点击确定,即可快速复用

[
    {
        "id": "e2618b1e.c557f8",
        "type": "delay",
        "z": "7fce5a14.7da9c4",
        "name": "",
        "pauseType": "rate",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "minute",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "x": 335,
        "y": 260,
        "wires": [
            [
                "be9d7a30.0c43c8"
            ]
        ]
    },
    {
        "id": "47ea0be9.2ffb14",
        "type": "serial in",
        "z": "7fce5a14.7da9c4",
        "name": "",
        "serial": "f8003df1.9aa5c",
        "x": 215,
        "y": 260,
        "wires": [
            [
                "e2618b1e.c557f8"
            ]
        ]
    },
    {
        "id": "be9d7a30.0c43c8",
        "type": "function",
        "z": "7fce5a14.7da9c4",
        "name": "CRC检验",
        "func": "var count=0;\nlet buf=0;\n//以0开始取第2位字节点到第7字节的数据\nfor(var i=2;i<msg.payload.length-2;i++)\n{\n\tbuf+=msg.payload.readUInt8(i);\n}\n//创建一个2字节的buff将buf转成16进制并取低字节\nvar bufTemp=Buffer.alloc(2);\nbufTemp.writeUInt16BE(buf);\n//删除高字节\nbufTemp=bufTemp.slice(bufTemp.length-1);\nif(bufTemp.compare(msg.payload.slice(8,9))==0)\n{\n    msg._crc=true;\n    return msg\n}\nelse\n{\n    msg._crc=false;\n    node.error('数据位校验失败',msg);\n}\n",
        "outputs": 1,
        "noerr": 0,
        "x": 475,
        "y": 260,
        "wires": [
            [
                "5625f516.97a3dc"
            ]
        ]
    },
    {
        "id": "5625f516.97a3dc",
        "type": "function",
        "z": "7fce5a14.7da9c4",
        "name": "pm2.5/pm10取值",
        "func": "let PM25Value= msg.payload.readUInt16LE(2)/10;\nlet PM10= msg.payload.readUInt16LE(4)/10;\nmsg.payload={PM25Value:PM25Value,PM10:PM10}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 615,
        "y": 260,
        "wires": [
            [
                "e65320dc.562b5"
            ]
        ]
    },
    {
        "id": "e65320dc.562b5",
        "type": "debug",
        "z": "7fce5a14.7da9c4",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "x": 735,
        "y": 260,
        "wires": []
    },
    {
        "id": "f8003df1.9aa5c",
        "type": "serial-port",
        "z": "",
        "serialport": "/dev/ttyUSB0",
        "serialbaud": "9600",
        "databits": "8",
        "parity": "none",
        "stopbits": "1",
        "newline": "50",
        "bin": "bin",
        "out": "interbyte",
        "addchar": false,
        "responsetimeout": "10000"
    }
]

 

标签:10,01,PM10,检测仪,----,串口,空气质量,节点,PM
来源: https://www.cnblogs.com/vivianSpace/p/14744047.html