Raspberry Pi Pico: датчик окружающей среды BME680 (Arduino IDE)

Начните работу с модулем датчика окружающей среды BME680 и платой Raspberry Pi Pico, программируемой в Arduino IDE, для получения данных о температуре, влажности, давлении и газе (качество воздуха). Мы покажем вам, как подключить датчик, установить необходимые библиотеки и написать простой скетч для отображения показаний датчика.

Raspberry Pi Pico с датчиком BME680 в Arduino IDE

Впервые работаете с Raspberry Pi Pico? Начните с руководства Начало работы с Raspberry Pi Pico.

Raspberry Pi Pico с Arduino IDE

Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, и вы должны знать, как загружать код на плату. Ознакомьтесь со следующим руководством, если вы ещё этого не сделали:

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

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

Датчик BME680 — газ, влажность, атмосферное давление, температура окружающей среды, качество воздуха (вид спереди)

Измерения BME680

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

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

  • Влажность

  • Атмосферное давление

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

Датчик газа

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

MOX-датчики состоят из поверхности на основе оксида металла, чувствительного чипа для измерения изменений проводимости и нагревателя. Датчик обнаруживает VOC путём адсорбции молекул кислорода на своём чувствительном слое. BME680 реагирует на большинство летучих органических соединений, загрязняющих воздух в помещении (за исключением 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

Общая земля

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, поэтому подключение простое. Вы можете использовать любую комбинацию выводов I2C на Raspberry Pi Pico. Мы будем использовать GPIO 5 (SCL) и GPIO 4 (SDA). Вы можете использовать любую другую комбинацию выводов I2C, если укажете их в коде.

BME680

Raspberry Pi Pico

Vin

3.3V

GND

GND

SCL

GPIO 5

SDA

GPIO 4

Подробнее о GPIO Raspberry Pi Pico: Распиновка Raspberry Pi Pico и Pico W: описание GPIO.

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

Raspberry Pi Pico с датчиком окружающей среды BME680

Для этого проекта вам необходимо подключить модуль датчика BME680 к выводам I2C Raspberry Pi Pico. Вот список компонентов, которые вам понадобятся для этого руководства:

  • Модуль датчика BME680

  • Raspberry Pi Pico или Pico W

  • Макетная плата

  • Соединительные провода

Установка библиотеки BME680 для Raspberry Pi Pico — Arduino IDE

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

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

Введите «adafruit_bme680» в поле поиска и установите библиотеку от Adafruit. Установите все необходимые зависимости.

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

Подключение BME680 к Raspberry Pi Pico

Подключите BME680 к любой комбинации выводов I2C на Pico — мы будем использовать GPIO 4 (SDA) и GPIO 5 (SCL).

Схема подключения Raspberry Pi Pico к датчику BME680

Рекомендуемое чтение: Распиновка Raspberry Pi Pico и Pico W: описание GPIO

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

Чтобы показать вам, как считывать температуру, влажность и давление с BME680, мы воспользуемся простым скетчем, который выводит текущие показания каждую секунду в Serial Monitor. Следующий пример был адаптирован из примеров библиотеки Adafruit BME680.

/*********
  Complete project details at https://wiki.alashed.kz/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme; // I2C (default pins for Raspberry Pi Pico: GPIO 4 (SDA), GPIO 5(SCL)

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, библиотек Adafruit_Sensor и Adafruit_BME680 для взаимодействия с датчиком BME680.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

Давление на уровне моря

Создаётся переменная SEALEVELPRESSURE_HPA.

#define SEALEVELPRESSURE_HPA (1013.25)

Эта переменная сохраняет давление на уровне моря в гектопаскалях (что эквивалентно миллибарам). Она используется для оценки высоты при данном давлении путём сравнения с давлением на уровне моря. В этом примере используется значение по умолчанию, но для получения точных результатов замените это значение текущим давлением на уровне моря в вашем местоположении.

I2C

В этом примере по умолчанию используется протокол связи I2C. Следующая строка создаёт объект Adafruit_BME680 с именем bme на следующих GPIO RPi Pico: GPIO 5 (SCL), GPIO 4 (SDA).

Adafruit_BME680 bme; // I2C

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.

Загрузка кода

Загрузите код на Raspberry Pi Pico.

Для загрузки кода на Raspberry Pi Pico плата должна находиться в режиме загрузчика (bootloader mode).

Если на Raspberry Pi Pico в данный момент установлена прошивка MicroPython, вам необходимо вручную перевести плату в режим загрузчика. Для этого подключите Raspberry Pi Pico к компьютеру, одновременно удерживая кнопку BOOTSEL.

Raspberry Pi Pico в режиме загрузчика (bootloader mode)

При последующих загрузках через Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажимать кнопку BOOTSEL.

Теперь выберите COM-порт в меню Tools > Port. Возможно, COM-порт будет неактивен (выделен серым). Если это так, не беспокойтесь — порт будет найден автоматически при нажатии кнопки загрузки.

Загрузите код.

Кнопка загрузки в Arduino IDE 2.0

Если вы не знаете, как загружать код на Raspberry Pi Pico через Arduino IDE, ознакомьтесь с руководством: Программирование Raspberry Pi Pico в Arduino IDE.

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

После загрузки кода на плату откройте Serial Monitor на скорости 115200 бод. Показания датчика будут отображаться каждые 5 секунд.

Raspberry Pi Pico с BME680 в Arduino IDE — демонстрация

Заключение

Это руководство представляло собой введение в работу с датчиком окружающей среды и качества воздуха BME680 на Raspberry Pi Pico с использованием Arduino IDE.

Надеемся, что это руководство было полезным. У нас есть руководства по другим популярным датчикам окружающей среды: