风筝
发表于: 2023-2-24 09:19:36 | 显示全部楼层

您是否想过要自制一个空气质量追踪器来判断您的卧室、车间或工作场所是否通风良好? 在Arduino上安装BME680环境传感器模块,可以监控室内环境的方方面面。


最先进的BME680模块让您可以测量温度、大气压力、湿度和室内空气质量,而且兼容Arduino开发板!


BME680环境传感器模块

该模块集成了博世制造的下一代环境传感器 - BME680

BME680-Module-Hardware-Overview-Chip.jpg


这种小型传感器可以测量温度、湿度、气压和VOC气体(挥发性有机化合物)。它包含一个小型MOx(金属氧化物)传感器。 加热的金属氧化物会根据空气中的挥发性有机化合物改变电阻,因此可用于检测气体和酒精,如乙醇、酒精和一氧化碳,并进行空气质量测量。 因此,BME680可以用作完全独立的环境传感器。


与大多数气体传感器一样,该传感器对多种气体和酒精敏感,但分不清哪个是哪个。它会给你一个电阻值,总的VOC含量。 因此,它可以测量已知气体密度的变化,而不是检测正在发生变化的气体。


与BME280一样,这款精密传感器可以以±3%的精度测量湿度,以±1 hPa的绝对精度测量气压,以及以±1.0°C的精度测量温度。 大气压力测量非常精确; 您甚至可以将它用作精度为±1米的高度计。


电源

该模块集成一颗3.3V精密稳压器XC6206和电压电平转换器,因此您可以放心地与您最喜欢的3.3V或5V微控制器一起使用。

BME680-Module-Voltage-Regulator-Translator.jpg

BME680在测量期间消耗不到1mA,在睡眠模式下仅为0.15µA。 这种低功耗允许在手机、可穿戴设备或智能手表等电池驱动设备中实施。


I2C接口

传感器使用I2C接口与Arduino进行通信。 它支持两个独立的I2C地址:0x77H和0x76H。这允许两个BME680在同一总线上使用或避免与总线上的另一个设备发生地址冲突。

BME680-Module-I2C-Address-Selection-Pin.jpg


SDO引脚决定模块的I2C地址。 该引脚内置上拉电阻。 因此,当您不连接SDO引脚时,默认I2C地址为0x77H,当您将其连接到GND时,该线被拉低,I2C地址变为0x76H。


SPI接口

传感器还可以通过SPI接口进行通信。


BME680 MEMS气体传感器如何工作?

与MQ2或MQ3不同,BME680气体传感器采用微机电系统 (MEMS) 技术制造。 基于MEMS的气体检测提供了显着的尺寸减小、功耗降低以及增加功能和选择性的能力。


典型的MEMS气体传感器由与目标气体发生反应的金属氧化物半导体层(传感材料)、至少两个用于监测电阻/电流变化的电极以及用于提高工作温度的微型热板组成。

Metal-Oxide-Gas-Sensor-Construction.png


当金属氧化物半导体层在高温下加热时,氧被吸附在表面上。在干净的空气中,来自金属氧化物导带的电子被吸引到氧分子上。这在金属氧化物颗粒的表面下方形成了一个电子耗尽层,并形成了势垒。结果,金属氧化物层变得高电阻并阻止电流流动。


然而,在气体存在的情况下,吸附氧的表面密度会随着气体的反应而降低; 这降低了势垒。然后电子被释放到金属氧化物层中,使电流自由流过传感器。

Metal-Oxide-Gas-Sensor-Working-Animation.gif


BME680模块的引脚排列

现在让我们看一下引脚排列。

BME680-Environmental-Sensor-Pinout.png

电源引脚:

VCC 是电源引脚。 您可以将它连接到Arduino的5V输出。

GND 是电源和逻辑的公共地。


SPI 逻辑引脚:

SCL 是SPI时钟引脚,它是芯片的输入。

SDA 是串行数据输入 (SDI/MOSI) 引脚,用于从微控制器发送到BME680的数据。

SDO 是串行数据输出 (SDO/MISO) 引脚,用于将数据从BME680发送到您的微控制器。

CS 是芯片选择引脚,将其拉低以启用SPI通信。


I2C 逻辑引脚:

SCL 也是I2C时钟引脚,连接到你的单片机I2C时钟线。

SDA 也是I2C数据引脚,连接到你的单片机I2C数据线。


准备使用BME680模块

首次使用传感器之前,建议您先运行48小时进行预热,然后每次使用传感器时以所需模式运行30分钟。 这样做的原因是传感器的灵敏度值在初始使用期间会发生变化,并且随着MOx随着时间的推移加热到其基线读数,电阻会逐渐增加。


使用Arduino连接BME680模块

现在我们已经了解了关于模块的一切,可以开始将它连接到我们的Arduino上了!


I2C接线方式

如果您想通过I2C接口连接,请使用此种接线方式。首先将VCC引脚连接到电源,3V-5V就可以了。使用与您的微控制器逻辑相同的电压。对于大多数Arduino,使用5V。对于3.3V逻辑设备,使用3.3V。 将GND连接到公共地。


将SCL引脚连接到I2C时钟引脚,将SDA引脚连接到Arduino上的I2C数据引脚。在Arduino UNO R3开发板上,SDA和 SCL位于靠近 AREF 引脚的排针上。 它们也被称为 A5 (SCL) 和 A4 (SDA)。

Wiring-Connecting-BME680-Sensor-Module-with-Arduino-through-I2C-Interface.png


SPI接线方式

由于它是一个支持SPI的传感器,您可以使用硬件或软件SPI。但是,建议您使用硬件SPI引脚,因为它们比使用另一组引脚位转换接口代码要快得多。


同样,每个Arduino开发板都有不同的SPI引脚,应相应地进行连接。 对于UNO/Nano V3.0等开发板,这些引脚是数字13 (SCK)、12 (MISO)、11 (MOSI) 和10 (SS)。

Wiring-Connecting-BME680-Sensor-Module-with-Arduino-through-SPI-Interface.png


一旦您的模块连接到Arduino,就可以编写一些代码了!


安装所需的库

要开始读取传感器数据,您需要安装Adafruit_BME680库。可以从Arduino库管理器获得。


要安装库,请导航至 Sketch > Include Library > Manage Libraries…等待库管理器下载库索引并更新已安装库的列表。

Manage-Libraries.png


输入adafruit bme680筛选搜索结果。 单击该条目,然后选择安装。

Installing-BME680-Library-In-Arduino-IDE.png


BME680传感器库使用Adafruit传感器支持后端。 因此,在库管理器中搜索 Adafruit Unified Sensor并安装。

Adafruit-Unified-Sensor-Library-Installation.png


BME680示例草图

Adafruit_BME680库有许多示例草图。 您可以使用这些示例草图作为开发您自己的代码的基础。


要访问示例草图,请导航至“文件”>“示例”>“Adafruit BME680 库”。您将看到一系列示例草图。

Adafruit-BME680-Library-Example-Sketches.png


Arduino代码 - 读取气体、大气压力、湿度、温度和高度

将示例草图中的bme680test草图加载到您的Arduino IDE中。这是一个基本的 Arduino 草图。将其上传到您的Arduino。

  1. #include <Wire.h>
  2. #include <SPI.h>
  3. #include <Adafruit_Sensor.h>
  4. #include "Adafruit_BME680.h"

  5. // Uncomment if you want to use SPI
  6. //#define BME_SCK 13
  7. //#define BME_MISO 12
  8. //#define BME_MOSI 11
  9. //#define BME_CS 10

  10. #define SEALEVELPRESSURE_HPA (1013.25)

  11. Adafruit_BME680 bme;
  12. //Adafruit_BME680 bme(BME_CS); // Uncomment if you want to use SPI
  13. //Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO,  BME_SCK);

  14. void setup() {
  15.   Serial.begin(9600);
  16.   while (!Serial);

  17.   if (!bme.begin()) {
  18.     Serial.println("Could not find a valid BME680 sensor, check wiring!");
  19.     while (1);
  20.   }

  21.   // Set up oversampling and filter initialization
  22.   bme.setTemperatureOversampling(BME680_OS_8X);
  23.   bme.setHumidityOversampling(BME680_OS_2X);
  24.   bme.setPressureOversampling(BME680_OS_4X);
  25.   bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  26.   bme.setGasHeater(320, 150); // 320*C for 150 ms
  27. }

  28. void loop() {
  29.   if (! bme.performReading()) {
  30.     Serial.println("Failed to perform reading :(");
  31.     return;
  32.   }
  33.   Serial.print("Temperature = ");
  34.   Serial.print(bme.temperature);
  35.   Serial.println(" *C");

  36.   Serial.print("Pressure = ");
  37.   Serial.print(bme.pressure / 100.0);
  38.   Serial.println(" hPa");

  39.   Serial.print("Humidity = ");
  40.   Serial.print(bme.humidity);
  41.   Serial.println(" %");

  42.   Serial.print("Gas = ");
  43.   Serial.print(bme.gas_resistance / 1000.0);
  44.   Serial.println(" KOhms");

  45.   Serial.print("Approx. Altitude = ");
  46.   Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  47.   Serial.println(" m");

  48.   Serial.println();
  49.   delay(2000);
  50. }
复制代码

你可以在串口监视器看到显示温度、压力、湿度、气体和高度值。 尝试四处移动传感器并注意数据如何变化。

BME680-Sensor-Arduino-Code-Output.png


代码说明

首先包括四个必要的库,即Wire.h(用于 I2C)、SPI.h(用于 SPI)、Adafruit_Sensor.h和Adafruit_BME680.h。

  1. #include <Wire.h>
  2. #include <SPI.h>
  3. #include <Adafruit_Sensor.h>
  4. #include "Adafruit_BME680.h"
复制代码

本示例使用 I2C 通信协议与传感器进行通信。 但是,如果您想使用SPI,已准备好代码。 您只需取消注释以下定义SPI引脚的代码行。

  1. //#define BME_SCK 13
  2. //#define BME_MISO 12
  3. //#define BME_MOSI 11
  4. //#define BME_CS 10
复制代码

接下来,定义一个名为 SEALEVELPRESSURE_HPA 的变量。 该变量以毫巴为单位保存海平面气压,并用于通过将给定气压与海平面气压进行比较来估算给定气压的高度。 此草图使用默认值,但为了获得准确的结果,请将该值替换为您所在位置的当前海平面气压。

  1. #define SEALEVELPRESSURE_HPA (1013.25)
复制代码

此草图默认使用I2C通信协议。以下代码在Arduino I2C引脚上创建了一个名为bme的Adafruit_BME680对象。

  1. Adafruit_BME680 bme;
复制代码

setup()函数中,我们初始化串口通信并调用 begin() 函数。begin() 函数初始化I2C接口并检查芯片ID是否正确。 然后它使用软复位重置芯片并等待传感器在唤醒后进行校准。

  1. Serial.begin(9600);
  2. while (!Serial);

  3. if (!bme.begin()) {
  4.         Serial.println("Could not find a valid BME680 sensor, check wiring!");
  5.         while (1);
  6. }
复制代码

接下来,我们为传感器设置一些参数。

  1. bme.setTemperatureOversampling(BME680_OS_8X);
  2. bme.setHumidityOversampling(BME680_OS_2X);
  3. bme.setPressureOversampling(BME680_OS_4X);
  4. bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  5. bme.setGasHeater(320, 150); // 320*C for 150 ms
复制代码

在loop()函数中,我们调用bme.performReading()函数以阻塞模式执行读取。完成后,我们可以使用点 (.) 运算符访问bme的实例变量。

bme.temperature 返回温度读数。

bme.pressure 返回大气压力读数。

bme.humidity 返回相对湿度读数。

bme.gas_resistance 返回气体阻力。

bme.readAltitude(SEALEVELPRESSURE_HPA)  函数根据指定的大气压力(以 hPa 为单位)和海平面大气压力(以 hPa 为单位)计算高度。

  1. if (! bme.performReading()) {
  2.         Serial.println("Failed to perform reading :(");
  3.         return;
  4. }
  5. Serial.print("Temperature = ");
  6. Serial.print(bme.temperature);
  7. Serial.println(" *C");

  8. Serial.print("Pressure = ");
  9. Serial.print(bme.pressure / 100.0);
  10. Serial.println(" hPa");

  11. Serial.print("Humidity = ");
  12. Serial.print(bme.humidity);
  13. Serial.println(" %");

  14. Serial.print("Gas = ");
  15. Serial.print(bme.gas_resistance / 1000.0);
  16. Serial.println(" KOhms");

  17. Serial.print("Approx. Altitude = ");
  18. Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  19. Serial.println(" m");
复制代码

跳转到指定楼层
songxp03
发表于: 2023-4-18 18:41:48 | 显示全部楼层

楼主辛苦了,又学习了一种传感器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 21:22 , Processed in 0.136575 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表