Руководство по датчику BME680 с Arduino (газ, температура, влажность, давление)

BME680 — это цифровой датчик окружающей среды, который измеряет газ, давление, влажность и температуру. В этом руководстве вы узнаете, как использовать модуль датчика BME680 с платой Arduino. Датчик взаимодействует с микроконтроллером по протоколам связи I2C или SPI.

Плата Arduino с датчиком BME680 — газ, влажность, барометрическое давление, температура окружающей среды, качество воздуха Arduino IDE

Вы узнаете, как подключить датчик к плате Arduino, установить необходимые библиотеки и использовать простой скетч для отображения показаний датчика в мониторе последовательного порта.

Знакомство с модулем датчика окружающей среды BME680

BME680 — это датчик окружающей среды, который объединяет датчики газа, давления, влажности и температуры. Датчик газа может обнаруживать широкий спектр газов, таких как летучие органические соединения (VOC). По этой причине BME680 может использоваться для контроля качества воздуха в помещениях.

BME680 датчик газа, влажности, барометрического давления, температуры окружающей среды, качества воздуха — вид спереди

Измерения BME680

BME680 — это цифровой датчик 4-в-1, который измеряет:

  • Температуру

  • Влажность

  • Барометрическое давление

  • Газ: летучие органические соединения (VOC), такие как этанол и угарный газ

Датчик газа

BME680 содержит MOX-датчик (на основе оксида металла), который обнаруживает VOC в воздухе. Этот датчик дает вам качественное представление о сумме VOC/загрязнителей в окружающем воздухе — он не является специфичным для конкретной молекулы газа.

MOX-датчики состоят из поверхности оксида металла, чувствительного чипа для измерения изменений проводимости и нагревателя. Он обнаруживает VOC путем адсорбции молекул кислорода на своем чувствительном слое. BME680 реагирует на большинство VOC, загрязняющих воздух в помещениях (за исключением CO2).

Когда датчик вступает в контакт с восстановительными газами, молекулы кислорода реагируют и увеличивают проводимость по поверхности. В качестве необработанного сигнала BME680 выдает значения сопротивления. Эти значения изменяются в зависимости от концентрации VOC:

BME680 датчик газа качества воздуха — сопротивление, принцип работы
  • Более высокая концентрация VOC >> Более низкое сопротивление

  • Более низкая концентрация 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

Питание датчика

GND

Общий GND

SCL

Вывод SCL для связи по I2C / Вывод SCK для связи по SPI

SDA

Вывод SDA для связи по I2C / Вывод SDI (MOSI) для связи по SPI

SDO

Вывод SDO (MISO) для связи по SPI

CS

Вывод выбора чипа для связи по SPI

Интерфейс BME680

BME680 поддерживает интерфейсы I2C и SPI.

BME680 датчик газа, влажности, барометрического давления, температуры окружающей среды, качества воздуха — вид сзади
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

Необходимые компоненты

Плата Arduino BME680 — датчик газа, схема подключения

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать указанные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения — Arduino с BME680

BME680 может взаимодействовать по протоколам связи I2C или SPI.

Arduino с BME680 по I2C

Следуйте следующей схеме подключения, чтобы подключить BME680 к Arduino по выводам I2C.

Arduino BME680 — схема подключения датчика окружающей среды по I2C

Arduino с BME680 по SPI

В качестве альтернативы вы можете использовать протокол связи SPI. В этом случае следуйте следующей схеме подключения, чтобы подключить BME680 к Arduino по выводам SPI.

Arduino BME680 — схема подключения по SPI

Установка библиотеки BME680

Для получения показаний с модуля датчика BME680 мы будем использовать библиотеку Adafruit_BME680. Выполните следующие шаги для установки библиотеки в Arduino IDE:

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

Введите «adafruit bme680» в поле поиска и установите библиотеку.

Установка библиотеки Adafruit BME680 в Arduino IDE через менеджер библиотек

Установка библиотеки Adafruit_Sensor

Для использования библиотеки BME680 вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:

Перейдите в Sketch > Include Library > Manage Libraries и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor Driver

После установки библиотек перезапустите Arduino IDE.

Код Arduino — считывание газа, давления, влажности и температуры с BME680

Для считывания газа, давления, температуры и влажности мы будем использовать пример скетча из библиотеки.

После установки библиотеки BME680 и библиотеки Adafruit_Sensor откройте Arduino IDE и перейдите в File > Examples > Adafruit BME680 Library > bme680async.

/***
  Read Our Complete Guide: https://RandomNerdTutorials.com/bme680-sensor-arduino-gas-temperature-humidity-pressure/

  Designed specifically to work with the Adafruit BME680 Breakout ----> http://www.adafruit.com/products/3660 These sensors use I2C or SPI to communicate, 2 or 4 pins are required to interface. Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution
 ***/

#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);
}

Посмотреть исходный код

Как работает код

Продолжайте читать этот раздел, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Библиотеки

Код начинается с подключения необходимых библиотек: библиотеки Wire для использования I2C, библиотеки SPI (если вы хотите использовать SPI вместо I2C), библиотек Adafruit_Sensor и Adafruit_BME680 для взаимодействия с датчиком 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. Следующая строка создает объект Adafruit_BME680 с именем bme на выводах I2C Arduino: 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

Для повышения разрешения необработанных данных датчика он поддерживает передискретизацию (oversampling). Мы будем использовать параметры передискретизации по умолчанию, но вы можете их изменить.

  • 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_BME680.

Демонстрация

Загрузите код на плату Arduino. Перейдите в Tools > Board и выберите используемую плату Arduino. Перейдите в Tools > Port и выберите порт, к которому подключена ваша плата. Затем нажмите кнопку загрузки.

Откройте монитор последовательного порта на скорости 115200 бод, нажмите встроенную кнопку RST. Показания датчика будут отображены.

BME680 Arduino IDE — пример отображения показаний газа, температуры, влажности и давления в мониторе последовательного порта

Заключение

Модуль датчика BME680 — это цифровой датчик 4-в-1, который объединяет датчики газа, давления, температуры и влажности. BME680 содержит MOX-датчик, который определяет наличие большинства газов VOC. Этот датчик дает вам качественное представление о сумме VOC/загрязнителей в окружающем воздухе. По этой причине BME680 может использоваться для мониторинга качества воздуха в помещениях.

Мы надеемся, что это руководство по началу работы оказалось полезным. У нас есть руководства для других популярных датчиков:

Узнайте больше об Arduino с нашими ресурсами:

Спасибо за чтение.