BME680 是一款环境数字传感器,用于测量气体、压力、湿度和温度。在本文章中,您将学习如何将 BME680 传感器模块与 Arduino 板一起使用。传感器使用 I2C 或 SPI 通信协议与微控制器通信。
您将学习如何将传感器连接到Arduino板,安装所需的库,并使用简单的草图在串行监视器中显示传感器读数。
目录
介绍 BME680 环境传感器模块
BME680 是一款结合了气体、压力、湿度和温度传感器的环境传感器。气体传感器可以检测各种气体,如挥发性有机化合物(VOC)。因此,BME680 可用于室内空气质量控制。
BME680 测量
BME680 是一款 4 合 1 数字传感器,可测量:
- 温度
- 湿度
- 气压
- 气体:挥发性有机化合物(VOC),如乙醇和一氧化碳
气体传感器
BME680 包含一个 MOX(金属氧化物)传感器,可检测空气中的 VOC。该传感器可让您定性地了解周围空气中挥发性有机化合物/污染物的总和——它不特定于特定的气体分子。
MOX传感器由金属氧化物表面、测量电导率变化的传感芯片和加热器组成。它通过吸附其敏感层上的氧分子来检测 VOC。BME680 对大多数污染室内空气的 VOC 有反应(CO2 除外)。
当传感器与还原性气体接触时,氧分子会发生反应并增加整个表面的电导率。作为原始信号,BME680 输出电阻值。这些值会因 VOC 浓度的变化而变化:
- 更高浓度的挥发性有机化合物 » 更低的电阻
- 更低的挥发性有机化合物浓度 » 更高的抵抗力
传感器表面发生的反应(因此,电阻)受温度和湿度等 VOC 浓度以外的参数的影响。
气体传感器相关信息
气体传感器可让您定性地了解周围空气中的 VOC 气体。因此,您可以获取趋势,比较结果,看看空气质量是上升还是下降。为了获得精确的测量结果,您需要根据已知的来源校准传感器并建立校准曲线。
当您第一次获得传感器时,建议在开始收集“真实”数据后运行 48 小时。之后,还建议在获得气体读数之前运行传感器 30 分钟。
BME680 精度
以下是 BME680 温度、湿度和压力传感器的精度:
传感器 | 准确性 |
温度 | +/- 1.0 ºC |
湿度 | +/- 3 % |
压力 | +/- 1 hpa |
BME680 工作范围
下表显示了 BME680 的温度、湿度和压力传感器的工作范围。
传感器 | 工作范围 |
温度 | -40 至 85 ºC |
湿度 | 0 至 100 % |
压力 | 300 至 1100 hPa |
BME680 引脚排列
以下是 BME680 引脚排列:
VCC | Powers the sensor |
GND | Common GND |
SCL | SCL pin for I2C communication SCK pin for SPI communication |
SDA | SDA pin for I2C communication SDI (MOSI) pin for SPI communication |
SDO | SDO (MISO) pin for SPI communication |
CS | Chip select pin for SPI communication |
BME680 接口
BME680 支持 I2C 和 SPI 接口。
BME680 I2C
要使用 I2C 通信协议,请使用以下引脚:
BME680型 | Arduino |
SCL | A5 |
SDA | A4 |
BME680 SPI接口
要使用 SPI 通信协议,请使用以下引脚:
BME680 | Arduino |
SCL (SCK SPI Clock) | D13 |
SDA (SDI MOSI) | D11 |
SDO (MISO) | D12 |
CS (Chip Select) | D10 |
所需零件
若要完成本教程,需要以下部分:
- BME680 传感器模块
- Arduino Uno – 阅读最佳 Arduino 入门套件
- 面包板
- 跳线
原理图 – Arduino with BME680
BME680 可以使用 I2C 或 SPI 通信协议进行通信。
Arduino与BME680,使用I2C
按照下图,使用 I2C 引脚将 BME680 连接到 Arduino。
Arduino与BME680使用SPI
或者,您可能希望改用 SPI 通信协议。在这种情况下,请按照下图使用 SPI 引脚将 BME680 连接到 Arduino。
安装 BME680 库
为了从 BME680 传感器模块获取读数,我们将使用 Adafruit_BME680 库。按照以下步骤在Arduino IDE中安装库:
打开Arduino IDE,然后转到Sketch>包含库>管理库。库管理器应打开。
在搜索框中搜索“adafruit bme680”并安装库。
安装 Adafruit_Sensor 库
要使用 BME680 库,您还需要安装 Adafruit_Sensor 库。按照以下步骤在Arduino IDE中安装库:
转到“草图”>“包括库”>“管理库”,然后在搜索框中键入“Adafruit Unified Sensor”。一直向下滚动以找到库并安装它。
安装库后,重新启动Arduino IDE。
代码 Arduino – 读取 BME680 气体、压力、湿度和温度
为了读取气体、压力、温度和湿度,我们将使用库中的草图示例。
安装 BME680 库和 Adafruit_Sensor 库后,打开 Arduino IDE,然后转到 Adafruit BME680 库>文件>示例> bme680async。
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
/*#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // I2C
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println(F("BME680 async test"));
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
// Tell BME680 to begin measurement.
unsigned long endTime = bme.beginReading();
if (endTime == 0) {
Serial.println(F("Failed to begin reading :("));
return;
}
Serial.print(F("Reading started at "));
Serial.print(millis());
Serial.print(F(" and will finish at "));
Serial.println(endTime);
Serial.println(F("You can do other work during BME680 measurement."));
delay(50); // This represents parallel work.
// There's no need to delay() until millis() >= endTime: bme.endReading()
// takes care of that. It's okay for parallel work to take longer than
// BME680's measurement time.
// Obtain measurement results from BME680. Note that this operation isn't
// instantaneous even if milli() >= endTime due to I2C/SPI latency.
if (!bme.endReading()) {
Serial.println(F("Failed to complete reading :("));
return;
}
Serial.print(F("Reading completed at "));
Serial.println(millis());
Serial.print(F("Temperature = "));
Serial.print(bme.temperature);
Serial.println(F(" *C"));
Serial.print(F("Pressure = "));
Serial.print(bme.pressure / 100.0);
Serial.println(F(" hPa"));
Serial.print(F("Humidity = "));
Serial.print(bme.humidity);
Serial.println(F(" %"));
Serial.print(F("Gas = "));
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(F(" KOhms"));
Serial.print(F("Approx. Altitude = "));
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(F(" m"));
Serial.println();
delay(2000);
}
代码的工作原理
继续阅读本部分以了解代码的工作原理,或跳到演示部分。
图书馆
该代码首先包括所需的库:使用 I2C 的导线库、SPI 库(如果要使用 SPI 而不是 I2C)、与 BME680 传感器接口的 Adafruit_Sensor 和 Adafruit_BME680 库。
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
SPI通信
我们更喜欢使用与传感器的 I2C 通信协议。但是,如果要使用 SPI,则已准备好代码。您只需取消注释以下定义 SPI 引脚的代码行即可。
/*#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/
海平面压力
将创建一个名为 SEALEVELPRESSURE_HPA 的变量。
#define SEALEVELPRESSURE_HPA (1013.25)
该变量以百帕斯卡为单位保存海平面压力(相当于毫巴)。该变量用于通过将给定压力与海平面压力进行比较来估计给定压力的高度。此示例使用默认值,但为了获得准确的结果,请将该值替换为您所在位置的当前海平面压力。
I2C
此示例默认使用 I2C 通信协议。以下行在 Arduino I2C 引脚上创建一个名为 bme 的Adafruit_BME680对象:D5 (SCL)、D4 (SDA)。
Adafruit_BME680 bme; // I2C
要使用 SPI,您需要注释上一行并取消注释下一行。
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
setup()
在 setup() 中启动串行通信。
Serial.begin(115200);
初始化 BME680 传感器
初始化 BME680 传感器:
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
为传感器设置以下参数(过采样、过滤器和燃气加热器)。
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
为了提高原始传感器数据的分辨率,它支持过采样。我们将使用默认的过采样参数,但您可以更改它们。
- setTemperatureOversampling():设置温度过采样。
- setHumidityOversampling():设置湿度过采样。
- setPressureOversampling():设置压力过采样。
这些方法可以接受以下参数之一:
- BME680_OS_NONE:关闭阅读;
- BME680_OS_1X
- BME680_OS_2X
- BME680_OS_4X
- BME680_OS_8X
- BME680_OS_16X
BME680 传感器集成了内部 IIR 滤波器,可减少由外部干扰引起的传感器输出值的短期变化。setIIRFilterSize() 方法设置 IIR 过滤器。它接受过滤器大小作为参数:
- BME680_FILTER_SIZE_0(无过滤)
- BME680_FILTER_SIZE_1
- BME680_FILTER_SIZE_3
- BME680_FILTER_SIZE_7
- BME680_FILTER_SIZE_15
- BME680_FILTER_SIZE_31
- BME680_FILTER_SIZE_63
- BME680_FILTER_SIZE_127
气体传感器集成了一个加热器。使用接受作为参数的 setGasHeater() 方法设置加热器配置文件:
- 加热器温度(摄氏度)
- 加热器应开启的时间(以毫秒为单位)
我们将使用默认设置:320 ºC 持续 150 毫秒。
loop()
在 loop() 中,我们将从 BME680 传感器获取测量值。
首先,告诉传感器使用 bme.beginReading() 启动异步读取。这将返回读数准备就绪的时间。
// Tell BME680 to begin measurement.
unsigned long endTime = bme.beginReading();
if (endTime == 0) {
Serial.println(F("Failed to begin reading :("));
return;
}
Serial.print(F("Reading started at "));
Serial.print(millis());
Serial.print(F(" and will finish at "));
Serial.println(endTime);
然后,调用 endReading() 方法以结束异步读取。如果异步读取仍在进行中,请阻止直到它结束。
if (!bme.endReading()) {
Serial.println(F("Failed to complete reading :("));
return;
}
在此之后,我们可以得到如下读数:
- bme.temperature:返回温度读数
- bme.pressure:返回压力读数
- bme.humidity:返回湿度读数
- bme.gas_resistance:回气阻力
Serial.print(F("Temperature = "));
Serial.print(bme.temperature);
Serial.println(F(" *C"));
Serial.print(F("Pressure = "));
Serial.print(bme.pressure / 100.0);
Serial.println(F(" hPa"));
Serial.print(F("Humidity = "));
Serial.print(bme.humidity);
Serial.println(F(" %"));
Serial.print(F("Gas = "));
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(F(" KOhms"));
Serial.print(F("Approx. Altitude = "));
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(F(" m"));
有关库方法的详细信息,请查看 Adafruit_BME 6 80 类参考。
示范
将代码上传到Arduino开发板。转到工具>板,然后选择您正在使用的Arduino板。转到“工具”>端口,然后选择主板连接到的端口。然后,单击上传按钮。
以 115200 的波特率打开串行监视器,按下板载 RST 按钮。将显示传感器测量值。
结束语
BME680 传感器模块是一款 4 合 1 数字传感器,结合了气体、压力、温度和湿度传感器。BME680 包含一个 MOX 传感器,可感应大多数 VOC 气体的存在。该传感器可让您定性地了解周围空气中挥发性有机化合物/污染物的总和。因此,BME680 可用于监测室内空气质量。