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

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

У датчика три режима работы. В NORMAL он периодически просыпается, выполняет измерение и снова засыпает, а период задаётся программно. В FORCED измерение делается по команде, после чего датчик сам уходит в режим пониженного потребления. SLEEP соответствует минимальному энергопотреблению.
Технические характеристики
| Напряжение питания | 1,71–3,6 В |
| Интерфейсы | I2C или SPI |
| Ток потребления | 2,7 мкА при опросе 1 Гц |
| Диапазон давления | 300–1100 гПа (±0,12 гПа) |
| Соответствующая высота | от -500 до 9000 м над уровнем моря |
| Диапазон температуры | от -40 до +85 °С |
| Максимальная частота I2C | 3,4 МГц |
| Максимальная частота SPI | 10 МГц |
| Размер модуля | 21×18 мм |
Схемы подключения
На платах Arduino UNO, Nano, Mini аппаратная шина I2C выведена на пины A4 (SDA) и A5 (SCL). Для такого подключения хватает четырёх проводов: два идут на питание, два образуют шину данных.

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

Работа с библиотекой 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.

Аргумент 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 минуты, после чего он начинается заново. Резкое падение давления указывает на приближение дождя, рост говорит об улучшении погоды.