Датчик атмосферного давления BMP085 и Arduino

BMP085 – это сенсор для контроля барометрического давления (кроме этого, он еще контролирует и температуру).

Датчик используется во многих проектах, в том числе и с использованием Arduino, так как у него практически нет аналогов. Кроме того, стоит он тоже недорого. Первый вопрос, который возникает: а зачем кому-то мерять атмосферное давление? На то есть две причины. Первая - контролировать высоту над уровнем моря. С увеличением высоты над уровнем моря, давление падает. Очень удобно в походах, в качестве альтернативы GPS навигаторам. Кроме того, показатель атмосферного давления используют для прогнозирования погоды.

На смену BMP085 в свое время пришел датчик BMP180, который подключается к Arduino и другим микроконтроллерам так же как и его предшественник, но при этом меньше и стоит дешевле.

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

  • Диапазон чувствительности: 300-1100 гПа (9000 м - 500 м над уровнем моря);
  • Разрешающая способность: 0.03 гПа / 0.25 м;
  • Рабочая температура -40 до +85°C, точность измерения температуры +-2°C;
  • Подключение по i2c;
  • V1 на модуле использует 3.3 В питания и питания логики;
  • V2 на модуле использует 3.3-5 В питание и питание логики;
  • Даташит чипа на BMP085.

Подключение BMP085 к Arduino

BMP085 подключается к Arduino очень легко, так как на подобных модулях предусмотрен i2c. Для начала, необходимо распаять рельсы на модуле BMP085.

Установите рельсу на беспаечную монтажную плату таким образом, чтобы короткая сторона контактов была сверху. Установите модуль BMP085 на рельсу.

BMP085 на рельсе беспаечной платы

После этого припаяйте контакты к датчику:

BMP085 - паяем BMP085 припаянный к контактам

Результат распайки показан выше. Теперь мы можем подключать BMP085 к Arduino:

Подключение BMP085 к Arduino

Контакт VCC подключается к источнику питания - пин 3.3 V на Arduino. Если у вас BMP085 V1, нельзя использовать источник питания более 3.3 В, так что не используйте 5 В! На модулях BMP085 V2 есть регулятор 3.3 В, так что этот датчик давления можно подключать к питанию 5 В.

Контакт GND подключается к земле (GND на Arduino).

Контакт i2c SCL clock подключается к i2c clock пину на контроллере. На классических моделях Arduino (Arduino Uno/Duemilanove/Diecimila/и т.д.), это аналоговый пин Analog #5.

Контакт i2c SDA data подключается к i2c data контакту на контроллере. На классических моделях Arduino (Arduino Uno/Duemilanove/Diecimila/и т.д.), это аналоговый пин Analog #4.

К сожалению, пины под i2c на большинстве микроконтроллеров привязаны к конкретным пинам, так что придется использовать именно их.

Нет необходимости подключать пины XCLR (перезагрузка) или EOC (окончание конверсии). Если вам надо ускорить конверсию, вы можете использовать пин EOC в качестве индикатора - в нашем скетче мы просто будем ждать.

Использование BMP085 (API v2)

Эта часть статьи написана на базе новой версии драйверов v2 для датчика BMP085. Для работы вам понадобится Unified Sensor Driver, написанный командой Adafruit. Новая версия драйверов обеспечивает более точные показания высоты над уровнем моря, позволяет легче реализовывать переключение между BMP085 и другими датчиками давления, которые используются в вашем проекте.

Вам надо скачать и установить библиотеку Adafrut_Sensor library. Если у вы устанавливаете библиотеку для Arduino впервые, ознакомьтесь с инструкцией сайте Arduino-diy.com.

Особенности использования BMP085

Для того, чтобы рассчитать высоту над уровнем моря и барометрическое давление на основании показаний сенсора, надо прописать достаточно запутанный кусок математических зависимостей. Кому интересно, можете заглянуть в даташит BMP085. Особой пользы, с точки зрения самообразования, в этих преобразованиях нет. Это просто особенности работы датчика. Так что этот кусок кода предусмотрительно прописан в библиотеке для Arduino.

Библиотека для работы сенсора BMP085 с Arduino, можно скачать на github.

После перезагрузки Arduino IDE, можете запустить первый скетч-пример, код которого приведен ниже:

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

void setup(void)

{

Serial.begin(9600);

Serial.println("Pressure Sensor Test"); Serial.println("");

/* Инициализируем сенсор */

if(!bmp.begin())

{

/* Если появилась надпись: "There was a problem detecting the BMP085 ...",

Проверьте правильность подключения сенсора */

Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");

while(1);

}

}

void loop(void)

{

sensors_event_t event;

bmp.getEvent(&event);

/* отображаем результаты (барометрическое давление измеряется в гПа) */

if (event.pressure)

{

/* Отображаем атмосферное давление в гПа */

Serial.print("Pressure: "); Serial.print(event.pressure); Serial.println(" hPa");

}

else

{

Serial.println("Sensor error");

}

delay(250);

}

Открываем окно серийного монитора (скорость передачи данных - 9600). Наш скетч должен выводить данные о давлении в гПа (гектопаскалях). Можно проверить работоспособность сенсора, нажав пальцем на сенсор. На рисунке показаны значения давления после нажатия пальцем.

Первые показания с BMP085

Измерение высоты над уровнем моря

Вы наверняка знаете, что давление падает с увеличением высоты. То есть, мы можем рассчитать высоту, зная давление и температуру. Опять таки, математику мы оставим за кадром. Если вам интересны расчеты, можете ознакомиться с ними на этой странице Википедии.

В примере, который приведен ниже будет использована дополнительная библиотека Arduino. Для расчета высоты с помощью датчика BMP085, обновите функцию 'void loop()'. Необходимые изменения скетча приведены в скетче ниже. В результате вы получите значение температуры на основании уровня давления и значения температуры.

void loop(void)

{

/* создаем новое событие (event) для сенсора */

sensors_event_t event;

bmp.getEvent(&event);

/* отображаем результаты (барометрическое давление в гПа) */

if (event.pressure)

{

/* отображаем атмосферное давление в гПа */

Serial.print("Pressure: ");

Serial.print(event.pressure);

Serial.println(" hPa");

/* для расчета высоты с определенной точностью, необходимо знать *

* среднее давление и температуру окружающей среды

* в градусах по цельсию в момент снятия показаний*

* если у вас нет этих данных, можно использовать 'значение по умолчанию',

* которое равно 1013.25 гПа (это значение определено как

* SENSORS_PRESSURE_SEALEVELHPA *

* в файле sensors.h). Но в результаты будут не точными*

* *

* необходимые значения можно найти на сайтах с прогнозами температур*

* или на ресурсах информационных центров при больших аэропортах*

* *

* например, для Париже, Франция, можно найти текущее среднее значение давления*

* по на сайте: http://bit.ly/16Au8ol */

/* получаем текущее значение температуры с датчика BMP085 */

float temperature;

bmp.getTemperature(&temperature);

Serial.print("Temperature: ");

Serial.print(temperature);

Serial.println(" C");

/* конвертируем полученные данные в высоту */

/* обновляем следующую строку, отображая текущие значения */

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print("Altitude: ");

Serial.print(bmp.pressureToAltitude(seaLevelPressure,

event.pressure,

temperature));

Serial.println(" m");

Serial.println("");

}

else

{

Serial.println("Sensor error");

}

delay(1000);

}

Запускаем скетч и видим рассчитанную высоту над уровнем моря.

Высота над уровнем моря с BMP085

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

На рисунке ниже приведены значения давлений с одного из информационных ресурсов европейского аэропорта. Желтым цветом выделено значение давления, которое нам можно использовать для уточнения результатов.

Давление с сайта погоды

Изменим в нашем скетче следующую строку, записав в ней актуальное значение (1009 гПа):

float seaLevelPressure = 1009;

В результате мы получим несколько другие результаты:

Уточненная высота над уровнем моря с BMP085

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

Использование BMP085 (API v1)

Повторимся в очередной раз: для того, чтобы узнать давление и высоту над уровнем моря, надо провести некоторые расчеты. Но все они уже включены в библиотеку Adafruit_BMP085 Arduino Library (API v1), скачать которые можно ссылке.

После установки библиотек, необходимо перезагрузить Arduino IDE

После перезагрузки можете запустить первый скетч-пример:

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

void setup() {

Serial.begin(9600);

bmp.begin();

}

void loop() {

Serial.print("Temperature = ");

Serial.print(bmp.readTemperature());

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.print(bmp.readPressure());

Serial.println(" Pa");

Serial.println();

delay(500);

}

После прошивки вашего Arduino, откройте серийный монитор. Установите скорость обмена данными на 9600. Скетч будет выводить температуру в градусах по Цельсию и давление в паскалях. Если вы приложите палец к чувствительному элементу датчика, температура и давление увеличатся:

BMP085 и библиотека APIv1

Измерение высоты над уровнем моря (API v1)

Для контроля высоты над уровнем моря, достаточно просто запустить скетч, который приведен ниже:

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

void setup() {

Serial.begin(9600);

bmp.begin();

}

void loop() {

Serial.print("Temperature = ");

Serial.print(bmp.readTemperature());

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.print(bmp.readPressure());

Serial.println(" Pa");

// рассчитываем высоту над уровнем моря, отталкиваясь от значений

//'стандартного' барометрического давления, равного 1013.25 милибар = 101325 Паскаль

Serial.print("Altitude = ");

Serial.print(bmp.readAltitude());

Serial.println(" meters");

Serial.println();

delay(500);

}

Запускаем скетч для отображения результатов:

BMP085 и библиотека APIv1 - новые показания

Судя по показаниям выше, мы находимся на высоте -21.5 метра относительно уровня моря. Но ведь мы знаем, что находимся над морем! Вспоминаем о той же проблеме, что и при использовании API V2. Надо учесть погоду! Ок. Предположим, мы нашли качественный метеорогический веб-сайт и давление составляет 101,964 Па. Открываем пример Examples->BMP085test в Arduino IDE и правим строку, которая выделена на рисунке ниже:

BMP085 - уточняем показания

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

BMP085 - уточненные показания

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!