Барометр — это устройство, которое измеряет атмосферное давление. То есть давление воздуха, который давит на нас со всех сторон. Еще со школы мы знаем, что первый барометр представлял собой тарелку с ртутью, и перевернутой пробиркой в ней. Автором этого устройства был Эванджели́ста Торриче́лли — итальянский физик и математик. Снять показания ртутного барометра можно так же просто, как и показания спиртового термометра: чем давление снаружи колбы больше, тем выше столбик ртути внутри неё. Пары ртути, как известно, весьма ядовиты.

Позже, появился более безопасный прибор — барометр-анероид. В этом барометре ртуть была заменена на гофрированную коробку из тонкой жести, в которой создано разрежение. Под воздействием атмосферы, коробочка сжимается и через систему рычагов поворачивает стрелку на циферблате. Вот так выглядят эти два барометра. Слева — анероид, справа — барометр Торричелли.

Зачем нам может понадобиться барометр? Чаще всего, этот прибор используют на летательных аппаратах для определения высоты полета. Чем выше аппарат поднимается над уровнем моря, тем меньшее давление испытывает бортовой барометр. Зная эту зависимость, легко определить высоту.


Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

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

Электронный барометр

Такие громоздкие барометры мы не сможем использовать в робототехнике. Нам нужен миниатюрный и энергоэффективный прибор, который легко подключается к той же Ардуино Уно. Большинство современных барометров делают по технологии МЭМС, так же как и гиротахометры с акселерометрами. МЭМС барометры основаны на пьезорезистивном, либо на тензометрическом методе, в которых используется эффект изменения сопротивления материала под действием деформирующих сил.

Если открыть корпус МЭМС барометра, можно увидеть чувствительный элемент (справа), который находится прямо под отверстием в защитном корпусе прибора, и плату управления (слева), которая осуществляет первичную фильтрацию и преобразование измерений.


Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Датчики BMP085 и BMP180

К самым доступным датчикам давления, которые часто используются полетных контроллерах и в разного рода самодельных электронных устройствах, можно отнести датчики компании BOSH: BMP085 и BMP180. Второй барометр более новый, но полностью совместимый со старой версией.


Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Немного важных характеристик BMP180:

  • диапазон измеряемых значений: от 300 гПа до 1100 гПа (от -500м от +9000м над уровнем моря);
  • напряжение питания: от 3.3 до 5 Вольт;
    сила тока: 5 мкА при скорости опроса — 1 Герц;
  • уровень шума: 0.06 гПа (0.5м) в грубом режиме (ultra low power mode) и 0.02 гПа (0.17м) а режиме максимального разрешения (advanced resolution mode).

Теперь подключим этот датчик к контроллеру, и попробуем оценить атмосферное давление.

Подключение BMP180

Оба датчика имеют I2C интерфейс, так что их без проблем можно подключить к любой платформе из семейства Ардуино. Вот как выглядит таблица подключения к Ардуино Уно.

BMP 180 GND VCC SDA SCL
Ардуино Уно GND +5V A4 A5

Принципиальная схема

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Внешний вид макета


Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Программа

Для работы с датчиком нам понадобится библиотека: BMP180_Breakout_Arduino_Library

Скачиваем её из репозитория, и устанавливаем в Arduino IDE. Теперь все готово для написания первой программы. Попробуем получить сырые данные из датчика, и вывести их в монитор COM порта.

#include #include SFE_BMP180 pressure; void setup(){ Serial.begin(9600); pressure.begin(); } void loop(){ double P; P = getPressure(); Serial.println(P, 4); delay(100); } double getPressure(){ char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0){ // ожидание замера температуры delay(status); status = pressure.getTemperature(T); if (status != 0){ status = pressure.startPressure(3); if (status != 0){ // ожидание замера давления delay(status); status = pressure.getPressure(P,T); if (status != 0){ return(P); } } } } }

Процедура получения заветного давления из датчика не такая тривиальная, и состоит из нескольких этапов. В упрощенном виде алгоритм выглядит так:

  1. запрашиваем у барометра показания встроенного датчика температуры;
  2. ждем время A, пока датчик оценивает температуру;
  3. получаем температуру;
  4. запрашиваем у барометра давление;
  5. ждем время B, пока датчик оценивает давление;
  6. получаем значение давления;
  7. возвращаем значение давления из функции.

Время B зависит от точности измерений, которая задается в функции startPressure . Единственный аргумент этой функции может принимать значения от 0 до 3, где 0 — самая грубая и самая быстрая оценка, 3 — самая точная оценка давления.

Загружаем программу на Ардуино Уно, и наблюдаем поток измерений атмосферного давления. Попробуем поднять датчик над головой, и опустить до уровня пола. Показания будут немного меняться. Осталось только разобраться, как нам преобразовать эти непонятные числа в высоту над уровнем моря.

Преобразование давления в высоту над уровнем моря

Датчик BMP180 возвращает величину давления в гектопаскалях (гПа). Именно в этих единицах принято измерять атмосферное давление. 1 гПа = 100 Паскалей. Известно, что на уровне моря давление в среднем составляет 1013 гПа, и каждый дополнительный метр над уровнем моря будет уменьшать это давление всего на 0.11 гПа (примерно).

Таким образом, если мы вычтем из результата функции getPressure число 1013, и разделим оставшуюся разность на 0.11, то мы получим значение высоты над уровнем моря в метрах. Вот так изменится наша программа:

Void loop(){ double P, Alt; P = getPressure(); Alt = (P - 1013)/0.11; Serial.println(Alt, 2); delay(100); }

В действительности, давление зависит от высоты над уровнем моря нелинейно, и наша формула годится лишь для высот на которых мы с вами обычно живем. Благо, человечеству известная более точная зависимость давления от высоты, которую мы можем применить для получения более точных результатов.

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Здесь p — измеренное в данной точке давление, p0 — давление относительно которого идет отсчет высоты.

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

#include #include SFE_BMP180 pressure; double P0 = 0; void setup(){ Serial.begin(9600); pressure.begin(); P0 = pressure.getPressure(); } void loop(){ double P, Alt; P = getPressure(); Alt = pressure.altitude(P,P0) Serial.println(Alt, 2); delay(100); } double getPressure(){ ... }

Я не стал полностью копировать функцию getPressure, чтобы сохранить читабельность текста.

В программе появилась еще одна переменная P0 — это давление, которое мы измерим на старте программы. В случае летательного аппарата, P0 будет давлением на взлетной площадке, относительно которой мы начнем набор высоты.

Визуализация

Теперь попробуем отобразить показания давления в программе SFMonitor , и посмотрим как меняется давление при движении датчика на высоту 2 метра.

Static const byte PACKET_SIZE = 1; static const byte VALUE_SIZE = 2; static const boolean SEPARATE_VALUES = true; #include #include #include SFE_BMP180 pressure; SerialFlow rd(&Serial); double P0 = 0; void setup(){ rd.setPacketFormat(VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin(9600); pressure.begin(); P0 = getPressure(); } void loop(){ double P; P = getPressure(); rd.setPacketValue(100+int((P - P0)*100)); rd.sendPacket(); delay(100); } double getPressure(){ ... }

В результате работы программы получим график давления в Паскалях:


Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Заключение

Как мы уяснили из урока, определение высоты над уровнем моря не такая тривиальная задача. Мало того, что давление зависит от высоты нелинейно, так еще картину портят различные внешние факторы. Например, давление у нас дома постоянно меняется с течением времени. Даже за несколько минут, высота измеренная нашим прибором может варьироваться в диапазоне 0.5 — 1 метра. Температура так же сильно влияет на качество измерений, поэтому нам приходится учитывать её при расчете давления.

Для летательных аппаратов рекомендуется использовать датчики повышенной точности, такие как MS5611. У этого барометра точность измерений может достигать 0,012 гПа, что в 5 раз лучше, чем у BMP180. Также, для уточнения барометрической высоты полета применяют координаты GPS.

Успехов в наблюдении за атмосферой! 🙂

BMP180 — Датчик абсолютного давления, построенный по пьезорезистивной схеме, он имеет низкий шум и высокую линейность, а также высокую скорость установки показаний. На кристалле расположен MEMS-датчик в виде гибкой кремниевой мембраны, закрывающей камеру со стандартным давлением. На мембране расположены тензодатчики, которые включены по схеме моста, и изменяют своё сопротивление при изгибе мембраны. Изгиб мембраны зависит от разности между окружающим давлением и давлением в камере, и выходной сигнал с тензомоста зависит от давления окружающей среды. Так как параметры мембраны и резисторов зависят от температуры, то на кристалле расположен цифровой термометр, показания которого используются для компенсации данных барометра, но может использоваться и самостоятельно. Не рекомендуется использование для компенсации данных барометра данные о температуре с других датчиков. Термометр в BMP180 расположен на самом измерительном кристалле, он измеряет температуру чувствительного элемента — поэтому его показания наиболее близки к температуре барометра и точны. Барометр может работать с максимальной точностью 2 Пa (если использовать его как барометрический высотомер это соответствует погрешности измерения высоты в 17 см).

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Технические характеристики:

    Напряжение питания 1.62V — 3.6V.

    Интерфейс подключения I2C.

    Точность до 0.02hPa (17cm).

    Диапазон: 300hPa to 1100hPa (+9000m to -500m).

    Выходные данные: 16 бит давление и температура

    разрешение по давлению 0.01hPa

    разрешение по температуре 0.1 о С

Arduino Example Code

#include
#include

/***************************************************
This is an example for the BMP085 Barometric Pressure & Temp Sensor
Designed specifically to work with the Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
These displays use I2C to communicate, 2 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on "168/"328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on "168/"328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;

Void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}

Void loop() {
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

// Calculate altitude assuming "standard" barometric
// pressure of 1013.25 millibar = 101325 Pascal

Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");

Serial.print("Pressure at sealevel (calculated) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");

// you can get a more precise measurement of altitude
// if you know the current sea level pressure which will
// vary with weather and such. If it is 1015 millibars
// that is equal to 101500 Pascals.

Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500 ));
Serial.println(" meters");

Serial.println();
delay(500);
}

Данный скетч выводит

  • Temperature = хх.хх *C — Температура в градусах Цельсия
  • Pressure = хх Pa — Атмосферное давление в Паскалях
  • Altitude = хх.хх meters — Высота в метрах
  • Pressure at sealevel (calculated) = хх Pa — Атмосферное давление в Паскалях (относительно уровня моря (расчетная))
  • Real altitude = хх.хх meters — Реальная высота (расчетная)

Для того чтобы выводить атмосферное давление в мм ртутного столбанадо изменить несколько строк

Serial.print ("Pressure = ");

Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.

Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"

Serial.print ("Pressure at sealevel (calculated) = ");

Serial.print (bmp.readSealevelPressure() / 133.322);

Serial.println (" mm");

Настройка датчика BMP180

Атмосферное давление зависит от места измерения, температуры воздуха и погоды. На уровне моря среднегодовое атмосферное давление составляет p н = 1013.25 мбар = 101,325 кПа (нормальное давление) при среднегодовой температуре 15°С. И при подъеме на каждые 8 м атмосферное давление падает на 100 Па = 1 мбар.

Можно получить более точное измерение высоты. Если мы знаем, текущее давление над уровнем моря для наших координат. Для этого надо узнать нашу реальную высоту над уровнем моря с помощью карт от Google, для этого перейдем по ссылке . В окне с картой от Google находим наше место положение и кликаем левой кнопкой мышки, для установки метки на карте, и получаем данные по высоте над уровнем моря для нашей точки. Также не забываем учесть на каком этаже мы находимся и прибавить высоту этажей нашим данным.

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться» Нормальное атмосферное давление на уровне моря составляет приблизительно 101,3 кПа или 101325 Па. Проще для получения нужного значения воспользоваться онлайн калькулятором - Расчёт атмосферного давления на различных высотах , а для перевода из (мм рт. ст.) в (Па) есть простая формула Па = мм рт. ст. * 133,322 . Для калибровки высоты нам потребуется внести изменения в строку

Serial . print (bmp . readAltitude (101500 ) ) ;

где вместо значения 101500 вводим своё рассчитанное значение.

Вещи, которых нужно остерегаться

Дайте ему воздух: Помните, что BMP180 необходим доступ окружающего воздуха для измерения его давления, так что не стоит его укладывать в герметичный корпус.

Но не слишком много воздуха: С другой стороны, воздействие быстро движущихся воздушных потоков или ветра могут вызвать кратковременные колебания давления, которые будут влиять ваши показания. Защетите устройство от сильных воздушных потоков.

Температурный режим: Потому что точное значение температуры необходимо для измерения давления, старайтесь не подвергать устройство резким изменениям температуры, и держите его подальше от горячих частей и других источников тепла.

Влага: BMP180 чувствителен к влаге и не должен контактировать с водой.

Свет: Удивительно, датчик BMP180 чувствителен к свету, который может войти в устройство через отверстие в верхней части чипа. Для достижения максимальной точности, следует оградить чип от окружающего света.

#include #include // Объявим переменную для доступа к SFE_BMP180: SFE_BMP180 pressure; #define ALTITUDE 1655.0 // высота над уровнем моря по приколу в метрах void setup() { Serial.begin(9600); Serial.println("REBOOT"); // инициализация if (pressure.begin()) Serial.println("BMP180 init ok"); else { // Если мы тут то что-то не срослось. Как правило косяки с подключением Serial.println("BMP180 init fail\n\n"); while(1); // зависаем } } void loop() { char status; double T,P,p0,a; // Если вы хотите знать давление воздуха, откорректированное по уровню моря, которое обычно используется в прогнозах погоды // Вам надо знать уровень моря в вашей местности где проводится замер // Ее и надо указать в константе ALTITUDE в начале кода Serial.println(); Serial.print("Уровень моря: "); Serial.print(ALTITUDE,0); Serial.print(" метров, "); Serial.print(ALTITUDE*3.28084,0); Serial.println(" футов"); // Если вы хотите наоборот узнать высоту над уровнем моря, а давление вам известно // надо указать текущее атмосферное давление. Как это сделать написано в конце кода. // Так как давление зависит каким-тоо боком от температуры, надо сначала узнать температуру // В BMP180 есть встроенный термометр. Замер температуры занимает некоторое время. // Если все ровно, pressure.startTemperature вернет в status количество милисекунд, // которое нужно подождать для замера температуры // Если какой-то косяк с проводами, вернет 0 status = pressure.startTemperature(); if (status != 0) { // ждем: delay(status); // Получаем температуру, засовываем ее в переменную T: // Функция вернет 1 если все ОК, 0 если не ОК status = pressure.getTemperature(T); if (status != 0) { // пишем температуру: Serial.print("температура: "); Serial.print(T,2); Serial.print(" градусов C, "); // в цельсиях Serial.print((9.0/5.0)*T+32.0,2); Serial.println(" градусов F"); // в фаренгейтах // Определяем атм. давление: // Параметр указывает разрешение, от 0 до 3 (чем больше разрешение, тем выше точность, тем дольше ждать). // Если все ровно, pressure.startPressure вернет в status количество милисекунд, // которое нужно подождать для замера атм. давления // Если какой-то косяк то вернет 0 status = pressure.startPressure(3); if (status != 0) { // ждем окончания замера: delay(status); // Теперь можно получить давление в переменную P. //Функция вернет 1 если все ОК, 0 если не ОК. status = pressure.getPressure(P,T); if (status != 0) { // выводим все: Serial.print("абсолютное давление: "); Serial.print(P,2); Serial.print(" миллибар, "); Serial.print(P*0.0295333727,2); Serial.println(" дюймов ртутного столба"); // датчик возвращает атм. давление, которое изменяется в зависимости от высоты датчика. // Если мы хотим как в прогнозе погоды, то нужно сделать сомнительные вычисления // Параметры: P = давленик с датчика в миллибарах, ALTITUDE = высота над уровнем моря в метрах. // Результат: p0 = давление, откорректированное по уровню моря p0 = pressure.sealevel(P,ALTITUDE); Serial.print("Давление по уровню моря: "); Serial.print(p0,2); Serial.print(" миллибар, "); Serial.print(p0*0.0295333727,2); Serial.println("дюймов ртутного столба"); // Или если вы хотите сделать наоборот и определить высоту над уровнем моря по известному давлению, // Parameters: P = давление с датчика в миллибарах, p0 = давление, откорректированное по уровню моря. // Результат: a = высота над уровнем моря в метрах. a = pressure.altitude(P,p0); Serial.print("рассчитанная высота над уровнем моря: "); Serial.print(a,0); Serial.print(" метров, "); Serial.print(a*3.28084,0); Serial.println(" футов"); } else Serial.println("ошибка получение давления\n"); } else Serial.println("ошибка запуска получения давления\n"); } else Serial.println("ошибка получения температуры\n"); } else Serial.println("ошибка запуска получения температуры\n"); delay(5000); // пауза 5 секунд. }

Апрель 2, 2015

Датчик атмосферного давления BMP180 от компании Bosch является более экономным в плане электропитания и более точным чем его предшественник .

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Датчик BMP180

Основные характеристики датчика BMP180:

  • Диапазон измерения давления: 300 – 1100hPa
  • Напряжение питания: от 3.3 и 5V
  • Низкое энергопотребление: 3 мкА (режим ультра-низкого энергопотребления)
  • Точность: режим пониженного энергопотребления, разрешение 0.06hPa (0,5 м)
  • Высокий линейный режим с разрешением 0.02hPa
  • Подключение: протокол связи I2C
  • Возможность измерения температуры в диапазоне -40 … +85 ° C
  • Время отклика: 5ms
  • Ток в режиме ожидания: 0,1 мкA

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

  • VCC – для подключения 5в питания
  • GND – для подключения к минусу (GND)
  • SCL и SDA – для подключения к шине I2C
  • 3.3 – для подключения 3.3в питания

Купить датчик BMP180:

Библиотеки для датчика BMP180:

Для работы с датчиком BMP180 используются библиотеки которые предназначены для датчика BMP085 .

Библиотека для работы с датчиком атмосферного давления BMP085 от Adafruit

Библиотека для работы с датчиком давления BMP085

Какую именно библиотеку использовать для работы с датчиком решать Вам. Обзор библиотеки BMP085 я делал ранее в статье

Для примера я буду использовать библиотеку от Adafruit. Для начала запустим тестовый скетч из библиотеки и откроем монитор порта…

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Как мы видим у нас есть:

  • Temperature = 27.40 *C — Температура в градусах Цельсия
  • Pressure = 97726 Pa — Атмосферное давление в Паскалях
  • Altitude = 303.19 meters — Высота в метрах
  • Pressure at sealevel (calculated) = 97735 Pa — Атмосферное давление в Паскалях (относительно уровня моря (расчетная))
  • Real altitude = 317.47 meters — Реальная высота (расчетная)

Настройка и калибровка датчика BMP180

Хочу обратить Ваше внимание на то, что расчетные данные не точные, и они задаются в скетче.

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Информация

Мы можем получить более точное измерение высоты. Если мы знаем, текущее давление над уровнем моря для наших координат, которое будет меняться в зависимости от погодных условий и тому подобное. Если это 1015 миллибар, то значение равно 101 500 Па.

Теперь узнаем нашу реальную высоту над уровнем моря с помощью карт от Google, для этого перейдем по ссылке . В окне с картой от Google находим наше место пребывания и кликаем левой кнопкой мышки, для установки метки на карте.

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Координаты моего местоположения с значениями высоты

Как видим высота над уровнем моря 203 м, но я нахожусь на 3 этаже, значит прибавим еще 7 м и получим высоту 210 метров (приблизительно) и запомним ее. Теперь переходим к скетчу и значение с отображением данных атмосферного давления в Pa переводим в мм.рт.ст (значение делим на 133.3) и меняем отображение “Pa” на “мм”.

code

Arduino

Serial.print("Pressure = "); Serial.print(bmp.readPressure()/133.3); Serial.println(" mm");

Serial . print ("Pressure = " ) ;

Serial . print (bmp . readPressure () / 133.3 ) ;

Serial . println (" mm" ) ;

и еще тут

code

Arduino

Serial.print("Pressure at sealevel (calculated) = "); Serial.print(bmp.readSealevelPressure()/133.3); Serial.println(" mm");

Serial . print ("Pressure at sealevel (calculated) = " ) ;

Serial . print (bmp . readSealevelPressure () / 133.3 ) ;

Serial . println (" mm" ) ;

Снова загружаем наш скетч в плату и смотрим что у нас в мониторе порта

Иллюстрация к материалу «Ардуино: датчик давления BMP180 (BMP085). BMP180 подключение к Arduino Вещи, которых нужно остерегаться»

Датчик абсолютного давления и температуры (последним сегодня уже никого не удивишь) Bosch BMP180 . Датчик не нов и хорошо известен, datasheet изучен вдоль и поперек, а библиотек целая куча.

Характеристики:
  • Диапазон измерения давления: 300 – 1100 hPa.
  • Напряжение питания: от 1.8 — 3.3 и 5V(если на плате стоит стабилизатор напряжения).
  • Низкое энергопотребление: 3 мкА (режим ультра-низкого энергопотребления)
  • Точность: режим пониженного энергопотребления, разрешение 0.06hPa (0,5 м).
  • Высокий линейный режим с разрешением 0.02hPa (0,17 м).
  • Подключение: интерфейс I2C .
  • Возможность измерения температуры в диапазоне -40 … +85 ° C.
  • Время отклика: 5ms — 7.5ms (standart mode).
  • Ток в режиме ожидания: 0,1 мкA
Принцип действия датчика BMP180:

В датчике имеется герметичная камера, одна из стенок которой является гибкой мембраной с установленными на ней тензодатчиками. Мембрана прогибается пропорционально разности давлений внутри камеры и снаружи, что влияет на изменение сопротивления тензодатчиков электрическому току. Так же имеется термодатчик, сопротивление которого меняется пропорционально температуре. АЦП (аналого-цифровой преобразователь) переводит результаты изменений датчиков в цифровые данные «некомпенсированные результаты », которые доступны для чтения из регистров датчика: «Out MSB», «Out LSB» и «Out xLSB». Для компенсации указанных результатов (компенсации смещения, температурной зависимости, погрешностей при изготовлении, неоднородностей материалов и т.д.) каждый датчик калибруется на заводе, и в EEPROM записываются индивидуальные для каждого датчика 11 калибровочных коэффициентов
(176 бит) , которые доступны для чтения из регистров датчика: «AC1», «AC2», «AC3», «AC4», «AC5», «AC6», «B1», «B2», «MB», «MC», «MD».

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

Алгоритм получения данных:
  • Чтение калибровочных коэффициентов:

Чтение значений из одноименных регистров:
short AC1, AC2, AC3, B1, B2, MB, MC, MD;
unsigned short AC4, AC5, AC6;

  • Чтение температуры: (некомпенсированное значение)

Записываем в регистр «Measurement Control» значение: 0x2E;

Читаем результат из регистров «Out MSB» и «Out LSB»;

  • Чтение давления: (некомпенсированное значение)

Записываем в регистр «Measurement Control» значение: 0x34 + (OSSОжидаем спад флага состояния «CSO» в «0»;
Читаем результат из регистров «Out MSB», «Out LSB» и «Out xLSB»;
long UP = («Out MSB»> (8-OSS);

  • Вычисление действительных значений

Код и подключение.

Датчик достаточно популярный. Чаще всего он идет уже с обвязкой в виде готового модуля. Вы без труда найдете много разных, готовых библиотек. Я остановился на BMP180_Breakout_Arduino_Library. Скачать можно с GitHub или с нашего сайта .

Подключение описано в библиотеке, но я его продублирую на всякий случай:

SCL(clock)

  • Uno,Nano,Pro к А5
  • Mega,Due к 21
  • Leonardo к 3

SDA(Data)

  • Uno,Nano,Pro к А4
  • Mega,Due к 20
  • Leonardo к 2

VIN — к +5 вольта.

IO — Этот вывод есть на некоторых платах, питание в обход стабилизатора. НЕ больше 3.3 вольта .

GND — подключаем к минус.

Ну вот примерочный код с пояснениями:

#include #include // Объявим переменную для доступа к SFE_BMP180: SFE_BMP180 pressure; #define ALTITUDE 203.0 // высота над уровнем моря в метрах. void setup() { Serial.begin(9600); Serial.println("REBOOT"); // инициализация if (pressure.begin()) Serial.println("BMP180 init ok"); else { // Если мы тут то что-то не срослось. Как правило косяки с подключением Serial.println("BMP180 init fail\n\n"); while(1); // зависаем } } void loop() { char status; double T,P,p0,a; // Если вы хотите знать давление воздуха, откорректированное по уровню моря, которое обычно используется в прогнозах погоды // Вам надо знать уровень моря в вашей местности где проводится замер // Ее и надо указать в константе ALTITUDE в начале кода Serial.println(); Serial.print("Уровень моря: "); Serial.print(ALTITUDE,0); Serial.print(" метров, "); Serial.print(ALTITUDE*3.28084,0); Serial.println(" футов"); // Если вы хотите наоборот узнать высоту над уровнем моря, а давление вам известно // надо указать текущее атмосферное давление. Как это сделать написано в конце кода. // Если все ровно, pressure.startTemperature вернет в status количество милисекунд, // которое нужно подождать для замера температуры // Если какой-то ошибка, вернет 0 status = pressure.startTemperature(); if (status != 0) { // ждем: delay(status); // Получаем температуру // Функция вернет 1 если все ОК, 0 если не ОК status = pressure.getTemperature(T); if (status != 0) { Serial.print("Температура: "); Serial.print(T,2); Serial.print(" градусов C, "); // в цельсиях Serial.print((9.0/5.0)*T+32.0,2); Serial.println(" градусов F"); // в фаренгейтах // Определяем атм. давление: // Параметр указывает разрешение, от 0 до 3 (чем больше разрешение, тем выше точность, тем дольше ждать). status = pressure.startPressure(3); if (status != 0) { delay(status); // Теперь можно получить давление в переменную P. //Функция вернет 1 если все ОК, 0 если не ОК. status = pressure.getPressure(P,T); if (status != 0) { Serial.print("Абсолютное давление: "); Serial.print(P,2); Serial.print(" миллибар, "); //millibar (mb) Serial.print(P*0.750064,2); Serial.println(" мм ртутного столба"); // Параметры: P = давленик с датчика в миллибарах, ALTITUDE = высота над уровнем моря в метрах. // Результат: p0 = давление, откорректированное по уровню моря p0 = pressure.sealevel(P,ALTITUDE); Serial.print("Давление по уровню моря: "); Serial.print(p0,2); Serial.print(" миллибар, "); Serial.print(p0*0.750064,2); Serial.println("мм ртутного столба"); // Или если вы хотите сделать наоборот и определить высоту над уровнем моря по известному давлению, // Parameters: P = давление с датчика в миллибарах, p0 = давление, откорректированное по уровню моря. // Результат: a = высота над уровнем моря в метрах. a = pressure.altitude(P,p0); Serial.print("Рассчитанная высота над уровнем моря: "); Serial.print(a,0); Serial.print(" метров, "); Serial.print(a*3.28084,0); Serial.println(" футов"); } else Serial.println("ошибка получение давления\n"); } else Serial.println("ошибка запуска получения давления\n"); } else Serial.println("ошибка получения температуры\n"); } else Serial.println("ошибка запуска получения температуры\n"); delay(5000); // пауза 5 секунд. }