Raspberry Pi Pico: датчик окружающей среды BME680 (Arduino IDE)
Начните работу с модулем датчика окружающей среды BME680 и платой Raspberry Pi Pico, программируемой в Arduino IDE, для получения данных о температуре, влажности, давлении и газе (качество воздуха). Мы покажем вам, как подключить датчик, установить необходимые библиотеки и написать простой скетч для отображения показаний датчика.
Впервые работаете с Raspberry Pi Pico? Начните с руководства Начало работы с Raspberry Pi Pico.
Raspberry Pi Pico с Arduino IDE
Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, и вы должны знать, как загружать код на плату. Ознакомьтесь со следующим руководством, если вы ещё этого не сделали:
Знакомство с датчиком окружающей среды BME680
BME680 — это датчик окружающей среды, который объединяет в себе датчики газа, давления, влажности и температуры. Датчик газа может обнаруживать широкий спектр газов, таких как летучие органические соединения (VOC). По этой причине BME680 может использоваться для контроля качества воздуха в помещении.
Измерения BME680
BME680 — это цифровой датчик 4-в-1, который измеряет:
Температуру
Влажность
Атмосферное давление
Газ: летучие органические соединения (VOC), такие как этанол и угарный газ
Датчик газа
BME680 содержит MOX-датчик (Metal-oxide — на основе оксида металла), который обнаруживает летучие органические соединения в воздухе. Этот датчик даёт качественное представление о суммарном содержании VOC/загрязнителей в окружающем воздухе — он не является специфичным для конкретной молекулы газа.
MOX-датчики состоят из поверхности на основе оксида металла, чувствительного чипа для измерения изменений проводимости и нагревателя. Датчик обнаруживает VOC путём адсорбции молекул кислорода на своём чувствительном слое. BME680 реагирует на большинство летучих органических соединений, загрязняющих воздух в помещении (за исключением 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 |
Общая земля |
SCL |
Вывод SCL для I2C-коммуникации / Вывод SCK для SPI-коммуникации |
SDA |
Вывод SDA для I2C-коммуникации / Вывод SDI (MOSI) для SPI-коммуникации |
SDO |
Вывод SDO (MISO) для SPI-коммуникации |
CS |
Вывод выбора чипа для SPI-коммуникации |
Интерфейс BME680
BME680 поддерживает интерфейсы I2C и SPI.
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.
Необходимые компоненты
Для этого проекта вам необходимо подключить модуль датчика 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. Установите все необходимые зависимости.
Подключение BME680 к Raspberry Pi Pico
Подключите BME680 к любой комбинации выводов I2C на Pico — мы будем использовать GPIO 4 (SDA) и GPIO 5 (SCL).
Рекомендуемое чтение: Распиновка 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_1XBME680_OS_2XBME680_OS_4XBME680_OS_8XBME680_OS_16X
Датчик BME680 интегрирует внутренний IIR-фильтр для уменьшения кратковременных изменений выходных значений датчика, вызванных внешними воздействиями. Метод setIIRFilterSize() устанавливает IIR-фильтр. Он принимает размер фильтра в качестве параметра:
BME680_FILTER_SIZE_0(без фильтрации)BME680_FILTER_SIZE_1BME680_FILTER_SIZE_3BME680_FILTER_SIZE_7BME680_FILTER_SIZE_15BME680_FILTER_SIZE_31BME680_FILTER_SIZE_63BME680_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.
При последующих загрузках через Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажимать кнопку BOOTSEL.
Теперь выберите COM-порт в меню Tools > Port. Возможно, COM-порт будет неактивен (выделен серым). Если это так, не беспокойтесь — порт будет найден автоматически при нажатии кнопки загрузки.
Загрузите код.
Если вы не знаете, как загружать код на Raspberry Pi Pico через Arduino IDE, ознакомьтесь с руководством: Программирование Raspberry Pi Pico в Arduino IDE.
Демонстрация
После загрузки кода на плату откройте Serial Monitor на скорости 115200 бод. Показания датчика будут отображаться каждые 5 секунд.
Заключение
Это руководство представляло собой введение в работу с датчиком окружающей среды и качества воздуха BME680 на Raspberry Pi Pico с использованием Arduino IDE.
Надеемся, что это руководство было полезным. У нас есть руководства по другим популярным датчикам окружающей среды: