十一合一환경及空气质量센서Modbus통신 프로토콜

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

十一合一环境及空气质量传感器Modbus通讯协议
十一合一环境及空气质量传感器Modbus通讯协议插图

产品功能설명:

X-SSG-A1101-RS485 十合一환경及空气质量센서采用高速处理器, 통합 CO2、甲醛、TVOC、激光粉 尘 PM2.5 、PM10 、PM1.0  颗粒物、온도、湿度、气压、조도及소음检测于一体, 通过 RS485 总线 통신방식实现환경质量데이터检测上报。采用旋转卡扣방식吸顶安装,操作简单。

产品기술指标

2.1     检测매개변수及分辨率
센서데이터测量分辨率测量范围测量精度
이산화탄소 eCO21ppm400  ~ 60,000ppm±30ppm
TVOC1ug/m30  ~ 60,000ug/m³±50ug/m3
甲醛 CH2O1ug/m30  ~ 1,000ug/m³±25%
PM2.51ug/m30  ~ 1,000ug/m³±10%
PM101ug/m30  ~ 1,000ug/m³±10%
PM1.01ug/m30  ~ 1,000ug/m³±10%
온도0.01℃-40  ~ 85℃±0.2℃
湿度0.01%0  ~ 100%±1%RH
气压1Pa30,000  ~ 110,000Pa±12Pa
조도1Lux0  ~ 60,000Lux±5%
소음1dB30  ~ 90dB±3dB

注意:模块출력的 CH2O 值为 TVOC 的等效值,客户购买和使用时请注意。

2.2     工作电压: DC5V±0.2V @150mA

2.3     工作환경:工作온도- 10 ~ 60℃,工作湿度: 5 ~ 95%RH(无凝结)

2.4     通讯방식:Modbus-RTU 485 인터페이스

2.5     预热时间:小于 3 分钟

半导体 VOC  센서理论上来说通电时间越久越稳定

2.6     使用寿命: 3  年(空气中)

III.产品사양

3.1     外观크기图

十一合一环境及空气质量传感器Modbus通讯协议插图1

I 、표준 4 线인터페이스                         II 、2 线 + USB 전원 공급인터페이스

如上图所示, 本产品⃞供“표준 4 线인터페이스”和“2 线+USB 전원 공급”两种物理인터페이스,选购时请根 据实际需要注明。

本产品默认使用 5V 直流전원 공급,如需特殊电压(6 - 36V),可문의하기定制。

3.2     배선定义

1)     “표준 4 线”인터페이스유형:

순번名称备注
RS485_A黄色RS485_A
RS485_B绿色RS485_B
DC+红色默认 5V 直流전원 공급, 特殊电压需定制
GND黑色接地线

2) “2 线+USB 전원 공급”인터페이스유형:

순번名称⃞述
A红色 (A)RS485_A
B黑色 (B)RS485_B
UMicro USB直流 5V 전원 공급

注意:上表中的颜色为常规설명,具体배선时请以产品上的标签为准。

IV.RS485 통신 프로토콜

4.1     통신매개변수

ModBus-RTU 485 매개변수: 9600/8/N/1

出厂默认주소: 0x01

返回데이터时间:小于 100ms

4.2     통신 프로토콜

1)     읽기주소命令

方向:用户적용->센서模块;需要应答:是

请求消息형식:

바이트번호데이터설명
00xFE广播주소
10x11보고서从机주소기능 코드
20x00固定
30x00固定
40x00固定
50x01固定
67CRC_LCRC_HCRC 체크섬

响应消息형식:

바이트번호데이터설명
00x01从机주소
10x11보고서从机주소기능 코드
20x02바이트数
3version固件버전
4주소当前주소
56CRC_LCRC_HCRC 체크섬

例如:명령 보내기: FE 11 00 00 00 01 28 06

返回데이터: 01 11 02 12 01 70 5C

설명:返回데이터中 0x12 表示버전号为 V1.2 ,0x01 表示设备주소为 01

2)     修改주소命令。模组出厂默认주소为 0x01,주소范围可更改为: 1~247

方向:用户적용->센서模块;需要应答:是

请求消息형식:

바이트번호데이터설명
0주소当前주소
10x06기능 코드
20x00固定
30x00固定
40x00预留
5new 주소新주소
67CRC_L
CRC_H
CRC 체크섬

响应消息형식:

바이트번호데이터설명
0주소修改前的주소
10x06기능 코드
20x00固定
30x00固定
40x00预留
5new 주소修改后的주소
67CRC_L
CRC_H
CRC 체크섬

例如:当前주소为: 0x01 ,预设주소为: 0x02

명령 보내기: 01 06 00 00 00 02 08 0B

返回데이터: 01 06 00 00 00 02 08 0B

当前주소再从: 0x02 ,改回: 0x01

명령 보내기: 02 06 00 00 00 01 48 39

返回데이터: 02 06 00 00 00 01 48 39

3)     읽기데이터命令

方向:用户적용->센서模块;需要应答:是

请求消息형식:

바이트번호데이터설명
0주소当前주소
10x03기능 코드
2
3
0x00
MM
레지스터开始주소
4
5
0x00
NN
需要읽기的센서个数
6
7
CRC_L
CRC_H
CRC 체크섬

应答消息형식:

바이트번호데이터설명
0주소当前주소
10x03기능 코드
2NN*2데이터길이
3xx xx......센서데이터(气压占 4 바이트, 既 2 个레지스터; 其他每个센서데이터占 2 바이트, 既 1 个寄 存器)
3+NN*2
4+NN*2
CRC_L
CRC_H
CRC 체크섬

注意:返回센서데이터可以根据레지스터주소和데이터길이来改变。

레지스터주소(0x00MM)与对应的센서데이터설명如下, 气压占 4 바이트(2 个레지스터),其余每个传 感器데이터占 2 바이트(1 个레지스터)。

레지스터주소센서데이터占用레지스터 수량
0x0000eCO21
0x0001TVOC1
0x0002CH2O1
0x0003PM2.51
0x0004湿度1
0x0005온도1
0x0006PM101
0x0007PM1.01
0x0008조도(Lux)1
0x0009MCU 온도1
0x000A소음(dB)1
0x000B气压(Pa)2

설명:

① 센서个数 00 NN 最小为 00 01,最大为 00 0B。MM 值为 00 时, NN 值最大可为 0B,此时能读 出所有센서的值, NN 为 01 时只能单独읽기 eCO2 的데이터, NN 为 02 时可읽기 eCO2 和 TVOC 的数

据,以此类推。

② 레지스터靠前的주소,在加大데이터길이时,可읽기后面센서的데이터,但레지스터靠后的주소,不 能읽기在此주소前센서的데이터。

③ 一个레지스터容纳 2 个바이트데이터, 气压占 4 바이트,既 2 个레지스터,因此,在읽기气压时要把连续 两个레지스터都读出来,其他每个센서데이터占 2 바이트,既 1 个레지스터。

详情如下:

00MM00NN可以읽기到的데이터
00000001表示从시작주소 0000 읽기 CO2 데이터
00000002表示从시작주소 0000 읽기 CO2 ,TVOC 데이터
............
0000000D表示从시작주소 0000 읽기 CO2,TVOC,CH2O,PM2.5,湿
度,온도,PM10,PM1.0,조도,MCU 온도,소음데이터,气压
데이터
00010001表示从시작주소 0001 읽기 TVOC 데이터
00010002表示从시작주소 0001 읽기 TVOC,CH2O 데이터
............
00010007表示从시작주소 0001 取 TVOC,CH2O,PM2.5,湿度,温
度,PM10,PM1.0 데이터
0001000C表示从시작주소 0001 取 TVOC,CH2O,PM2.5,湿度,温
度,PM10,PM1.0,조도,MCU 온도,소음데이터,气压데이터
00020001表示从시작주소 0002 읽기 CH2O 데이터
00020002表示从시작주소 0002 읽기 CH2O,PM2.5 데이터
............
000B0001表示从시작주소 000B 읽기气压데이터(2 个레지스터)

例如: 模组的주소为 0x01,

用户보내기: 01 03 00 00 00 09 85 CC     ,即可将 9 个센서데이터读出;

用户보내기: 01 03 00 00 00 0B 04 0D     ,即可将 11 个센서데이터(含 MCU 온도)读出;

用户보내기: 01 03 00 00 00 0D 84 0F     ,即可将 12 个센서데이터(气压占 2 个레지스터)读出;

用户보내기: 01 03 00 0B 00 02 B5 C9     ,即仅읽기气压데이터(占 2 个레지스터)。

4)     읽기一帧데이터

5)     返回데이터형식如下:

바이트번호데이터설명
00x01헤더
10x03기능 코드
20x1A데이터길이
3
4
CO2_H
CO2_L
CO2 데이터
5
6
TVOC_H
TVOC_L
TVOC 데이터
7
8
CH2O_H
CH2O_L
CH2O 데이터
9
10
PM2.5_H
PM2.5  L
PM2.5 데이터
11
12
Humi_H
Humi_L
湿度데이터
13
14
Temp_H
Temp_L
온도데이터
15
16
PM10_H
PM10_L
PM10 데이터
17
18
PM01_H
PM01_L
PM1.0 데이터
19
20
Lux_H
Lux_L
조도(Lux)데이터
21
22
MCU_TEMP_H
MCU_TEMP_L
MCU 온도데이터
23
24
dB_H
dB_L
소음(dB)데이터
25
26
27
28
Pa_byte[3]
Pa_byte[2]
Pa_byte[1]
Pa_byte[0]
 气压데이터(Pa)
29
30
CRC16_L
CRC16_H
CRC16 체크섬

6)     系统매개변수설정

7)     可以通过对下表레지스터주소的读、写,以获取或修改系统매개변수。

8)     注意: 此项为高级功能, 请小心使用, 以免造成系统매개변수错误, 影响센서功能或데이터准确性。

레지스터주소길이(바이트)系统매개변수
0x01004센서설정位图(Sensor Map)
0x01102바이트 1(在前):是否为外置온습도센서
바이트 2:센서데이터用户校准位图,参见“传感 器模块位图 ”
0x01112바이트 1(在前):专用시리얼 HMI自定义指标项对应的센서번호
바이트 2:조도센서感光罩的透光率(0- 100), 0 表示没有感光罩, 100 表示无损耗
0x01182CO2 校准值, int16
0x01192TVOC 校准值, int16
0x011A2CH2O 校准值, int16
0x011B2PM2.5 校准值, int16
0x011C2湿度校准值(100 倍), int16
0x011D2온도校准值(100 倍), int16
0x011E2PM10 校准值, int16
0x011F2PM1.0 校准值, int16
0x01202조도(Lux)校准值, int16
0x01212MCU 온도校准值, int16
0x01222소음(dB)校准值, int16
0x01232大气压校准值, int16

注意:

1.所有用户校准值都是有符号整数,负数表示负偏移,既要减去偏移量;

2.温/湿度用户校准值是按摄氏度放大 100 倍,如: 250 表示需要加 2.5 摄氏度; -110 表示需要 减去 1.1 摄氏度。

例如: 模组的주소为 0x01,

用户보내기: 01 03 01 10 00 01 84 33     ,读出外置온습도센서기호和센서데이터用户校准位图; 用户보내기: 01 06 01 10 00 02 04 0D     ,열기온습도用户校准开关;

用户보내기: 01 03 01 1D 00 01 15 F0      ,读出온습도校准值;

用户보내기: 01 06 01 1D 00 FA 98 73     ,设置온도用户校准值 250,既+2.5 度; 用户보내기: 01 06 01 1D 80 6E F8 1C     ,设置온도用户校准值-110,既-1.1 度。

4.3     电脑읽기 RS485 데이터

通过“485  转시리얼 포트”适配器,可以将센서模组연결到电脑以检测通讯和보기데이터。电脑端可以使 用 ModBus 测试도구(如: ShortBus Modbus Scanner,效果见下图)直接읽기데이터;也可以使用“串 口助手”等표준시리얼 포트도구,通过보내기查询消息获取데이터。

V. 各种센서데이터계산방식

. CO2  (ppm)   = CO2_H * 256 + CO2_L

. TVOC (ug/m3)   = TVOC_H * 256 + TVOC_L

. CH2O (ug/m3)   = CH2O_H * 256 + CH2O_L

. PM2.5 (ug/m3)   = PM2.5_H * 256 + PM2.5_L

. PM10 (ug/m3)   = PM10_H * 256 + PM10_L

. PM1.0 (ug/m3)   = PM01_H * 256 + PM01_L

. 照度 (Lux)   = Lux_H * 256 + Lux_L

. 소음 (dB)   = dB_H * 256 + dB_L

. 인터페이스返回的温、湿度(真实데이터的 100 倍):

. 正온도 (℃) = (Temperature_H * 256 + Temperature_L) / 100, 例如: T = (0x09d0) / 10 = 2512 / 100 = 25.12℃

.  负온도 (℃)

方法 1:直接转为有符号的 int  유형即可,例如: T = 0xfc83/10 = -893/100 = -8.93℃

方法 2:如果大于 0x7fff(32767)

则为负数 T = (0xfc83 - 65536) / 10 = (64643 - 65536) / 10 = -893 / 100 = -8.93℃

. 湿度 (%RH)   = (Humidity_H * 256 + Humidity_L) / 100

. 气压 (Pa)   = Pa_byte[3] * 224 + Pa_byte[2] * 216 + Pa_byte[1] * 28 + Pa_byte[0]

. 根据气压계산海拔高度

气压单位是 Pa,理论上,海拔每上升 9 米,大气压降低 100 Pa。而海平面표준大气压为 101,325 Pa, 因此,可以用下面的公式根据气压值(Pa)계산海拔高度(Altitude)的近似值:

1 、 简化版海拔高度公式 = (101325 – Pa) / 100 * 9

除了海拔高度, 影响气压的因素还有很多(例如온도),下面的公式相对更精确一些, 特别是在高海 拔位置:

2 、 校准版海拔高度公式 = 44330 * (1 – (Pa/101325)0.1903)

例如:如果测得的气压值为 99,882Pa,则两个公式계산得到的海拔高度(Altitude)分别为:

. 简化版海拔高度 = (101325 – 99882) / 100 * 9 = 129.8 米

. 校准版海拔高度 = 44330 * (1 – (99882/101325)0.1903) = 120.84 米

VI.注意事项

. 初次上电使用需预热 3 分钟以上

. 센서安装位置应高于地面 15~20CM 以上, 否则可能有地面沙尘, 飘絮物等大尘埃颗粒甚至絮 状物污染导致风扇缠绕阻转,建议使用设备采取适当的预过滤处理。

. 本产品为精密仪器, 请不要열기外壳, 正常操作无需了解设备内部情况。如设备有损坏, 必须 由专业人员检修和维修,在检修和维修之前请确认外部연결电源已切断。。

. 센서데이터确保出厂个体之间的一致性, 不以第三方检测仪器或데이터作为对比표준。如用户希 望最终测量结果和某第三方检测设备一致,可由用户根据实际采集结果进行데이터拟合校准。

. 本센서适用于普通室内환경,如用户设备在以下实际환경中使用,센서有可能因过度积 尘、积油、进水导致데이터一致性下降。例如:全年尘埃浓度大于 300 微克/立方米时间超过  50% ,或大于 500 微克/立方米时间超过 20%;油烟환경;高水雾환경;户外等。

VII.      센서模块位图

位센서模块
0x01조도
0x02온습도气压
0x04粉尘
0x08空气质量
0x10소음

VIII. CRC 체크섬 계산方法

CRC 代码和예제可参考: https://github.com/sunbaoshi1975/CRCTool

函数功能: CRC 체크섬函数,生成 CRC

매개변수설명:pushMsg:需要체크섬的数组集

us데이터Len :需要체크섬데이터的길이

返回매개변수: CRC  为 unsigned int16  유형,高位바이트为高位在前、低位在后

/*CRC verify high position*/ 
const unsigned char auchCRCHi[] = { 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; 
/* CRC verify low position*/ 
const unsigned char auchCRCLo[] = { 
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; 
/*CRC check*/ 
uint16_t CRC16_Check(const uint8_t *pushMsg, uint8_t us데이터Len)
{
 uint8_t uchCRCHi = 0xff;//high CRC init
 uint8_t uchCRCLo = 0xff;//low CRC init
 uint8_t uIndex; //CRC index in loop
while(us데이터Len--) {
uIndex = uchCRCLo^ *pushMsg++;//cal CRC 
uchCRCLo = uchCRCHi^ auchCRCHi[uIndex]; 
uchCRCHi = auchCRCLo[uIndex]; 
} 
return((uint16_t)uchCRCHi << 8 | uchCRCLo); 
}
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注