Руководство по датчику BME680 с Arduino (газ, температура, влажность, давление)
BME680 — это цифровой датчик окружающей среды, который измеряет газ, давление, влажность и температуру. В этом руководстве вы узнаете, как использовать модуль датчика BME680 с платой Arduino. Датчик взаимодействует с микроконтроллером по протоколам связи I2C или SPI.
Вы узнаете, как подключить датчик к плате Arduino, установить необходимые библиотеки и использовать простой скетч для отображения показаний датчика в мониторе последовательного порта.
Знакомство с модулем датчика окружающей среды BME680
BME680 — это датчик окружающей среды, который объединяет датчики газа, давления, влажности и температуры. Датчик газа может обнаруживать широкий спектр газов, таких как летучие органические соединения (VOC). По этой причине BME680 может использоваться для контроля качества воздуха в помещениях.
Измерения BME680
BME680 — это цифровой датчик 4-в-1, который измеряет:
Температуру
Влажность
Барометрическое давление
Газ: летучие органические соединения (VOC), такие как этанол и угарный газ
Датчик газа
BME680 содержит MOX-датчик (на основе оксида металла), который обнаруживает VOC в воздухе. Этот датчик дает вам качественное представление о сумме VOC/загрязнителей в окружающем воздухе — он не является специфичным для конкретной молекулы газа.
MOX-датчики состоят из поверхности оксида металла, чувствительного чипа для измерения изменений проводимости и нагревателя. Он обнаруживает VOC путем адсорбции молекул кислорода на своем чувствительном слое. BME680 реагирует на большинство VOC, загрязняющих воздух в помещениях (за исключением CO2).
Когда датчик вступает в контакт с восстановительными газами, молекулы кислорода реагируют и увеличивают проводимость по поверхности. В качестве необработанного сигнала BME680 выдает значения сопротивления. Эти значения изменяются в зависимости от концентрации VOC:
Более высокая концентрация 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 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 Uno — читайте Лучшие стартовые наборы Arduino
Вы можете использовать указанные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения — Arduino с BME680
BME680 может взаимодействовать по протоколам связи I2C или SPI.
Arduino с BME680 по I2C
Следуйте следующей схеме подключения, чтобы подключить BME680 к Arduino по выводам I2C.
Arduino с BME680 по SPI
В качестве альтернативы вы можете использовать протокол связи SPI. В этом случае следуйте следующей схеме подключения, чтобы подключить BME680 к Arduino по выводам SPI.
Установка библиотеки BME680
Для получения показаний с модуля датчика BME680 мы будем использовать библиотеку Adafruit_BME680. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Введите «adafruit bme680» в поле поиска и установите библиотеку.
Установка библиотеки Adafruit_Sensor
Для использования библиотеки BME680 вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Перейдите в Sketch > Include Library > Manage Libraries и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите 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 — это цифровой датчик 4-в-1, который объединяет датчики газа, давления, температуры и влажности. BME680 содержит MOX-датчик, который определяет наличие большинства газов VOC. Этот датчик дает вам качественное представление о сумме VOC/загрязнителей в окружающем воздухе. По этой причине BME680 может использоваться для мониторинга качества воздуха в помещениях.
Мы надеемся, что это руководство по началу работы оказалось полезным. У нас есть руководства для других популярных датчиков:
Узнайте больше об Arduino с нашими ресурсами:
Спасибо за чтение.