BME680 — это цифровой датчик окружающей среды, который измеряет качество воздуха, давление, влажность и температуру. В этом руководстве вы узнаете, как использовать модуль датчика BME680 с платой Ардуино.
Датчик BME680 взаимодействует с микроконтроллером по протоколу связи I2C или SPI. В данной статье вы узнаете, как подключить датчик BME680 к плате Ардуино, установить необходимые библиотеки и использовать простой скетч для отображения показаний датчика в мониторе последовательного порта.
Представляем модуль датчика окружающей среды BME680
BME680 — это датчик окружающей среды, сочетающий в себе датчики газа, давления, влажности и температуры. Датчик газа может обнаруживать широкий спектр газов, таких как летучие органические соединения (VOC). По этой причине BME680 можно использовать для контроля качества воздуха в помещении.
BME680 — измерения
BME680 — это цифровой датчик 4 в 1, который измеряет:
- Температуру
- Влажность
- Барометрическое давление
- Газ: летучие органические соединения (VOC), такие как этанол и окись углерода.
Датчик газа
BME680 содержит датчик MOX (Metal-oxide), который обнаруживает VOC в воздухе. Этот датчик дает вам качественное представление о сумме загрязняющих веществ в окружающем воздухе. Но он не селективен к определенному газу.
Датчики MOX состоят из пленки оксида металла. Он обнаруживает VOC путем адсорбции молекул кислорода на его чувствительном слое. BME680 реагирует на большинство VOC, загрязняющих воздух в помещении (кроме СО2).
Когда датчик вступает в контакт с газами, молекулы кислорода вступают в реакцию и увеличивают проводимость по поверхности.
Необработанный сигнал датчика BME680 представляет собой изменение сопротивления. Сопротивление изменяется из-за колебаний концентраций VOC:
На реакции (сопротивление), происходящие на поверхности датчика влияют помимо концентрации VOC и другие параметры, такие как температура и влажность.
Дополнительная информация о датчике газа

Датчик газа дает вам качественное представление о содержании 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 можно использовать для контроля качества воздуха в помещении.

как влияет разогрев датчика до 300 на показания температуры?)
Похоже что хреново, ждать придётся стабилизацию. Даташит лень читать.
Максимальный ток для датчика 3.6V, а автор подключает его от 5в — это нормально?
Максимальный ток указывают в амперах, а не вольтах. Не нормально, но датчик работать будет. Как долго — другой вопрос, но работать будет.
ошибку исправьте SDO SDO(MISO). Вот так вот правильно
Исправил, спасибо.
На плате установлен преобразователь 5В->3,3В, так что про «не нормально» вы не правы.