BMP280 и Arduino: подключение датчика давления по I2C, высота над уровнем моря, библиотека
BMP280 меряет атмосферное давление с точностью до паскаля и температуру в придачу. Из давления считается высота — с разрешением около десяти сантиметров, поэтому датчик стоит в квадрокоптерах как барометрический высотомер и в метеостанциях как барометр.
Фиолетовый модуль GY-BMP280 с шестью выводами — самый частый. Питание 3,3 В, стабилизатора на плате нет, поэтому 5 В подавать нельзя. Подключается по I2C двумя проводами.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| VCC | 3,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.
Что понадобится
- Модуль GY-BMP280
- Arduino UNO
- Провода «папа-мама»