Датчик давления BMP280: подключение и настройка в Arduino

Датчик давления BMP280: подключение и настройка в Arduino

Возможности модуля BMP280, подключение по I2C и SPI, настройка через библиотеку Adafruit_BMP280 и пример домашней метеостанции.

Что умеет модуль

BMP280 выпускается фирмой Bosch как цифровой измеритель атмосферного давления и развитие модели BMP180. Каждый датчик калибруется на заводе. Помимо давления он измеряет температуру воздуха, а результаты можно сглаживать настраиваемым программным фильтром. В отличие от предшественника, BMP280 поддерживает два интерфейса, I2C и SPI. На плате модуля уже установлены фильтрующие конденсаторы по питанию и подтягивающие резисторы на линиях интерфейсов. Родственный датчик BME280 дополнительно измеряет влажность.

Внешний вид и схема модуля BMP280

У датчика три режима работы. В NORMAL он периодически просыпается, выполняет измерение и снова засыпает, а период задаётся программно. В FORCED измерение делается по команде, после чего датчик сам уходит в режим пониженного потребления. SLEEP соответствует минимальному энергопотреблению.

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

Напряжение питания1,71–3,6 В
ИнтерфейсыI2C или SPI
Ток потребления2,7 мкА при опросе 1 Гц
Диапазон давления300–1100 гПа (±0,12 гПа)
Соответствующая высотаот -500 до 9000 м над уровнем моря
Диапазон температурыот -40 до +85 °С
Максимальная частота I2C3,4 МГц
Максимальная частота SPI10 МГц
Размер модуля21×18 мм

Схемы подключения

На платах Arduino UNO, Nano, Mini аппаратная шина I2C выведена на пины A4 (SDA) и A5 (SCL). Для такого подключения хватает четырёх проводов: два идут на питание, два образуют шину данных.

Подключение BMP280 к Arduino Nano по I2C

Для SPI нужно шесть проводов. Линии соединяются с аппаратным SPI платы, а вывод CSB модуля в примере подключён к пину 10. Вместо него подойдёт любой цифровой вывод, указанный в программе.

Подключение BMP280 к Arduino по SPI

Работа с библиотекой Adafruit_BMP280

Из множества библиотек для этого датчика удобна Adafruit_BMP280: она не урезает функциональность и позволяет выбрать интерфейс, режим, точность и период измерений. В скетч подключаются заголовки Wire.h, SPI.h и Adafruit_BMP280.h. Объект датчика создаётся одним из трёх способов: без параметров для I2C, с номером пина CS для аппаратного SPI или с четырьмя пинами (CS, MOSI, MISO, SCK) для программного SPI. В примере это пины 10, 11, 12 и 13. В программе должен остаться только один вариант.

Инициализация выполняется в setup() вызовом bmp.begin(). Если функция вернула ошибку, проверяют соединения и соответствие выбранному интерфейсу. Параметры задаёт функция setSampling() с пятью аргументами:

  • режим работы: MODE_NORMAL, MODE_FORCED, MODE_SLEEP или MODE_SOFT_RESET_CODE (сброс к заводским настройкам);
  • точность измерения температуры: от SAMPLING_NONE до SAMPLING_X16;
  • точность измерения давления с теми же значениями: SAMPLING_X1 соответствует 16 битам АЦП, каждая следующая ступень добавляет бит, SAMPLING_X16 даёт 20 бит;
  • фильтр: FILTER_OFF, FILTER_X2, FILTER_X4, FILTER_X8, FILTER_X16;
  • период пробуждения: STANDBY_MS_1, _63, _125, _250, _500, _1000, _2000 или _4000, число означает миллисекунды.

По умолчанию используются MODE_NORMAL, SAMPLING_X2 для температуры, SAMPLING_X16 для давления, FILTER_X16 и STANDBY_MS_500.

Чтение данных и адрес на шине

Показания возвращают три функции: readTemperature() в градусах Цельсия, readPressure() в паскалях и readAltitude() в метрах. Чтобы получить миллиметры ртутного столба, давление в паскалях умножают на 0,00750062.

Вывод температуры, давления и высоты с BMP280 в терминал

Аргумент readAltitude(), в примере 1013.25, задаёт давление на уровне моря для данной местности в гектопаскалях. Высота вычисляется по тому, как давление падает с подъёмом, поэтому точность прямо зависит от этой константы. Она меняется вместе с погодой, и актуальное значение берут на профильных сайтах.

Если по I2C датчик не обнаруживается, причина часто в адресе. Модули выпускаются с адресом 0x77 или 0x76, а библиотека по умолчанию обращается к 0x77. Для исправления в файле Adafruit_BMP280.h находят строку #define BMP280_ADDRESS (0x77), меняют значение на 0x76, сохраняют файл и заново компилируют скетч.

Пример: домашняя метеостанция

BMP280 ставят в полётные контроллеры для определения высоты, используют как глубиномер при спуске в шахту, но чаще всего применяют в метеостанциях. В примере Arduino Nano выводит данные на графический дисплей Nokia 5110. Экран и подсветка питаются от линейного стабилизатора AMS1117-3V3, чтобы не перегружать плату. Для дисплея нужны библиотеки Adafruit-PCD8544-Nokia-5110-LCD-library и Adafruit-GFX-Library. Дисплей подключён к выводам 3 (SCLK), 4 (DIN), 5 (DC), 6 (CS) и 7 (RST), датчик работает по I2C.

Раз в минуту программа выводит три строки: температуру, высоту и давление в миллиметрах ртутного столба. Ниже рисуется столбчатый график давления: значение из диапазона 730–760 масштабируется функцией map в высоту столбца от 0 до 24 пикселей. Ширина экрана составляет 84 пикселя, поэтому на графике видны последние 84 минуты, после чего он начинается заново. Резкое падение давления указывает на приближение дождя, рост говорит об улучшении погоды.

← Все статьи