Главная » Arduino » Датчик BME680 — 4 в 1: газ, температура, влажность, давление. Подключение к Ардуино

Датчик BME680 — 4 в 1: газ, температура, влажность, давление. Подключение к Ардуино

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

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

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

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

BME680 — измерения

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

  1. Температуру
  2. Влажность
  3. Барометрическое давление
  4. Газ: летучие органические соединения (VOC), такие как этанол и окись углерода.

Датчик газа

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

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

Когда датчик вступает в контакт с газами, молекулы кислорода вступают в реакцию и увеличивают проводимость по поверхности.

Необработанный сигнал датчика BME680 представляет собой изменение сопротивления. Сопротивление изменяется из-за колебаний концентраций VOC:

На реакции (сопротивление), происходящие на поверхности датчика влияют помимо концентрации VOC и другие параметры, такие как температура и влажность.

Дополнительная информация о датчике газа

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров...
Подробнее

Датчик газа дает вам качественное представление о содержании VOC в окружающем воздухе. Таким образом, вы можете отслеживать тенденцию и определять — ухудшилось или улучшилось качество воздуха.

Чтобы получить точные данные, вам необходимо откалибровать датчик по известным источникам и построить калибровочную кривую.

Перед использованием нового датчика рекомендуется чтобы он проработал в течение 48 часов до начала сбора «реальных» данных. После этого также рекомендуется запустить датчик на 30 минут, прежде чем снимать показания.

BME680 — точность

Вот точность измерения температуры, влажности и давления датчика BME680:

  Датчик                    Точность

Температура:             +/- 1,0 ºC

Влажность:                 +/- 3%

Давление:                  +/- 1 гПа

BME680 — рабочий диапазон

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

Датчик                     Рабочий диапазон

Температура:             от -40 до 85 ºC

Влажность:                  от 0 до 100%

Давление:                 от 300 до 1100 гПа

BME680 Распиновка

Распиновка BME680:

  • VCC — Питание датчика
  • GND — Общий;
  • SCL — SCL для I2C, SCK для SPI;
  • SDA — SDA для  I2C, SDI (MOSI) для SPI;
  • SDO — SDO (MISO) для SPI;
  • CS — выбор чипа для связи SPI.

BME680 — интерфейс

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

BME680 — I2C

Чтобы использовать протокол связи I2C, используйте следующие контакты:

BME680         Ардуино

SCL                    A5

SDA                   A4

BME680 — SPI

Чтобы использовать протокол связи SPI, используйте следующие контакты:

BME680                       Ардуино

SCL (clock SCK SPI)       D13

SDA (SDI MOSI)              D11

SDO (MISO)                     D12

CS (выбор чипа)             D10

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

Для изучения этой темы вам понадобятся следующие части:

  • Модуль датчика BME680
  • Ардуино Uno
  • Макетная плата
  • Перемычки

Схема подключения датчика BME680 к Ардуино

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

Ардуино и BME680 с использованием I2C шины

Следуйте следующей схеме, чтобы подключить BME680 к Ардуино по I2C шине:

Ардуино и BME680 с использованием SPI шины

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

Библиотеки BME680

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

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

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

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

Чтобы использовать библиотеку BME680, вам также необходимо установить библиотеку Adafruit_Sensor.

Выполните следующие шаги, чтобы установить библиотеку Ардуино IDE:

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

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

Код Ардуино — чтение данных с датчика BME680

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

Для этого откройте 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(9600);
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);
}

Разбор кода для BME680

Библиотеки

Код начинается с подключения необходимых библиотек: для использования I2C, SPI, 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.

Следующая строка создает объект Adafruit_BME680 с именем bme на выводах Ардуино I2C: 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:

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

Устанавливаем параметры датчика BME680:

// 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

Эти методы могут принимать один из следующих параметров (разрешение):

  • 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 (no filtering)
  • 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"));

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

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

Заключение

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

Этот датчик дает вам качественное представление о сумме VOC / загрязняющих веществ в окружающем воздухе. По этой причине BME680 можно использовать для контроля качества воздуха в помещении.

Источник



Блок питания 0...30В/3A
Набор для сборки регулируемого блока питания...
Подробнее



7 комментариев

  1. как влияет разогрев датчика до 300 на показания температуры?)

    Ответить
    • Похоже что хреново, ждать придётся стабилизацию. Даташит лень читать.

      Ответить
  2. Максимальный ток для датчика 3.6V, а автор подключает его от 5в — это нормально?

    Ответить
    • Максимальный ток указывают в амперах, а не вольтах. Не нормально, но датчик работать будет. Как долго — другой вопрос, но работать будет.

      Ответить
  3. ошибку исправьте SDO SDO(MISO). Вот так вот правильно

    Ответить
  4. На плате установлен преобразователь 5В->3,3В, так что про «не нормально» вы не правы.

    Ответить

Добавить комментарий