ELECTRONICS

BMP280 и Arduino: подключение датчика давления по I2C, высота над уровнем моря, библиотека

Датчики температуры и влажностиСкетч проверен компиляцией

BMP280 меряет атмосферное давление с точностью до паскаля и температуру в придачу. Из давления считается высота — с разрешением около десяти сантиметров, поэтому датчик стоит в квадрокоптерах как барометрический высотомер и в метеостанциях как барометр.

Фиолетовый модуль GY-BMP280 с шестью выводами — самый частый. Питание 3,3 В, стабилизатора на плате нет, поэтому 5 В подавать нельзя. Подключается по I2C двумя проводами.

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

103103103103VCCGNDSCLSDACSBSDO
Наведите на провод или нажмите на него — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
VCC3,3 В. На модулях с шестью выводами стабилизатора нет.
GNDЗемля.
SCLТакт I2C или SPI.
SDAДанные I2C или MOSI в режиме SPI.
CSBВыбор SPI. Не подключён — работает I2C.
SDOЗадаёт адрес I2C: на землю — 0x76, на плюс — 0x77. Не подключён — на большинстве плат 0x76.

Характеристики

Давление
300–1100 гПа, точность ±1 гПа
Разрешение по высоте
около 0,1 м
Температура
−40…+85 °C, ±1 °C
Интерфейс
I2C 0x76/0x77 или SPI
Питание
1,7–3,6 В
Ток
2,7 мкА при замере раз в секунду

BMP280, BME280 и BMP180

BME280 — тот же датчик плюс влажность, и стоит вдвое дороже. Внешне модули почти одинаковы, отличаются буквой на микросхеме и, у некоторых продавцов, ничем: под видом BME продают BMP. Проверка простая — библиотека BME280 не найдёт датчик, если влажности в нём нет.

BMP180 — предыдущее поколение, точность хуже, но на его модуле GY-68 есть стабилизатор, и он терпит 5 В. Если попался он, библиотека другая: Adafruit BMP085.

Библиотека

Adafruit BMP280 LibraryТянет за собой Adafruit Unified Sensor — менеджер предложит поставить, соглашайтесь.

Готовый скетч

#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

// Давление на уровне моря в вашем регионе сегодня, гПа —
// от него считается высота. Смотрите на сайте погоды.
const float SEA_LEVEL_HPA = 1013.25;

void setup() {
  Serial.begin(9600);
  if (!bmp.begin(0x76)) {           // попробуйте 0x77, если не найден
    Serial.println("BMP280 не найден");
    while (true) {}
  }
}

void loop() {
  float pa = bmp.readPressure();                 // паскали
  Serial.print("Давление: ");
  Serial.print(pa / 133.322);                    // в мм рт. ст.
  Serial.print(" мм рт. ст.   Температура: ");
  Serial.print(bmp.readTemperature());
  Serial.print(" °C   Высота: ");
  Serial.print(bmp.readAltitude(SEA_LEVEL_HPA));
  Serial.println(" м");
  delay(2000);
}

Скетч собирается arduino-cli под Arduino UNO

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

Частые ошибки

Не найден на 0x76

Адрес 0x77 — вывод SDO подтянут к плюсу на этой партии плат. Или это BME280, тогда нужна другая библиотека.

Сгорел

5 В на VCC. Фиолетовый модуль на шесть выводов работает только от 3,3.

Высота скачет на метры

Датчик реагирует на сквозняк, дыхание и свет. Накройте его поролоном и усредните показания в коде.

Температура завышена на пару градусов

Датчик греет сам себя и греется от платы рядом. Это барометр, а не термометр; для температуры берите DS18B20.

Что понадобится