CO2 二氧化碳传感器模块"CO2 二氧化碳传感器模块(SKU:SEN0159)"

简介

这是一款Arduino兼容的酒精浓度传感器模组,测量范围0-5ppm,支持I2C和UART两种输出方式,经过出厂标定,可以快速、准确的测量环境中酒精蒸汽的浓度。适用于酒驾检测、汽车智能化及其他小浓度场景下的酒精蒸汽浓度检测。

DFRobot推出的酒精传感器,采用电化学原理,出厂前已经进行过标定,可以准确测量环境中的酒精浓度。并具有抗干扰能力强、稳定性高、灵敏度高等特点,使用寿命长达两年。分辨率可以达到0.01ppm(10ppb),支持3.3~5.5V宽电压输入,具有I2C和UART两种数据输出类型,兼容Arduino、ESP32、树莓派等主流的主控设备,具有良好的兼容性。简单易用的Gravity接口,配上我们的样例代码,可迅速搭建出自己的酒精浓度检测仪。

特性

  • 出厂标定,数据精确
  • 高灵敏度、低功耗
  • 优异的稳定性、抗干扰
  • I2C和UART两种输出方式
  • 卓越的线性输出
  • 使用寿命长
  • 兼容3.3~5.5V主控器
  • 反接保护

产品参数

  • 检测气体: 酒精
  • 干扰气体:苯、甲苯、乙酸、硫化氢、一氧化碳
  • 工作电压: 3.3~5.5V DC
  • 功耗:0.05W(5V)
  • 输出信号: I2C、UART输出(0~3V)
  • 测量范围: 0~5ppm
  • 分辨率: ≤0.01ppm(10ppb)
  • 误差范围: ±10%满量程
  • 预热时间: ≤3分钟
  • 响应时间: ≤60秒
  • 恢复时间: ≤60秒
  • 工作温度: -20~50℃
  • 工作湿度: 15~90%RH (无凝结)
  • 存储温度: 0~25℃
  • 寿 命: >2 年(空气中)
  • 电路板尺寸:27mm*37mm

引脚说明

SEN0376 酒精传感器接口定义

标号 名称 功能描述
1 D/T I2C数据线SDA/UART数据传输-TX
2 C/R I2C时钟线SCL/UART数据接收-RX
3 - GND电源负极
4 + 电源正极

Arduino使用教程

将程序下载到UNO,打开串口监视器查看酒精浓度。

注意:

  • 初次上电建议预热24~48小时。
  • 预热时间输出的酒精浓度值将在3分钟以后逐渐趋于稳定,请忽略预热3分钟内的酒精浓度值。
  • 不要使用风油精和花露水进行测试,均属于有机溶剂,会损坏传感器。

软硬件准备

使用I2C读取传感器数据

接线图

样例代码

  • 将模块与Arduino按照上方的连线图相连,当然你也可以配合Gravity I/O扩展板使用,可以更方便、更快速的完成项目原型搭建。
  • 将传感器上的选择开关,拨到I2C一侧。
  • I2C地址默认为0x75,对应代码中的ADDRESS_3。如果需要修改I2C地址,可先通过模块上的拨码开关配置硬件I2C地址,并修改样例代码中I2C地址的定义ADDRESS_X。拨码开关与I2C地址参数对应关系如下:
    • ADDRESS_0:0x72, A0=0, A1=0
    • ADDRESS_1:0x73, A0=1, A1=0
    • ADDRESS_2:0x74, A0=0, A1=1
    • ADDRESS_3:0x75, A0=1, A1=1
  • 下载并安装DFRobot_AlcoholSensor库如何安装库?
  • 打开Arduino IDE,将下面的代码上传到Arduino UNO。
  • 打开Arduino IDE的串口监控视器,把波特率调至9600,观察串口打印结果。
  /*!
  * @file  readAlcohol.ino
  * @brief Reading Alcohol concentration, A concentration of one part per million (PPM).
  * @n step: we must first determine the iic device address, will dial the code 
  * @n switch A0, A1 (ALCOHOL_ADDRESS_0 for [0 0]), (ALCOHOL_ADDRESS_1 for [1 0]), (ALCOHOL_ADDRESS_2 for [0 1]), (ALCOHOL_ADDRESS_3 for [1 1]).
  * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
  * @license The MIT License (MIT)
  * @author ZhixinLiu(zhixin.liu@dfrobot.com)
  * @version V1.0
  * @date 2020-09-09
  * @url https://github.com/dfrobot/DFRobot_Alcohol
  */

#include "DFRobot_Alcohol.h"

#define COLLECT_NUMBER   5                      // collect number, the collection range is 1-100
#define ALCOHOL_I2C_ADDRESS ALCOHOL_ADDRESS_3
/**
 * select i2c device address 
 * ALCOHOL_ADDRESS_0               0x72
 * ALCOHOL_ADDRESS_1               0x73
 * ALCOHOL_ADDRESS_2               0x74
 * ALCOHOL_ADDRESS_3               0x75
 */
DFRobot_Alcohol_I2C Alcohol(&Wire ,ALCOHOL_I2C_ADDRESS);
/*
#ifdef ESP_PLATFORM
  // ESP32 user hardware uart
  // RX io16
  // TX io17
  DFRobot_Alcohol_UART Alcohol(&Serial2 ,9600);
#else
  // Arduino user software uart
  // RX io10
  // TX io11
  SoftwareSerial mySerial(10 ,11);
  DFRobot_Alcohol_UART Alcohol(&mySerial ,9600);
#endif
*/
void setup() 
{
  Serial.begin(9600);
  while(!Alcohol.begin()){
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("Device connected successfully !");
  /**
   * set measuer mode
   * MEASURE_MODE_AUTOMATIC         active  mode
   * MEASURE_MODE_PASSIVE           passive mode
   */
  Alcohol.setModes(MEASURE_MODE_AUTOMATIC);
}

void loop() 
{
  /**
   * Smooth data collection
   * COLLECT_NUMBER                 The collection range is 1-100
   */
  float alcoholConcentration = Alcohol.readAlcoholData(COLLECT_NUMBER);
  if(alcoholConcentration == ERROR){
    Serial.println("Please check the connection !");
  }else{
    Serial.print("Alcohol concentration is ");
    Serial.print(alcoholConcentration);
    Serial.println(" PPM.");
  }
  delay(1000);
}

结果

打开串口监视器,预热约3分钟后,得到最终的数据。

注意:
1. 酒精传感器可能会存在数据漂移的现象。
2. 电化学类型的传感器初次上电需要预热24~48小时。

使用UART读取传感器数据

接线图

样例代码

  • 将模块与Arduino按照上方的连线图相连,当然你也可以配合Gravity I/O扩展板使用,可以更方便、更快速的完成项目原型搭建。
  • 将传感器上的选择开关,拨到UART一侧。
  • 下载并安装DFRobot_AlcoholSensor库如何安装库?
  • 打开Arduino IDE,将下面的代码上传到Arduino UNO。
  • 打开Arduino IDE的串口监控视器,把波特率调至9600,观察串口打印结果。
 /*!
  * @file  readAlcohol.ino
  * @brief Reading Alcohol concentration, A concentration of one part per million (PPM).
  * @n step: we must first determine the iic device address, will dial the code switch A0, A1 (ADDRESS_0 for [0 0]), (ADDRESS_1 for [1 0]), (ADDRESS_2 for [0 1]), (ADDRESS_3 for [1 1]).
  *
  * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)
  * @licence     The MIT License (MIT)
  * @author      ZhixinLiu(zhixin.liu@dfrobot.com)
  * @version     V1.0
  * @date        2020-09-09
  * @get         from https://www.dfrobot.com
  * @url         https://github.com/dfrobot/DFRobot_Alcohol
  */

#include "DFRobot_Alcohol.h"

#define COLLECT_NUMBER   5                      // collect number, the collection range is 1-100
#define ALCOHOL_I2C_ADDRESS ADDRESS_3
/*   iic slave Address, The default is ADDRESS_3
       ADDRESS_0               0x72             // i2c device address
       ADDRESS_1               0x73
       ADDRESS_2               0x74
       ADDRESS_3               0x75
*/
//DFRobot_Alcohol_I2C Alcohol(&Wire ,ALCOHOL_I2C_ADDRESS);

#ifdef ESP_PLATFORM
  // ESP32 user hardware uart
  // RX io16
  // TX io17
  DFRobot_Alcohol_UART Alcohol(&Serial2 ,9600);
#else
  // Arduino user software uart
  // RX io10
  // TX io11
  SoftwareSerial              mySerial(10 ,11);
  DFRobot_Alcohol_UART Alcohol(&mySerial ,9600);
#endif

void setup() 
{
  Serial.begin(9600);
  while(!Alcohol.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("Device connected successfully !");

/*  Set iic mode, active mode or passive mode
      MEASURE_MODE_AUTOMATIC            // active  mode
      MEASURE_MODE_PASSIVE              // passive mode
*/
  Alcohol.SetModes(MEASURE_MODE_AUTOMATIC);
}


void loop() 
{
/*  Smooth data collection
      COLLECT_NUMBER                    // The collection range is 1-100
*/
  float alcoholConcentration = Alcohol.ReadAlcoholData(COLLECT_NUMBER);
  if(alcoholConcentration == ERROR)
  {
    Serial.println("Please check the connection !");
  }else{
    Serial.print("Alcohol concentration is ");
    Serial.print(alcoholConcentration);
    Serial.println(" PPM.");
  }
  delay(1000);
}

结果

打开串口监视器,预热约3分钟后,得到最终的数据。

注意:
1. 酒精传感器可能会存在数据漂移的现象。
2. 电化学类型的传感器初次上电需要预热24~48小时。

数据读取方式

SEN0376 Gravity: 电化学酒精传感器有主动上传和被动应答两种数据读取模式,出厂默认为主动上传模式,用户可以根据需求在代码中通过自行调整。

模式选择函数

可以通过修改括号中的参数,调整数据的发送模式。

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

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

Alcohol.SetModes(MEASURE_MODE_AUTOMATIC);
/*
      MEASURE_MODE_AUTOMATIC            // 主动上传模式
      MEASURE_MODE_PASSIVE              // 被动应答模式
*/

数据读取函数

通过“ReadAlcoholData()”函数,可以读取到酒精传感器的反馈数值。该函数在输出前会将数据采集数组“COLLECT_NUMBER”中的数据进行平均值处理。"COLLECT_NUMBER"数组的大小默认为5,可以在代码中“#define COLLET_NUMBER 5"进行调整,数值在1-100之间。

#define COLLECT_NUMBER   5    

Alcohol.ReadAlcoholData(COLLECT_NUMBER);
/*  
      COLLECT_NUMBER                    // The collection range is 1-100
*/

串口协议使用教程

通过UART串口通讯协议,可以将SEN0376 Gravity: 电化学酒精传感器连接到任何带有UART的控制器上,进行数据的读取和传感器的配置。

参数设置

波特率 9600
数据位 8位
校验位 1位

通讯命令

传感器有主动上传式和问答式两种通讯模式,出厂默认为主动上传模式,每间隔1s发送一次浓度值。

主动上传模式的数据显示格式为:

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 气体名称
C2H5OH
单位
(ppb)
小数位数
气体浓度
高位
气体浓度
低位
满量程
高位
满量程
低位
校验值
0xFF 0x17 0x04 0x00 0x00 0x25 0x13 0x88 0x25

注意气体浓度值(PPB)=气体浓度高位*256+气体浓度低位。当转换为 PPM 时:PPM= PPB/1000。

如果切换到问答模式下,需要重新切换为主动上传时,发送命令的格式如下:

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 切换命令 主动上传模式 校验值
0xFF 0x01 0x78 0x40 0x00 0x00 0x00 0x00 0x47

当需要切换到问答模式时,可以通过发送命令进行模式切换,再发送读取浓度的命令,即可获取浓度数值。

切换问答模式的命令格式如下:

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 切换命令 问答模式 校验值
0xFF 0x01 0x78 0x41 0x00 0x00 0x00 0x00 0x46

在问答模式下,读取浓度的命令格式如下:

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

问答模式的数据显示格式为:

Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
起始位 命令 气体浓度
高位(ppb)
气体浓度
低位(ppb)
校验值
0xFF 0x86 0x00 0x00 0x00 0x00 0x00 0x20 0x5A

气体浓度值(PPB)=气体浓度高位*256+气体浓度低位

校验和计算

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

参考例程如下:

/****************************************************************** 
* 函数名: unsigned char FucCheckSum(uchar *i,ucharln) 
* 功能描述:求和校验(取发送、接收协议的1\2\3\4\5\6\7的和取反+1) 
* 函数说明:将数组的元素1-倒数第二个元素相加后取反+1(元素个数必须大于2) 
******************************************************************/
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); 
}

注意事项

交叉干扰特性

由于该传感器为电化学原理,所以部分气体会对传感器产生干扰,相关交叉干扰特性可参考下表。

气体 浓度/PPM 乙醇等同浓度
10 0.1
甲苯 10 0.46
乙酸 200 0.52
硫化氢 50 3
一氧化碳 200 0.64

使用注意

  • 模组避免接触使传感器中毒的物质(包括硅胶及其它胶粘剂)、涂料、药剂、油类及高浓度气体。
  • 模组不可用树脂材料完全封装,也不可浸没在无氧环境中,否则会损坏传感器的性能。
  • 模组不能长时间应用于含有腐蚀性气体的环境中,腐蚀性气体会损害传感器。
  • 模组不可经受过度的撞击或震动。
  • 模组初次上电使用需预热 24-48 小时左右,使模组充分稳定后正常测试。
  • 模组避免接触影响数值准确性的有机溶剂等,如:空气清新剂、女性化妆品、花露水等。
  • 请勿将模组安装在强对流空气环境下使用。
  • 请勿将模组长时间放置于高浓度有机气体中,长期放置会导致传感器零点发生漂移,恢复缓慢。
  • 禁止用热熔胶或者固化温度高于 80℃以上的密封胶封装模组。
  • 禁止长时间在高浓度碱性气体中存放和使用。

常见问题

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

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

更多

DFshopping_car1.png DFRobot商城购买链接