Руководство по BMP388 альтиметру с Arduino (давление, высота, температура)

BMP388 — это крошечный и точный абсолютный барометрический датчик давления. Благодаря своей точности он часто используется для оценки высоты в приложениях для дронов. Его также можно использовать для навигации внутри и вне помещений, GPS-приложений и других задач. В этом руководстве вы узнаете, как использовать альтиметр/датчик давления BMP388 с платой Arduino — схема подключения и пример скетча.

Руководство по BMP388 альтиметру с Arduino — давление, высота, температура

В этом руководстве мы рассмотрим:

Знакомство с барометрическим датчиком BMP388

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

  • вычисление вертикальной скорости;

  • интернет вещей;

  • прогноз погоды и метеостанции;

  • приложения для здравоохранения;

  • фитнес-приложения;

  • другие…

Мы используем датчик BMP388 в виде модуля, как показано на рисунке ниже. Он также доступен в других форматах.

Передняя сторона модуля датчика BMP388 — высота, давление, температура

На следующей фотографии показана другая сторона датчика.

Задняя сторона модуля датчика BMP388 — высота, давление, температура

Технические характеристики BMP388

В следующей таблице приведены основные характеристики датчика BMP388. Для получения дополнительной информации ознакомьтесь с даташитом.

Диапазон работы

от 300 до 1250 гПа (давление); от -40 до +85°C (температура)

Интерфейс

I2C и SPI

Средний типичный ток потребления

3,4 мкА при 1 Гц

Абсолютная точность давления (тип.) P=900…1100 гПа (T=25…40°C)

±0,5 гПа

Относительная точность давления (тип.) P=900…1100 гПа (T=25…40°C)

±0,08 гПа

Шум давления (минимальная полоса пропускания, максимальное разрешение)

0,03 Па

Максимальная частота дискретизации

200 Гц

Распиновка BMP388

Вот распиновка модуля BMP388, который мы используем — для других модулей она может немного отличаться.

VIN

Питание датчика (5 В)

3V3

Питание датчика (3,3 В)

GND

Общая земля

SCK

Вывод SCL для I2C связи; вывод SCK для SPI связи

SDO

Вывод SDO (MISO) для SPI связи

SDI

Вывод SDI (MOSI) для SPI связи; вывод SDA для I2C связи

CS

Вывод выбора чипа для SPI связи

INT

Вывод прерывания

Интерфейс BMP388

Как упоминалось ранее, датчик BMP388 поддерживает интерфейсы I2C и SPI.

Плата Arduino UNO и модуль датчика BMP388 — необходимые компоненты

BMP388 I2C

Для использования протокола I2C подключите следующие выводы (для Arduino Uno — если вы используете другую модель, проверьте её выводы I2C):

BMP388

Arduino

SDI (SDA)

A4

SCK (SCL)

A5

BMP388 SPI

Для использования протокола SPI подключите следующие выводы (для Arduino Uno — если вы используете другую модель, проверьте её выводы SPI):

BMP388

Arduino

SCK

Pin 13

SDI (MOSI)

Pin 11

SDO (MISO)

Pin 12

CS (Chip Select)

Pin 10

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

Плата Arduino UNO и модуль датчика BMP388 — демонстрация компонентов

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение BMP388 к Arduino

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

Arduino с BMP388 через I2C

Следуйте приведённой ниже схеме подключения BMP388 к Arduino Uno через выводы I2C.

Схема подключения Arduino с BMP388 через I2C — альтиметр, датчик давления

Arduino с BMP388 через SPI

В качестве альтернативы, если вы хотите использовать протокол SPI, следуйте приведённой ниже схеме подключения BMP388 к Arduino Uno через выводы SPI.

Схема подключения Arduino с BMP388 через SPI — альтиметр, датчик давления

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

Существуют различные библиотеки, совместимые с датчиком BMP388 и Arduino. В этом руководстве мы будем использовать библиотеку Adafruit BMP3XX.

Выполните следующие шаги для установки библиотеки в Arduino IDE:

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

Найдите «adafruit bmp3xx» в поле поиска и установите библиотеку.

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

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

Для использования библиотеки BMP3XX вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:

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

Установка библиотеки Adafruit Unified Sensor Driver

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

Код — Чтение давления, высоты и температуры BMP388

Лучший способ познакомиться с новым датчиком — начать с базового примера, предоставленного библиотекой.

После установки библиотеки BMP3XX откройте Arduino IDE и перейдите в File > Examples > Adafruit BMP3XX Library > bmp3XX_simpletest. Должен загрузиться следующий код.

/***************************************************************************
  This is a library for the BMP3XX temperature & pressure sensor. Designed
  specifically to work with the Adafruit BMP388 Breakout
  ----> http://www.adafruit.com/products/3966
  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_BMP3XX.h"

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP3XX bmp;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Adafruit BMP388 / BMP390 test");

  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode
  //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

void loop() {
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  Serial.print("Temperature = ");
  Serial.print(bmp.temperature);
  Serial.println(" *C");

  Serial.print("Pressure = ");
  Serial.print(bmp.pressure / 100.0);
  Serial.println(" hPa");

  Serial.print("Approx. Altitude = ");
  Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.println();
  delay(2000);
}

Просмотреть исходный код

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

Для получения более точных результатов по давлению и высоте мы рекомендуем скорректировать давление на уровне моря для вашего местоположения в переменной SEALEVELPRESSURE_HPA:

#define SEALEVELPRESSURE_HPA (1013.25)

Стандартное значение составляет 1013,25 гПа. Для более точных результатов проверьте давление на уровне моря в вашем местоположении. Вы можете использовать этот веб-сайт для проверки давления на уровне моря.

Как работает код

Продолжайте чтение этого раздела, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Библиотеки

Код начинается с подключения необходимых библиотек: библиотеки Wire для использования I2C, библиотеки SPI (если вы хотите использовать SPI вместо I2C), а также библиотек Adafruit_Sensor и Adafruit_BMP3XX для взаимодействия с датчиком BMP388.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"

SPI связь

Мы предпочитаем использовать протокол I2C для связи с датчиком. Однако код подготовлен на случай, если вы захотите использовать SPI. Следующие строки кода определяют выводы SPI.

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

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

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

#define SEALEVELPRESSURE_HPA (1013.25)

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

setup()

В функции setup() запускается последовательная связь.

Serial.begin(115200);

Инициализация датчика BMP388 по I2C

В этом примере по умолчанию используется протокол I2C. Следующая строка создаёт объект Adafruit_BMP3XX с именем bmp на выводах I2C: A5 (SCL), A4 (SDA).

if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire

Для использования SPI необходимо закомментировать предыдущую строку и раскомментировать одну из следующих строк — для аппаратного SPI (используются выводы SPI по умолчанию, выбирается вывод CS) или программного SPI (используются любые выводы).

//if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode
//if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode

Установите следующие параметры (передискретизация и фильтр) для датчика.

// Set up oversampling and filter initialization
bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
bmp.setOutputDataRate(BMP3_ODR_50_HZ);

Для увеличения разрешения необработанных данных датчика поддерживается передискретизация (oversampling). Мы будем использовать параметры передискретизации по умолчанию, но вы можете их изменить.

  • setTemperatureOversampling(): установка передискретизации температуры.

  • setPressureOversampling(): установка передискретизации давления.

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

  • BMP3_NO_OVERSAMPLING

  • BMP3_OVERSAMPLING_2X

  • BMP3_OVERSAMPLING_4X

  • BMP3_OVERSAMPLING_8X

  • BMP3_OVERSAMPLING_16X

  • BMP3_OVERSAMPLING_32X

Функция setIIRFilterCoeff() устанавливает коэффициент фильтра (в отсчётах). Возможные значения:

  • BMP3_IIR_FILTER_DISABLE (без фильтрации)

  • BMP3_IIR_FILTER_COEFF_1

  • BMP3_IIR_FILTER_COEFF_3

  • BMP3_IIR_FILTER_COEFF_7

  • BMP3_IIR_FILTER_COEFF_15

  • BMP3_IIR_FILTER_COEFF_31

  • BMP3_IIR_FILTER_COEFF_63

  • BMP3_IIR_FILTER_COEFF_127

Установите частоту выходных данных с помощью функции setOutputDataRate(). Она принимает одно из следующих значений:

BMP3_ODR_200_HZ, BMP3_ODR_100_HZ, BMP3_ODR_50_HZ, BMP3_ODR_25_HZ, BMP3_ODR_12_5_HZ, BMP3_ODR_6_25_HZ, BMP3_ODR_3_1_HZ, BMP3_ODR_1_5_HZ, BMP3_ODR_0_78_HZ, BMP3_ODR_0_39_HZ, BMP3_ODR_0_2_HZ, BMP3_ODR_0_1_HZ, BMP3_ODR_0_05_HZ, BMP3_ODR_0_02_HZ, BMP3_ODR_0_01_HZ, BMP3_ODR_0_006_HZ, BMP3_ODR_0_003_HZ или BMP3_ODR_0_001_HZ

loop()

В функции loop() мы получаем измерения с датчика BMP388.

Сначала даём команду датчику получить новые показания с помощью bmp.performReading().

if (! bmp.performReading()) {
  Serial.println("Failed to perform reading :(");
  return;
}

Затем получаем и выводим показания температуры, давления и высоты следующим образом:

Serial.print("Temperature = ");
Serial.print(bmp.temperature);
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.pressure / 100.0);
Serial.println(" hPa");

Serial.print("Approx. Altitude = ");
Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");

Вы получаете каждое конкретное показание следующим образом:

  • bmp.temperature: возвращает показание температуры

  • bmp.pressure: возвращает показание давления

  • bmp.readAltitude(SEALEVELPRESSURE_HPA): возвращает оценку высоты

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

После ввода давления на уровне моря для вашего местоположения вы можете загрузить код на плату. В Arduino IDE перейдите в Tools > Boards и выберите вашу плату. Затем в Tools > Port выберите COM-порт.

После загрузки откройте монитор последовательного порта на скорости 115200 бод. Показания будут выводиться в мониторе последовательного порта.

Показания высоты и давления BMP388 в мониторе последовательного порта

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

Заключение

BMP388 — это маленький и очень точный датчик давления, который позволяет оценивать высоту с высокой точностью. Датчик также измеряет температуру. Он отлично подходит для навигации на открытом воздухе/в помещении, дронов, метеостанций и других приложений.

В этом руководстве вы узнали, как использовать датчик с платой Arduino. Мы надеемся, что это вводное руководство оказалось полезным. Кроме того, у нас есть руководства по другим популярным датчикам:

Узнайте больше о плате Arduino из наших ресурсов:

Спасибо за чтение.