简介
Fermion: ENS160 空气质量传感器,搭载了ScioSense公司新推出ENS160空气质量传感器。该传感器专为室内空气质量检测而设计,能直接输出多种IAQ(TVOC、eCO2、AQI)数据。创新的TrueVOC技术结合金属氧化物(MOX)技术使得该传感器有优越准确性、快速响应、抗干扰等特性。
ENS160空气质量传感器内置算法,直接输出TVOC、eCO2、AQI数据,环境数据更丰富、容易理解。该传感器的预热时间小于3分钟,可以更快速的获得准确数据,内置基线自动校准算法,确保了传感器的长期稳定性。
空气质量参考指标
AQI等级参考
eCO2/CO2浓度参考
TVOC浓度参考
产品特性
- 多种IAQ输出(TVOC、eCO2、AQI),环境数据丰富
- 预热时间小于三分钟,更快获取数据
- 内置算法,输出数据更准确
- 自动校准基线,长期使用更稳定
应用场景
- 空气净化/家庭自动化
- 环境污染检测
- 暖通空调/通风系统
- 楼宇自动化/智能恒温器
- 电器/抽油烟机
技术规格
- 供电电压:3.3 V
- 工作电流:29 mA
- 预热时间:<3分钟
- 接口方式:I2C、SPI
- I2C地址:0x52、0x53(默认)
- 工作温度范围:-40℃~85℃
- 工作湿度范围:5 %RH~95 %RH
- eCO2测量范围:400 ppm~65000 ppm
- TVOC测量范围:0 ppb~65000 ppb
- 产品尺寸:20*15 mm
- 安装孔:孔间距:15 mm,孔径:2 mm
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | 3V3 | 电源正极3.3V |
2 | GND | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | SCK | 串行时钟线 |
6 | SDI | 串行数据输入 |
7 | SDO | 串行数据输出 |
8 | CS | 片选引脚 |
9 | INT | 中断引脚 |
Arduino使用教程
按接线图所示将传感器与FireBeetle Board ESP32-E(或其它3.3V主板)相连接.
准备
- 硬件
- FireBeetle Board ESP32-E x1
- ENS160 空气质量传感器 x1
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
- ENS160库文件和示例程序
关于如何安装库文件,点击链接
接线图
样例代码1 - 轮询获取数据
- 通过Arduino IDE将程序烧录到FireBeetle Board ESP32-E,打开串口我们可以在串口监视器依次看到打印出的传感器状态、AQI等级以及TVOC、eCO2浓度。
传感器运行状态
状态 | 解释 |
---|---|
0 | 正常运行 |
1 | 预热,上电后前3分钟(需传感器不再出现初次启动状态) |
2 | 初次启动,上电后前1小时(传感器连续工作24小时后将不再出现该状态,如果中途出现断电,重新上电后传感器仍会进入初次启动状态) |
更详细的解释请看芯片手册第10章
⚠**注意:**环境温湿度会影响数据准确度,请在setTempAndHum(/*temperature=*/temp, /*humidity=*/hum);
函数中填入当前环境温湿度。
/*!
* @file getMeasureData.ino
* @brief 通过轮询方式获取传感器数据(Fermion版本请使用3.3V主控)
* @details 配置传感器电源模式, 测量参数(测量气体时用于补偿校准的温度和相对湿度)
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V1.0
* @date 2021-10-26
* @url https://github.com/DFRobot/DFRobot_ENS160
*/
#include <DFRobot_ENS160.h>
#define I2C_COMMUNICATION //use I2C for communication, 屏蔽此行代码则使用SPI进行通信
#ifdef I2C_COMMUNICATION
/**
* Fermion版本I2C地址默认为0x53, 将SDO引脚连接到GND I2C地址为0x52
*/
DFRobot_ENS160_I2C ENS160(&Wire, /*iicAddr*/ 0x53);
#else
uint8_t csPin = D3;
DFRobot_ENS160_SPI ENS160(&SPI, csPin);
#endif
void setup(void)
{
Serial.begin(115200);
// 初始化传感器
while( NO_ERR != ENS160.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
/**
* 设置电源模式
* mode 可配置的电源模式:
* ENS160_SLEEP_MODE: DEEP SLEEP mode (low power standby)
* ENS160_IDLE_MODE: IDLE mode (传感器不进行数据测量)
* ENS160_STANDARD_MODE: STANDARD Gas Sensing Modes
*/
ENS160.setPWRMode(ENS160_STANDARD_MODE);
/**
* 设置温湿度环境参数,用于测量数据的校准补偿
* temperature 当前环境温度, float类型, 单位: C
* humidity 当前环境湿度, float类型, 单位: %rH
*/
ENS160.setTempAndHum(/*temperature=*/25.0, /*humidity=*/50.0);
}
void loop()
{
/**
* 获取传感器运行状
* 返回值:0-Normal operation,
* 1-Warm-Up phase, During first 3 minutes after power-on.
* 2-Initial Start-Up phase, During first full hour of operation after initial power-on.Only once in the sensor’s lifetime.
* Note that the status will only be stored in the non-volatile memory after an initial 24h of continuous
* operation. If unpowered before conclusion of said period, the ENS160 will resume "Initial Start-up" mode
* after re-powering.
*/
uint8_t Status = ENS160.getENS160Status();
Serial.print("传感器运行状态 : ");
Serial.println(Status);
/**
* 获取空气质量指数
* 返回值: 1-Excellent, 2-Good, 3-Moderate, 4-Poor, 5-Unhealthy
*/
uint8_t AQI = ENS160.getAQI();
Serial.print("Air quality index : ");
Serial.println(AQI);
/**
* 获取TVOC数据
* 返回值范围为: 0–65000, 单位: ppb
*/
uint16_t TVOC = ENS160.getTVOC();
Serial.print("Concentration of total volatile organic compounds : ");
Serial.print(TVOC);
Serial.println(" ppb");
/**
* 获取eCO2数据
* 返回值范围为: 400–65000, 单位: ppm
*/
uint16_t ECO2 = ENS160.getECO2();
Serial.print("Carbon dioxide equivalent concentration : ");
Serial.print(ECO2);
Serial.println(" ppm");
Serial.println();
delay(1000);
}
结果
实时的eCO2、TVOC浓度、AQI等级以及传感器运行状态已经打印在了串口监视器中
样例代码2 - 中断获取数据
通过Arduino IDE将程序下载到FireBeetle Board ESP32-E,当中断触发时我们可以在串口监视器看到打印出的TVOC、eCO2浓度以及AQI等级。
/*!
* @file interruptDataDrdy.ino
* @brief 通过中断获取传感器数据(Fermion版本请使用3.3V主控,该示例仅适用于Fermion版本)
* @details 配置传感器中断模式, 当传感器有新数据时产生中断
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V1.0
* @date 2021-10-27
* @url https://github.com/DFRobot/DFRobot_ENS160
*/
#include <DFRobot_ENS160.h>
#define I2C_COMMUNICATION //use I2C for communication, 屏蔽此行代码则使用SPI进行通信
#ifdef I2C_COMMUNICATION
/**
* Fermion版本I2C地址默认为0x53, 将SDO引脚连接到GND I2C地址为0x52
*/
DFRobot_ENS160_I2C ENS160(&Wire, /*iicAddr*/ 0x53);
#else
uint8_t csPin = D3;
DFRobot_ENS160_SPI ENS160(&SPI, csPin);
#endif
/* Interrupt flag */
volatile uint8_t flag = 0;
/* External interrupt flag */
void interrupt()
{
if(flag ==0){
flag = 1;
}
}
void setup(void)
{
Serial.begin(115200);
// 初始化传感器
while( NO_ERR != ENS160.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
/**
* 设置温湿度环境参数,用于用于测量数据的校准补偿
* temperature 当前环境温度, float类型, 单位: C
* humidity 当前环境湿度, float类型, 单位: %rH
*/
ENS160.setTempAndHum(/*temperature=*/25.0, /*humidity=*/50.0);
#if defined(ESP32) || defined(ESP8266)
// D2 pin is used as interrupt pin by default, other non-conflicting pins can also be selected as external interrupt pins.
attachInterrupt(digitalPinToInterrupt(D4)/* Query the interrupt number of the D4 pin */, interrupt, RISING);
#elif defined(ARDUINO_SAM_ZERO)
// Pin 5 is used as interrupt pin by default, other non-conflicting pins can also be selected as external interrupt pins
attachInterrupt(digitalPinToInterrupt(5)/* Query the interrupt number of the 5 pin */, interrupt, RISING);
#endif
/**
* 中断配置(INT)
* mode 需要设置的中断模式,下列模式相与为mode:
* 中断设置(有新数据时产生中断): eINTModeDIS-禁用中断, eINTModeEN-启用中断
* 中断引脚输出驱动模式: eINTPinOD-开漏输出, eINTPinPP-推挽输出
* 中断引脚有效电平: eINTPinActiveLow-低电平有效, eINTPinActiveHigh-高电平有效
*/
ENS160.setINTMode(ENS160.eINTModeEN |
ENS160.eINTPinPP |
ENS160.eINTPinActiveHigh);
Serial.println();
delay(1000);
}
void loop()
{
if(flag == 1){
flag = 0;
/**
* 获取根据UBA计算出的空气质量指数
* 返回值范围为: 1-5(对应Excellent, Good, Moderate, Poor, Unhealthy这五个等级)
*/
uint8_t AQI = ENS160.getAQI();
Serial.print("Air quality index : ");
Serial.println(AQI);
/**
* 获取总挥发性有机化合物(TVOC)的浓度
* 返回值范围为: 0–65000, 单位: ppb
*/
uint16_t TVOC = ENS160.getTVOC();
Serial.print("Concentration of total volatile organic compounds : ");
Serial.print(TVOC);
Serial.println(" ppb");
/**
* 获取根据检测到的VOCs和氢报告计算出的二氧化碳当量浓度(eCO2 – Equivalent CO2)
* 返回值范围为: 400–65000, 单位: ppm
* 分为五个等级: Excellent(400 - 600), Good(600 - 800), Moderate(800 - 1000),
* Poor(1000 - 1500), Unhealthy(> 1500)
*/
uint16_t ECO2 = ENS160.getECO2();
Serial.print("Carbon dioxide equivalent concentration : ");
Serial.print(ECO2);
Serial.println(" ppm");
}
}
结果
实时的eCO2、TVOC浓度和AQI等级已经打印在了串口监视器中
主要API接口函数列表
/**
* @fn setPWRMode
* @brief 设置电源模式
* @param mode 可配置的电源模式:
* @n ENS160_SLEEP_MODE: DEEP SLEEP mode (low power standby)
* @n ENS160_IDLE_MODE: IDLE mode (low-power)
* @n ENS160_STANDARD_MODE: STANDARD Gas Sensing Modes
* @return None
*/
void setPWRMode(uint8_t mode);
/**
* @fn setINTMode
* @brief 中断配置(INT)
* @param mode 需要设置的中断模式,下列模式相与为mode:
* @n 在DATA_XXX寄存器中出现新数据(可获取新的测量数据)时产生中断: eINTModeDIS, 禁用中断; eINTModeEN, 启用中断
* @n 中断引脚输出驱动模式: eINTPinOD, 开漏; eINTPinPP, 推挽
* @n 中断引脚有效电平: eINTPinActiveLow, 低电平有效; eINTPinActiveHigh, 高电平有效
* @return None
*/
void setINTMode(uint8_t mode);
/**
* @fn setTempAndHum
* @brief 用户将环境温度和相对湿度写入ENS160, 用于气体测量数据的校准补偿。
* @param ambientTemp 用于补偿的当前环境温度, float类型, 单位: C
* @param relativeHumidity 用于补偿的当前环境湿度, float类型, 单位: %rH
* @return None
*/
void setTempAndHum(float ambientTemp, float relativeHumidity);
/**
* @fn getENS160Status
* @brief 这个API获取传感器的运行状态信息
* @return 运行状态:
* @n eNormalOperation: Normal operation;
* @n eWarmUpPhase: Warm-Up phase;
* @n eInitialStartUpPhase: Initial Start-Up phase;
* @n eInvalidOutput: Invalid output
*/
uint8_t getENS160Status(void);
/**
* @fn getAQI
* @brief 获取根据UBA计算出的空气质量指数
* @return 返回值范围为: 1-5(对应Excellent, Good, Moderate, Poor, Unhealthy这五个等级)
*/
uint8_t getAQI(void);
/**
* @fn getTVOC
* @brief 获取总挥发性有机化合物(TVOC)的浓度
* @return 返回值范围为: 0–65000, 单位: ppb
*/
uint16_t getTVOC(void);
/**
* @fn getECO2
* @brief 获取根据检测到的VOCs和氢报告计算出的二氧化碳当量浓度(eCO2 – Equivalent CO2)
* @return 返回值范围为: 400–65000, 单位: ppm
* @note 分为五个等级: Excellent(400 - 600), Good(600 - 800), Moderate(800 - 1000),
* @n Poor(1000 - 1500), Unhealthy(> 1500)
*/
uint16_t getECO2(void);
树莓派使用教程
⚠**特别注意:**第一次使用请让传感器先运行1小时后以确保数据准确,之后每次使用先运行(预热)三分钟。同时还需环境温湿度对测量数据进行补偿。
准备
-
硬件
- 树莓派4代B型(或类似)主控板 x 1
- ENS160空气质量传感器 x 1
- 若干杜邦线 x 1
-
软件
接线图
- 将模块与树莓派按照连线图相连,示例默认为I2C连接。
I2C接线图 SPI接线图
安装驱动
-
启动树莓派的I2C接口。如已开启,可跳过该步骤。
打开终端(Terminal),键入如下指令,并回车:
pi@raspberrypi:~ $ sudo raspi-config
然后用上下键选择“Interfacing Options ”, 按回车进入,选择 “ P5 I2C ”, 按回车确认“ YES ”即可。重启树莓派主控板。 -
安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。
在终端中,依次键入如下指令,并回车:
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git
-
下载ENS160驱动库。在终端中,依次键入如下指令,并回车:
pi@raspberrypi:~ $ cd Desktop/
pi@raspberrypi:~/Desktop $ git clone https://github.com/DFRobot/DFRobot_ENS160
样例代码1 - 轮询获取数据
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_ENS160/python/raspberrypi/examples/get_measure_data
pi@raspberrypi:~/Desktop/DFRobot_ENS160/python/raspberrypi/examples/get_measure_data $python get_measure_data.py
- 结果
样例代码2 - 中断方式数据
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_ENS160/python/raspberrypi/examples/interrupt_data_drdy
pi@raspberrypi:~/Desktop/DFRobot_ENS160/python/raspberrypi/examples/interrupt_data_drdy $python interrupt_data_drdy.py
- 结果
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。