BMP280: подключение барометра к Arduino (давление и высота)
BMP280 это барометр Bosch размером с кунжутное зерно, который за копейки измеряет давление с точностью в доли гектопаскаля и пересчитывает его в высоту с шагом около метра. Подключение это шина I2C на четыре провода, а данные снимаются тремя функциями: readTemperature, readPressure и readAltitude.
Ниже схема, код с переводом давления в гПа, цифры точности из даташита и таблица отличий от BME280. Разбор с регистрами в уроке BMP280: барометр и высотомер, а давление можно покрутить слайдерами в симуляторе.
Отдельные разделы ниже отвечают на вопросы, которые обычно всплывают позже: почему высота считается неправильно и как это исправить, откуда берутся лишние десятки метров, стоит ли вообще брать барометр новичку и как проверить модуль по семи шагам.
Схема: I2C на четыре провода
| Вывод BMP280 | Arduino Uno | Зачем |
|---|---|---|
| VCC | 3.3 В или 5 В (модули с регулятором) | Питание |
| GND | GND | Земля |
| SDA | A4 | Линия данных I2C |
| SCL | A5 | Линия тактирования I2C |
Пятая нога модуля выбирает адрес: SDO, притянутая к земле, даёт 0x76, висящая в воздухе или притянутая к питанию даёт 0x77. Большинство модулей с маркетплейсов идут с 0x76, а библиотека Adafruit по умолчанию стучится в 0x77, поэтому адрес мы прописываем в begin() всегда явно. Сомневаетесь, прогоните I2C-сканер, он покажет адрес за минуту. Отдельно про маркировку: на дешёвых платах этот вывод часто подписан не SDO, а CS, хотя по смыслу это одно и то же, переключатель адреса.
Про питание стоит сказать отдельно, потому что чип и модуль это разные вещи. Сам BMP280 питается от 1,71 до 3,6 В, и подача на него 5 В без стабилизатора на плате приводит к деградации. Готовые модули с маркетплейсов почти всегда имеют на борту стабилизатор и подтяжки, и потому спокойно берут 5 В. Модули без стабилизатора, это чаще всего выпаянные с платы чипы или платы для 3,3 В, нужно питать только от 3,3 В. Простой признак: если на модуле есть чип-регулятор рядом с разъёмом питания, модуль пятивольтовый.
Код: давление в гПа и высота в метрах
#include <Wire.h>#include <Adafruit_BMP280.h>Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); if (!bmp.begin(0x76)) { Serial.println("BMP280 не найден"); while (1) delay(10); }} void loop() { Serial.print("T="); Serial.print(bmp.readTemperature()); Serial.print(" P="); Serial.print(bmp.readPressure() / 100.0); // Па -> гПа Serial.print(" H="); Serial.println(bmp.readAltitude(1013.25)); delay(2000);}readPressure() возвращает паскали, а метеоприборы говорят гектопаскалями, отсюда деление на 100: 101325 Па превращаются в знакомые 1013,25 гПа. readAltitude() пересчитывает давление в метры по барометрической формуле: без аргумента отсчёт идёт от 1013,25 гПа, а если передать давление на вашей площадке в день запуска, высота станет точнее на десятки метров. Опрос раз в 2 секунды с запасом: датчику хватает и реже.
Сколько верить цифрам
Даташит даёт три числа, и разница между ними принципиальна. Относительная точность ±0,12 гПа это около ±1 метра высоты у неподвижного датчика. Абсолютная точность ±1 гПа это уже ±8–9 метров. Разрешение 0,16 Па в самом точном режиме позволяет датчику различать шаг лифта. У земли один гектопаскаль это примерно 8 метров высоты, поэтому перепад между соседними этажами многоэтажки около 0,4 гПа, а между первым и десятым порядка 3 гПа: подъём на лифте виден на графике вживую. Ток при опросе раз в секунду около 2,7 мкА, для батарейных метеостанций датчик почти бесплатный.
Отсюда важное различие, которое стоит проговорить. Датчик прекрасно измеряет изменение давления и совсем не уверен в его абсолютном значении. Погода меняет давление на десятки гектопаскалей за сутки, и это в сотни раз больше, чем разница между этажами, поэтому «абсолютная высота» по одному датчику всегда будет плыть. Barometric altimeter работает как разница между двумя замерами, а не как координата. Если нужна настоящая высота над уровнем моря, её берут с GPS или калибруют барометр по известной точке.
BMP280 или BME280: таблица выбора
| Параметр | BMP280 | BME280 |
|---|---|---|
| Давление | 300–1100 гПа, ±1 гПа | 300–1100 гПа, ±1 гПа |
| Влажность | Нет | 0–100%, ±3% |
| Температура (полная точность) | 0–65 °C | 0–65 °C |
| Ток при опросе 1 Гц | ≈2,7 мкА | ≈3,6 мкА |
| Цена | в 1.5–2 раза дешевле | дороже |
Правило простое: влажность нужна, берите BME280, не нужна, берите BMP280. Разницы по давлению между ними нет. Комнатную влажность дешевле добрать связкой с DHT11 и DHT22, заодно получив температуру внешнего зонда. Так собрана и итоговая метеостанция из урока.
Тупик: высота считается на десятки метров ниже
Первый замер показал нам высоту, которой в здании быть не могло. Мы решили, что в формуле ошибка, перепроверили деление давления на 100, поменяли библиотеку на другую версию и только потом обратили внимание на то, что стояло в коде: bmp.readAltitude(1013.25).
1013,25 гПа это давление на уровне моря в стандартной атмосфере, и оно же является опорной точкой для пересчёта в высоту. Если ваш город на 300 метров выше уровня моря, а атмосферное давление там около 970 гПа, то в формуле надо подставить местное давление, и тогда высота посчитается правильно. Проще всего снять «эталон» барометром или погодным сайтом в момент запуска и записать это число в константу. Второй источник ошибки мы назвали бы температурой: датчик меряет и температуру, и если она ушла на 10 градусов, давление тоже уплывёт, потому что в формуле заложена компенсация по температуре, а библиотека берёт её из встроенного термометра.
Личный опыт: где барометр полезен, а где нет
Мы взяли BMP280 для нескольких задач и сразу увидели границу применимости. Там, где нужно знать, что давление изменилось, датчик оказался отличным: тренд за последние часы читается уверенно, и по нему мы безошибочно ловили приближение фронта и резкий выход из дома, когда давление за короткое время падало на несколько гектопаскалей.
А вот как датчик высоты он не сработал. Между двумя замерами в пределах одной комнаты высота гуляла на несколько метров, потому что атмосферное давление само по себе меняется, и эти изменения неотличимы от движения датчика. Практический вывод: если задача это «на каком этаже я нахожусь», барометр без дополнительной калибровки не подходит, и проще использовать датчик расстояния или отдельный датчик давления. А вот как индикатор погодных тенденций и как помощник в счётчике высоты для полёта или спуска по лестнице он работает хорошо.
Авторская позиция: стоит ли брать барометр новичку
Мы советуем брать BMP280 новичку, если тема проекта связана с погодой, высотой или подземными работами, и не брать, если хочется просто «добавить датчик». Модуль стоит копейки, подключается по двум проводам к уже знакомой шине и потребляет почти ничего, так что особого риска в нём нет.
Но помните про честную границу: показания давления не превращаются в абсолютную высоту сами по себе, и любая задача, где нужна высота с точностью до метра, потребует либо калибровки по эталону, либо другого датчика. Если же вам нужен просто humidity и температура для комнатного термометра, начинайте с DHT11: он проще в подключении и не требует шины. А BMP280 оставьте на проект, где давление действительно что-то значит, например на метеостанцию с прогнозом по тренду.