Руководство по BMP388 альтиметру с Arduino (давление, высота, температура)
BMP388 — это крошечный и точный абсолютный барометрический датчик давления. Благодаря своей точности он часто используется для оценки высоты в приложениях для дронов. Его также можно использовать для навигации внутри и вне помещений, GPS-приложений и других задач. В этом руководстве вы узнаете, как использовать альтиметр/датчик давления BMP388 с платой Arduino — схема подключения и пример скетча.
В этом руководстве мы рассмотрим:
Знакомство с барометрическим датчиком 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.
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 (читайте Лучшие стартовые наборы Arduino)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Подключение BMP388 к Arduino
BMP388 может обмениваться данными с использованием протоколов связи I2C или SPI.
Arduino с BMP388 через I2C
Следуйте приведённой ниже схеме подключения BMP388 к Arduino Uno через выводы I2C.
Arduino с BMP388 через SPI
В качестве альтернативы, если вы хотите использовать протокол SPI, следуйте приведённой ниже схеме подключения BMP388 к Arduino Uno через выводы SPI.
Установка библиотеки Adafruit BMP3XX
Существуют различные библиотеки, совместимые с датчиком BMP388 и Arduino. В этом руководстве мы будем использовать библиотеку Adafruit BMP3XX.
Выполните следующие шаги для установки библиотеки в Arduino IDE:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Найдите «adafruit bmp3xx» в поле поиска и установите библиотеку.
Установка библиотеки Adafruit_Sensor
Для использования библиотеки BMP3XX вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Перейдите в Sketch > Include Library > Manage Libraries и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите 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_OVERSAMPLINGBMP3_OVERSAMPLING_2XBMP3_OVERSAMPLING_4XBMP3_OVERSAMPLING_8XBMP3_OVERSAMPLING_16XBMP3_OVERSAMPLING_32X
Функция setIIRFilterCoeff() устанавливает коэффициент фильтра (в отсчётах). Возможные значения:
BMP3_IIR_FILTER_DISABLE(без фильтрации)BMP3_IIR_FILTER_COEFF_1BMP3_IIR_FILTER_COEFF_3BMP3_IIR_FILTER_COEFF_7BMP3_IIR_FILTER_COEFF_15BMP3_IIR_FILTER_COEFF_31BMP3_IIR_FILTER_COEFF_63BMP3_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 — это маленький и очень точный датчик давления, который позволяет оценивать высоту с высокой точностью. Датчик также измеряет температуру. Он отлично подходит для навигации на открытом воздухе/в помещении, дронов, метеостанций и других приложений.
В этом руководстве вы узнали, как использовать датчик с платой Arduino. Мы надеемся, что это вводное руководство оказалось полезным. Кроме того, у нас есть руководства по другим популярным датчикам:
Руководство по датчику температуры и влажности DHT11/DHT22 с Arduino
Руководство по датчику BME280 с Arduino (давление, температура, влажность)
Узнайте больше о плате Arduino из наших ресурсов:
Спасибо за чтение.