Библиотека Adafruit BMP280
Датчик давления и температуры BMP280 по I2C или SPI: давление в паскалях, высота над уровнем моря.
BMP280 меряет атмосферное давление с точностью, достаточной, чтобы заметить подъём на один этаж, и заодно температуру. Библиотека отдаёт давление в паскалях и считает высоту, если сказать ей давление на уровне моря. Вместе с ней ставится Adafruit Unified Sensor и BusIO.
На модулях GY-BMP280 адрес обычно 0x76, а не 0x77 из примеров Adafruit — это первая причина «датчик не найден». Вторая — вместо BMP280 в модуле стоит BME280 с влажностью, у него своя библиотека.
Установка и подключение
В менеджере библиотек ищите Adafruit BMP280 Library автора Adafruit. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.
#include <Wire.h>
#include <Adafruit_BMP280.h>Создание объекта — обычно до setup():
Adafruit_BMP280 bmp; // I2C
bmp.begin(0x76); // в setup(); 0x76 у GY-BMP280, 0x77 у плат AdafruitМетоды
Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 3.0.0.
begin(uint8_t address)- Найти датчик по адресу. false — не найден или это не BMP280.
readTemperature()- Температура, °C.
readPressure()- Давление в паскалях; делите на 100 для гектопаскалей и на 133,3 для мм рт. ст.
readAltitude(float seaLevelhPa)- Высота в метрах относительно давления на уровне моря — берут с ближайшей метеостанции, по умолчанию 1013,25.
setSampling(mode, tempOS, pressOS, filter, standby)- Режим и усреднение: для точных измерений ставят передискретизацию ×16 и фильтр.
takeForcedMeasurement()- Одно измерение в режиме FORCED — для экономии батареи.
sensorID()- Код чипа: 0x58 — BMP280, 0x60 — это BME280, нужна другая библиотека.
Пример
#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(9600);
if (!bmp.begin(0x76)) {
Serial.print("Датчик не найден, id = 0x");
Serial.println(bmp.sensorID(), HEX);
while (1);
}
}
void loop() {
Serial.print(bmp.readTemperature(), 1);
Serial.print(" C ");
Serial.print(bmp.readPressure() / 133.322, 1);
Serial.print(" мм рт. ст. ");
Serial.print(bmp.readAltitude(1013.25), 0);
Serial.println(" м");
delay(2000);
}Высота «плавает» на метр-два — это норма для давления. Для этажности хватает, для дрона нужны фильтры.
На чём попадаются
begin() возвращает false
Адрес 0x76 вместо 0x77, либо чип BME280 (sensorID 0x60): для него библиотека Adafruit BME280.
Температура завышена на пару градусов
Датчик греется от платы и собственного питания. Отодвиньте от стабилизатора или переведите в FORCED-режим с редкими измерениями.
Давление 300 или 1100 гПа
Крайние значения диапазона — датчик не откалиброван или неверно прочитаны коэффициенты. Проверьте питание 3,3 В и провода.