气体传感器模块

简介

这是一款能够检测气体浓度的气体传感器,具有CO、O2、H2S、SO2等十余种型号,所有探头均经过出厂标定,可以快速、准确的测量环境中对应气体的浓度,支持模拟量、I2C和UART三种输出方式,广泛适用于工厂、矿井、废气处理系统等需要进行有害气体浓度检测的场景。

探头采用电化学原理,具有抗干扰能力强、稳定性高、灵敏度高等特点,使用寿命长达两年。对Arduino、ESP32、树莓派等主流的主控设备具有良好的兼容性。简单易用的Gravity接口,配上我们的样例代码,可迅速搭建出各种气体浓度检测仪。

产品特性

产品参数

特性参数

SKU SEN0465 SEN0466 SEN0467 SEN0468 SEN0469 SEN0470
气体类型 O2 CO H2S Cl2 NH3 SO2
探测范围 (0-25)%Vol (0-1000)ppm (0-100)ppm (0-20)ppm (0-100)ppm (0-20)ppm
分辨率 0.1%Vol 1ppm 1ppm 0.1ppm 1ppm 0.1ppm
V0电压输出范围 (1.5-0)V (0.6-3)V (0.6-3)V (2-0)V (0.6-3)V (0.6-2.4)V
Vout1 1.0V@10%vol 0.9V@200ppm 1.5V@50ppm 1.3V@10ppm 1.4V@50ppm 1.5V@10ppm
响应时间(T90) ≤15S ≤30S ≤30S ≤60S ≤150S ≤30S
SKU SEN0471 SEN0472 SEN0473 SEN0474 SEN0475 SEN0476
气体类型 NO2 O3 H2 HCL HF PH3
探测范围 (0-20)ppm (0-10)ppm (0-1000)ppm (0-10)ppm (0-10)ppm (0-1000)ppm
分辨率 0.1ppm 0.1ppm 1ppm 0.1ppm 0.1ppm 0.1ppm
V0电压输出范围 (2-0)V (2-0.7)V (0.6-3)V (2-0.7)V (2-0.5)V (0.6-3)V
Vout1 1.2V@10ppm 1.3V@5ppm 1.3V@500ppm 1.4V@5ppm 1.3V@5ppm 0.7V@50ppm
响应时间(T90) ≤30S ≤120S ≤120S ≤60S ≤60S ≤30S

VO使用说明:

VO:传感器经过放大电路后的原始电压(线性),并非当前环境被测气体的浓度值

计算方法:当前环境中浓度 N= 200/(Vout1-Vout0)*(Voutx-Vout0)

其中,Vout1对应表格中的Vout1,Vout0对应表格中气体在0ppm时对应的电压值。以 CO 为例:零点电压 Vout0 = 0.6V,Vout1 = 0.9V,当前 VO 的电压 Voutx=1.2V,则当前环境中浓度N=400ppm

注:模拟量输出为探头未经校准的原始电压,UART/I2C数据是经过出厂校准的,如无特殊要求,推荐使用校准后的UART/I2C数据。

引脚说明

标号 名称 功能描述
1 D/T I2C数据线SDA / UART数据传输-TX
2 C/R I2C时钟线SCL / UART数据接收-RX
3 - GND电源负极
4 + 电源正极(3.3-5V兼容)
标号 名称 功能描述
1 VCC 电源正极(3.3-5V兼容)
2 GND GND电源负极
3 V0 气体探头的原始电压输出。可根据原始输出自行开发转换算法。
4 ALA 阈值报警功能,可通过API设置阈值,超过该值时,该引脚输出电平会变化。
5 NA 预留自定义引脚,如有需要可联系我们定制功能。

Arduino使用教程

注意:

软硬件准备

问答模式获取数据

接线图

样例代码

说明

/*!
  * @file  readGasConcentration.ino
  * @brief 获取当前环境气体浓度以浓度值输出
  * @n 实验方式: 将传感器通信引脚与主控连接,烧录
  * @n 通信方式选择,拨码开关SEL:0:IIC,1:UART
  * @n i2c address select
  * @n             | A0 | A1 |
  * @n             | 0  | 0  |    0x74    default i2c address
  * @n             | 0  | 1  |    0x75
  * @n             | 1  | 0  |    0x76
  * @n             | 1  | 1  |    0x77
  */
#include "DFRobot_MultiGasSensor.h"

#define I2C_COMMUNICATION//默认打开,此时使用IIC通信,屏蔽之后使用串口通信

#ifdef  I2C_COMMUNICATION
#define I2C_ADDRESS    0x74
  DFRobot_GAS_I2C gas(&Wire ,I2C_ADDRESS);
#else
#if (!defined ARDUINO_ESP32_DEV) && (!defined __SAMD21G18A__)
/**
  UNO:pin_2-----RX
      pin_3-----TX
*/
  SoftwareSerial mySerial(2,3);
  DFRobot_GAS_SoftWareUart gas(&mySerial);
#else
/**
  ESP32:IO16-----RX
        IO17-----TX
*/
  DFRobot_GAS_HardWareUart gas(&Serial2); //ESP32HardwareSerial
#endif
#endif

void setup() {

  Serial.begin(115200);

/**
  传感器初始化,用作初始化串口或者初始化IIC,由此时使用的通信方式来决定
*/
  while(!gas.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("The device is connected successfully!");

/**
  获取数据模式为:主控需要向传感器请求
*/
  gas.changeAcquireMode(gas.PASSIVITY);
  delay(1000);

/**
  开启温度补偿:gas.ON : 开启
               gas.OFF:关闭
*/
  gas.setTempCompensation(gas.OFF);
}

void loop() {
  Serial.print("Ambient ");
  Serial.print(gas.queryGasType());
  Serial.print(" concentration is: ");
  Serial.print(gas.readGasConcentrationPPM());
  Serial.println(" %vol");
  Serial.print("The board temperature is: ");
  Serial.print(gas.readTempC());
  Serial.println(" ℃");
  Serial.println();
  delay(1000);
}

结果

打开串口监视器,得到气体类型、浓度和温度。

主动模式获取数据

接线图

样例代码

说明

/*!
  * @file  initiativeReport.ino
  * @brief 传感器主动上报全部数据
  * @n 实验方式: 将传感器通信引脚与主控连接,烧录
  * @n 通信方式选择,拨码开关SEL:0:IIC,1:UART
  * @n i2c address select
  * @n             | A0 | A1 |
  * @n             | 0  | 0  |    0x74    default i2c address
  * @n             | 0  | 1  |    0x75
  * @n             | 1  | 0  |    0x76
  * @n             | 1  | 1  |    0x77
*/
#include "DFRobot_MultiGasSensor.h"

//默认打开,此时使用IIC通信,屏蔽之后使用串口通信
#define I2C_COMMUNICATION

#ifdef I2C_COMMUNICATION
#define I2C_ADDRESS 0x74
DFRobot_GAS_I2C gas(&Wire, I2C_ADDRESS);
#else
#if (!defined ARDUINO_ESP32_DEV) && (!defined __SAMD21G18A__)
/**
  UNO:pin_2-----RX
      pin_3-----TX
*/
SoftwareSerial mySerial(2, 3);
DFRobot_GAS_SoftWareUart gas(&mySerial);
#else
/**
  ESP32:IO16-----RX
        IO17-----TX
*/
DFRobot_GAS_HardWareUart gas(&Serial2); //ESP32HardwareSerial
#endif
#endif

void setup() {

  Serial.begin(115200);

/**
  传感器初始化,用作初始化串口或者初始化IIC,由此时使用的通信方式来决定
*/
  while(!gas.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
/**
  开启温度补偿:gas.ON : 开启
               gas.OFF:关闭
*/
  gas.setTempCompensation(gas.OFF);

/**
  获取数据模式为:传感器主动上报数据
*/
  gas.changeAcquireMode(gas.INITIATIVE);
  delay(1000);
}

void loop() {
  if(true==gas.dataIsAvailable())
  {
    Serial.println("========================");
    Serial.print("gastype:");
    Serial.println(AllDataAnalysis.gastype);
    Serial.println("------------------------");
    Serial.print("gasconcentration:");
    Serial.print(AllDataAnalysis.gasconcentration);
    if (AllDataAnalysis.gastype.equals("O2"))
      Serial.println(" %VOL");
    else
      Serial.println(" PPM");
    Serial.println("------------------------");
    Serial.print("temp:");
    Serial.print(AllDataAnalysis.temp);
    Serial.println(" ℃");
    Serial.println("========================");
  }
  delay(1000);
}

结果

打开串口监视器,得到对应气体浓度和温度。

阈值报警

接线图

样例代码

/*!
  * @file  setThresholdAlarm.ino
  * @brief 设置传感器的阈值报警
  * @n 实验方式: 将传感器通信引脚与主控连接,烧录
  * @n 通信方式选择,拨码开关SEL:0:IIC,1:UART
  * @n i2c address select
  * @n             | A0 | A1 |
  * @n             | 0  | 0  |    0x74    default i2c address
  * @n             | 0  | 1  |    0x75
  * @n             | 1  | 0  |    0x76
  * @n             | 1  | 1  |    0x77     
*/
#include "DFRobot_MultiGasSensor.h"

//默认打开,此时使用IIC通信,屏蔽之后使用软串口通信
#define I2C_COMMUNICATION

#ifdef  I2C_COMMUNICATION
#define I2C_ADDRESS    0x74
  DFRobot_GAS_I2C gas(&Wire ,I2C_ADDRESS);
#else
#if (!defined ARDUINO_ESP32_DEV) && (!defined __SAMD21G18A__)
/**
  UNO:pin_2-----RX
      pin_3-----TX
*/
  SoftwareSerial mySerial(2, 3);
  DFRobot_GAS_SoftWareUart gas(&mySerial);
#else
/**
  ESP32:IO16-----RX
        IO17-----TX
*/
  DFRobot_GAS_HardWareUart gas(&Serial2); //ESP32HardwareSerial
#endif
#endif

/**
  设置与报警引脚连接的主控引脚
*/
#define ALA_pin 4

void setup() {
/**
  串口初始化,用作查看打印输出
*/
  Serial.begin(115200);

/**
  传感器初始化,用作初始化串口或者初始化IIC,由此时使用的通信方式来决定
*/
  while(!gas.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
/**
  获取数据模式为:主控需要向传感器请求
*/
  while (!gas.changeAcquireMode(gas.PASSIVITY))
  {
    delay(1000);
  }
  Serial.println("change acquire mode success!");


/**
  设置传感器报警的阈值
*/
  while (!gas.setThresholdAlarm(gas.ON, 2, gas.HIGH_THRESHOLD_ALA ,gas.queryGasType()))
  {
    Serial.println("Failed to open alarm!");
    delay(1000);
  }
  pinMode(ALA_pin,INPUT);
}

void loop() {
/**
  循环获取环境气体浓度,到阈值则报警
*/
  Serial.print(gas.queryGasType());
  Serial.print(":");
  Serial.println(gas.readGasConcentrationPPM());
  if (digitalRead(ALA_pin) == 1)
  {
    Serial.println("warning!!!");
  }
  else
  {
    Serial.println("nolmal!!!");
  }
  delay(200);
}

结果

API说明

模式选择函数changeAcquireMode()

传感器有主动上传和被动应答两种数据读取模式,用户可以根据需求自行调整。

通过“changeAcquireMode()”函数,修改括号中的参数,调整数据的发送模式。

“INITIATIVE”为主动上传模式,在主动上传模式下,传感器会每1秒自动上传1次参数;

”PASSIVITY“为被动应答模式,在被动应答模式下,只有在每次调用数据读取函数时,传感器才会反馈一次参数。

gas.changeAcquireMode(gas.INITIATIVE)
/*
      gas.INITIATIVE            // 主动上传模式
      gas.PASSIVITY             // 被动应答模式
*/

读取探头类型函数queryGasType()

通过“queryGasType()”函数,可以获取当前气体探头的类型

gas.queryGasType();

探头兼容类型及对应参数,可参考下表。

气体类型 CO O2 NH3 H2S NO2 HCL
探测范围 (0-1000)ppm (0-25)%VOL (0-100)ppm (0-100)ppm (0-20)ppm (0-10)ppm
分辨率 1ppm 0.1%VOL 1ppm 1ppm 0.1ppm 0.1ppm
V0电压输出范围 (0.6-3)V (1.5-0)V (0.6-3)V (0.6-3)V (2-0)V (2-0)V
响应时间(T90) ≤30S ≤15S ≤150S ≤30S ≤30S ≤60S
气体类型 H2 PH3 SO2 O3 CL2 HF
探测范围 (0-1000)ppm (0-1000)ppm (0-20)ppm (0-10)ppm (0-20)ppm (0-10)ppm
分辨率 1ppm 0.1ppm 0.1ppm 0.1ppm 0.1ppm 0.1ppm
V0电压输出范围 (0.6-3)V (0.6-3)V (0.6-3)V (2-0)V (2-0)V (2-0)V
响应时间(T90) ≤120S ≤30S ≤30S ≤120S ≤60S ≤60S

读取气体浓度函数readGasConcentrationPPM()

通过“readGasConcentrationPPM()”函数,可以读取到气体传感器的反馈气体浓度数值。

gas.readGasConcentrationPPM();

温度读取函数readTempC()

通过“readTempC()”函数,可以读取板载温度传感器数据。

gas.readTempC();

电压读取函数getSensorVoltage()

通过“getSensorVoltage()”函数,可以读取气体探头原始电压输出V0。

gas.getSensorVoltage();

配置温度补偿函数setTempCompensation()

通过“setTempCompensation()”函数,可以配置温度补偿功能,选择开启或关闭。

gas.setTempCompensation();
/*
      gas.ON      开启
      gas.OFF        关闭
*/

阈值报警函数setThresholdAlarm()

通过“setThresholdAlarm()”函数,可以配置阈值报警信息。

gas.setThresholdAlarm(gas.ON, 200, gas.LOW_THRESHOLD_ALA ,gas.queryGasType());
/*
    gas.ON      开启
      gas.OFF        关闭
      200            设置阈值
      gas.LOW_THRESHOLD_ALA 报警时跳转低电平
      gas.HIGH_THRESHOLD_ALA 报警时跳转高电平
      gas.queryGasType() 设置报警气体类型
*/

I2C地址组配置函数changeI2cAddrGroup()

通过"changeI2cAddrGroup()"函数,可以配置I2C地址组编码,切换不同的地址组。

为了防止多探头使用时的地址冲突情况,我们准备了8组共23个地址,如有需求可以使用库文件中的样example "changeSensorI2CAddr.ino"进行切换。修改"changeI2cAddrGroup()"的组序号配置即可。串口信息显示"IIC addr change success!"后,重新上电即可。

gas.changeI2cAddrGroup(i);
 /* 
     i            组序号

  //组序号及拨码开关配置表格
  A0 A1拨码电平    00    01    10    11
    1            0x60  0x61  0x62  0x63
    2            0x64  0x65  0x66  0x67
    3            0x68  0x69  0x6A  0x6B
    4            0x6C  0x6D  0x6E  0x6F
    5            0x70  0x71  0x72  0x73
    6(默认地址组) 0x74  0x75  0x76  0x77(默认地址)
    7            0x78  0x79  0x7A  0x7B
    8            0x7C  0x7D  0x7E  0x7F
 */

串口协议使用教程

通过UART串口通讯协议,可以将传感器连接到任何带有UART的控制器上,进行数据的读取和传感器的配置。 注意,此时传感器上的拨码开关SEL端必须置于“1”的位置

串口参数设置

波特率 9600(固定)
数据位 8位
校验位 1位

通讯协议说明

① 0x78——修改终端通讯模式

终端有主动上传式和问答式两种通讯模式,出厂默认为主动上传模式,每间隔1s发送一次数据。

发送

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 地址 命令 通讯模式 -- -- -- -- 校验值
0xFF 0x01 0x78 主动上传模式:0x03
问答模式:0x04
0x00 0x00 0x00 0x00 0x84
0x83

EXP. FF 01 78 04 00 00 00 00 83 (切换为问答模式)

EXP. FF 01 78 03 00 00 00 00 84(切换为主动模式)

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 返回标定 -- -- -- -- -- 校验值
0xFF 0x78 成功:0x01
失败:0x00
0x00 0x00 0x00 0x00 0x00 0x87
0x88

EXP. FF 78 01 00 00 00 00 00 87 (设置成功)

EXP. FF 78 00 00 00 00 00 00 88 (设置失败)

② 主动上传模式,数据格式

在主动上传模式下,终端会每1s返回一次数据,数据格式如下。

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 气体浓度值
高位
气体浓度值
低位
气体类型
小数位数
温度数值
高位
温度数值
低位
校验值
0xFF 0x88 0x00 0x00 0x00 0x00 0x00 0x00 --

注意

气体类型列表

气体类型 指令码 气体类型 指令码
NH3 0x02 SO2 0x2B
H2S 0x03 NO2 0x2C
CO 0x04 HCL 0x2E
O2 0x05 CL2 0X31
H2 0x06 HF 0x33
O3 0x2A PH3 0x45

③ 0x86——问答模式,读取气体浓度和类型

在问答模式中,需要通过发送命令读取终端的各类参数,读取气体浓度和类型的方式如下。

发送

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 地址 命令 -- -- -- -- -- 校验值
0xFF 0x01 0x86 0x00 0x00 0x00 0x00 0x00 0x79

EXP. FF 01 86 00 00 00 00 00 79

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 气体浓度
高位
气体浓度
低位
气体类型
小数位数
-- -- 校验值
0xFF 0x86 0x00 0x00 0x00 0x00 0x00 0x00 0x7A

EXP. FF 86 00 00 00 00 00 00 7A

注意

④ 0x87——问答模式,读取温度数据

在问答模式中,需要通过发送命令读取终端的各类参数。终端集成了热敏电阻,可以获取终端的实时温度,读取终端温度的方式如下。

发送

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 地址 命令 -- -- -- -- -- 校验值
0xFF 0x01 0x87 0x00 0x00 0x00 0x00 0x00 0x78

EXP. FF 01 87 00 00 00 00 00 78

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 温度数据
高位
温度数据
低位
-- -- -- -- 校验值
0xFF 0x87 0x00 0x00 0x00 0x00 0x00 0x00 0x79

EXP. FF 87 00 00 00 00 00 00 79

注意: 温度值的计算方法见下方示例代码:“温度值计算”

⑤ 0x88——问答模式,读取温度、气体类型和浓度数据

在问答模式中,需要通过发送命令读取终端的各类参数,同时读取终端温度和气体浓度数据的方式如下。

发送

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 地址 命令 -- -- -- -- -- 校验值
0xFF 0x01 0x88 0x00 0x00 0x00 0x00 0x00 0x77

EXP. FF 01 88 00 00 00 00 00 77

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 气体浓度
高位
气体浓度
低位
气体类型 小数位数 温度数据
高位
温度数据
低位
校验值
0xFF 0x88 0x00 0x00 0x00 0x00 0x00 0x00 0x78

EXP. FF 88 00 00 00 00 00 00 78

注意:

⑥ 0x89——配置阈值报警功能

终端带有阈值报警功能,可配置报警阈值。

注意:当不连接外部控制器,仅使用传感器实现此功能,配置好阈值报警功能相关参数后必须将传感器设置为主动上传模式。

发送

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 功能开关设置 报警浓度阈值
高位
报警浓度阈值
低位
-- -- 校验值
0xFF 0x01 0x89 开:0x01
关:0x00
0x00 0x00 0x00 0x00 0x71
0x70

EXP. FF 01 89 00 00 05 00 00 71(关闭报警功能)

EXP. FF 01 89 01 00 05 00 00 70(开启报警功能)

注意:浓度如何计算请参考 ⑤

返回

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 返回配置结果 功能开关状态 报警浓度阈值
高位
报警浓度阈值
低位
-- -- 校验值
0xFF 0x89 成功:0x01
失败:0x00
开:0x01
关:0x00
0x00 0x00 0x00 0x00 --

使用树莓派等控制器通过代码配置阈值报警,可使用此python代码:GAS_ALA.zip

校验和计算

校验值 = (取反(字节1 + 字节2 + ··· ··· +字节7) + 1

参考例程如下:

/****************************************************************** 
* 函数名: unsigned char FucCheckSum(uchar *i,ucharln) 
* 功能描述:求和校验(取发送、接收协议的1\2\3\4\5\6\7的和取反+1) 
* 函数说明:将数组的元素1-倒数第二个元素相加后取反+1(元素个数必须大于2) 
******************************************************************/
char data[] = {0xFF,0x01,0x89,0x00,0x00,0x05,0x00,0x00};

unsigned char FucCheckSum(unsigned char *i,unsigned char ln)
{ 
    unsigned char j,tempq=0; 
    i+=1; 
    for(j=0;j<(ln-2);j++) 
    { 
        tempq+=*i; 
        i++; 
    } 
    tempq=(~tempq)+1; 
    return(tempq); 
}

void setup() {
  Serial.begin(115200);
  Serial.println(FucCheckSum(data,8),HEX);
}

void loop() {

}

温度值计算

byte Temp_H = 0x01;//温度数值高位
byte Temp_L = 0xD9;//温度数值低位

void setup() {
  Serial.begin(115200);
  uint16_t temp_ADC = (Temp_H << 8) + Temp_L;
  float Vpd3 = 3 * (float)temp_ADC / 1024;
  float Rth = Vpd3 * 10000 / (3 - Vpd3);
  float Temp = 1 / (1 / (273.15 + 25) + 1 / 3380.13 * log(Rth / 10000)) - 273.15;
  Serial.println(Temp);
}

void loop() {

}

使用注意

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多