简介
做简易的天气站,这一款传感器就够了!这是一款精准的环境传感器,采用ENS160+BME280芯片组合,BME280可对ENS160进行温湿度补偿,I2C接口,可以快速的测出温度、湿度、气压、海拔、TVOC和eCO2。
ENS160 空气质量传感器,搭载了ScioSense公司新推出ENS160空气质量传感器。该传感器专为室内空气质量检测而设计,能直接输出多种IAQ(TVOC、eCO2、AQI)数据。创新的TrueVOC技术结合金属氧化物(MOX)技术使得该传感器有优越准确性、快速响应、抗干扰等特性。
ENS160空气质量传感器内置算法,直接输出TVOC、eCO2、AQI数据,环境数据更丰富、容易理解。该传感器的预热时间小于3分钟,可以更快速的获得准确数据,内置基线自动校准算法,确保了传感器的长期稳定性。
BME280是一款集成温度、湿度、气压,三位一体的环境传感器。具有高精度,多功能,小尺寸等特点。温度误差为0.5℃,湿度误差为2%RH,气压测量在整个温区非常稳定的,偏置温度系数±1.5 pa/k,当温度变化时,1摄氏度的温度变化导致的误差仅在12.6厘米。
空气质量参考指标
AQI等级参考
eCO2/CO2浓度参考
TVOC浓度参考
应用场景
- 环境检测
- 空气净化器
- 家庭控制器
- 新风系统
- 天气预知
技术规格
- 供电电压:3.3V
- 工作电流:<20mA
- 产品尺寸:22*28mm
ENS160参数:
- 预热时间:<3分钟
- 接口方式:I2C
- I2C地址:0x52、0x53(默认)
- 工作温度范围:-40℃~85℃
- 工作湿度范围:5 %RH~95 %RH
- eCO2测量范围:400 ppm~65000 ppm
- TVOC测量范围:0 ppb~65000 ppb
BME280参数:
- I2C地址:0x76(默认)/0X77
- 工作温度:-40℃~85℃
- 温度测量范围:-40℃~+85℃,分辨率0.1℃,误差±0.5℃
- 湿度检测范围:0~100%RH,分辨率0.1%RH,误差±2%RH
- 压力检测范围:300~1100hPa
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | VCC | 电源正极 |
2 | GND | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | INT | ENS160中断引脚:低电平有效 |
使用教程
准备
- 硬件
- 1 x FireBeetle ESP32-E控制板
- 1 x 多功能环境传感器-ENS160+BME280
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
- ENS160库文件和示例程序
- BME280库文件和示例程序
关于如何安装库文件,点击链接
接线图
样例代码1 - 获取数据
上传到FireBeetle后打开串口监视器可以的看到温湿度、气压、CO2和TVOC浓度。
长时间运行ENS160会使BME280的温度数据上升2℃左右,建议间歇性运行ENS160,降低温度偏差
ENS160运行状态
状态 | 解释 |
---|---|
0 | 正常运行 |
1 | 预热,上电后前3分钟(需传感器不再出现初次启动状态) |
2 | 初次启动,上电后前1小时(传感器连续工作24小时后将不再出现该状态,如果中途出现断电,重新上电后传感器仍会进入初次启动状态) |
#include <DFRobot_ENS160.h>
#include "DFRobot_BME280.h"
#define SEA_LEVEL_PRESSURE 1015.0f
DFRobot_ENS160_I2C ENS160(&Wire, /*i2cAddr*/ 0x53);
typedef DFRobot_BME280_IIC BME; // ******** use abbreviations instead of full names ********
BME bme(&Wire, 0x76); // select TwoWire peripheral and set sensor address
// show last sensor operate status
void printLastOperateStatus(BME::eStatus_t eStatus)
{
switch(eStatus) {
case BME::eStatusOK: Serial.println("everything ok"); break;
case BME::eStatusErr: Serial.println("unknow error"); break;
case BME::eStatusErrDeviceNotDetected: Serial.println("device not detected"); break;
case BME::eStatusErrParameter: Serial.println("parameter error"); break;
default: Serial.println("unknow status"); break;
}
}
void setup(void)
{
Serial.begin(115200);
bme.reset();
Serial.println("bme read data test");
while(bme.begin() != BME::eStatusOK) {
Serial.println("bme begin faild");
printLastOperateStatus(bme.lastOperateStatus);
delay(2000);
}
Serial.println("bme begin success");
delay(100);
// 初始化传感器
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=*/bme.getTemperature(), /*humidity=*/bme.getHumidity());
}
void loop()
{
float temp = bme.getTemperature();
uint32_t press = bme.getPressure();
float alti = bme.calAltitude(SEA_LEVEL_PRESSURE, press);
float humi = bme.getHumidity();
Serial.println();
Serial.println("======== start print ========");
Serial.print("temperature (unit Celsius): "); Serial.println(temp);
Serial.print("pressure (unit pa): "); Serial.println(press);
Serial.print("altitude (unit meter): "); Serial.println(alti);
Serial.print("humidity (unit percent): "); Serial.println(humi);
Serial.println("======== end print ========");
/**
* 获取传感器运行状
* 返回值: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("Sensor operating status : ");
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);
}
结果
主要API接口函数列表
/**
* @功能 判断是否可以读取数据
* @返回 可以读取时为true,否则为false
*/
bool checkDataReady();
/**
* @功能 设置环境参数
* @参数 温度输入温度值,单位:摄氏度,范围(-40-85℃)
* @参数 湿度输入湿度值,单位:%RH,范围(0-100%RH)
*/
void setInTemHum(float temperature, float humidity);
/**
* @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);
常见问题
Q:为什么我初始化传感器失败打印:device not detected
A:请检查代码中的I2C地址是否与传感器地址相同
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。