SEN0376

简介

这是一款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商城购买链接