Датчик атмосферного давления bmp180 на pic. Подключение датчика BMP180 к Arduino. Вещи, которых нужно остерегаться

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

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

    Напряжение питания 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 находим наше место положение и кликаем левой кнопкой мышки, для установки метки на карте, и получаем данные по высоте над уровнем моря для нашей точки. Также не забываем учесть на каком этаже мы находимся и прибавить высоту этажей нашим данным.

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

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

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

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

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

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

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

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

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

Апрель 2, 2015

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

Датчик BMP180

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Информация

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

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

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

Как видим высота над уровнем моря 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, bmp280, bme280 – частые гости в инженерных проектах. С их помощью можно предсказать погоду или измерить высоту над уровнем моря. Сегодня именно эту линейку можно назвать самыми популярными и недорогими сенсорами для ардуино. В этой статье мы расскажем принцип действия датчиков, схему подключения к различным платам Arduino и приведем примеры программирования скетчей.

Барометр – устройство, измеряющее атмосферное давление. Электронные барометры используются в робототехнике и различных электронных устройствах. Наиболее распространенными и доступными являются датчики давления от фирмы BOSH: это BMP085, BMP180, BMP280 и другие. Первые два очень похожи между собой, BMP280 – это более новый и усовершенствованный датчик.

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

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

  • Габариты 2 х 2,5 х 0,95 мм.
  • Давление 300-1100гПа;
  • Температуры от 0С до 65 С;
  • Поддержка интерфейсов I2C и SPI;
  • Напряжение питания 1,7В – 3,6В;
  • Средний ток 2,7мкА;
  • 3 режима работы – режим сна, режим FORCED (проведение измерения, считывание значения, переход в спящий режим), режим NORMAL (перевод датчика в циклическую работу – то есть устройство самостоятельно через установленное время выходит из режима сна, проводит измерения, считывает показания, сохраняет измеренные значения и переходит снова в режим сна).

Датчик BMP180 – это дешевый и простой в применении сенсорный датчик, который измеряет атмосферное давление и температуру. Используется обычно для определения высоты и в метеостанциях. Состоит устройство из пьезо-резистивного датчика, термодатчика, АЦП, энергонезависимой памяти, ОЗУ и микроконтроллера.

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

  • Пределы измеряемого давления 225-825 мм рт. ст.
  • Напряжение питания 3,3 – 5В;
  • Ток 0,5мА;
  • Поддержка интерфейса I2C;
  • Время срабатывания 4,5мс;
  • Размеры 15 х 14 мм.

Датчик bme280 содержит в себе 3 устройства – для измерения давления, влажности и температуры. Разрабатывался для малого потребления тока, высокой надежности и долгосрочной стабильной работы.

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

  • Размеры 2,5 х 2,5 х 0,93 мм;
  • Металлический LGA-корпус, оснащенный 8-ю выходами;
  • Напряжение питания 1,7 – 3,6В;
  • Наличие интерфейсов I2C и SPI;
  • Потребляемый ток в режиме ожидания 0,1 мкА.

Если сравнивать все устройства между собой, то датчики очень похожи. По сравнению со своим предшественником, к которым относится BMP180, более новый датчик BMP280 заметно меньше по размерам. Его восьмиконтактный миниатюрный корпус требует аккуратности во время монтажа. Также устройство поддерживает интерфейсы I2C и SPI, в отличие от предшественников, которые поддерживали только I2C. По логике работы датчика изменений практически нет, была только усовершенствована температурная стабильность и увеличено разрешение АЦП. Датчик BME280, измеряющий температуру, влажность и давление, также похож на BMP280. Отличие между ними заключается в размерах корпуса, так как BME280 имеет датчик влажности, который немного увеличивает габариты. Количество контактов и их расположение на корпусе совпадают.

Варианты подключения к Arduino

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

Землю с Ардуино нужно соединить с землей на датчике, напряжение – на 3,3 В, SDA – к пину А4, SCL – к А5. Контакты А4 и А5 выбираются с учетом их поддержки интерфейса I2C. Сам датчик работает от напряжения 3,3 В, а Ардуино – от 5 В, поэтому на модуле с датчиком установлен стабилизатор напряжения.

Подключение BMP 280 к Ардуино. Распиновка и вид сверху платы изображены на рисунке.

Сам модуль датчика давления выглядит следующим образом:

Для соединения с Ардуино нужно подключить выходы следующим образом: соединить землю с Ардуино и на датчике, VCC – на 3,3В, SCL / SCK – к аналоговому контакту А5, SDA / SDI – к А4.

Подключение датчика BME280. Расположение контактов и распиновка у датчика BME280 такая же, как у BMP280.

Так как датчик может работать по I2C и SPI, подключение можно реализовать двумя методами.

При подключении по I2C нужно соединить контакты SDA и SCL.

При подключении по SPI нужно соединить SCL с модуля и SCK (13й контакт на Ардуино), SDO с модуля к 12 выводу Ардуино, SDA – к 11 контакту, CSB (CS) – к любому цифровому пину, в данном случае к 10 контакту на Ардуино. В обоих случаях напряжение подключается к 3,3В на Ардуино.

Описание библиотеки для работы с датчиком. Пример скетча

Для работы с датчиком BMP180 существуют различные библиотеки, упрощающие работу. К ним относятся SFE_BMP180, Adafruit_BMP085. Эти же библиотеки подходят для работы с датчиком BMP080. Для датчика bmp280 используется похожая библиотека Adafruit_BMP280.

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

Status = pressure.startTemperature();// Считываются данные с датчика о температуре if(status!=0){ delay(status); // Ожидание status = pressure.getTemperature(T); // Сохранение полученных данных о температуре if(status!=0){ Serial.print("Temperature: "); // Выведение на экран слова «Температура» Serial.print(T,2); // Вывод на экран значения температуры. Serial.println("deg C, "); //Печать символа градуса Цельсия.

Затем нужно получить информацию об атмосферном давлении.

Status = pressure.startPressure(3); // происходит считывание давления if(status!=0){ delay(status); // Ожидание status = pressure.getPressure(P,T); // получение давления, сохранение if(status!=0){ Serial.print("Absolute pressure: "); // Вывод на экран слов «Атмосферное давление» Serial.print(P,2); // Вывод на экран значения переменной mBar Serial.print(" mbar, "); // Вывод на экран текста "mBar" Serial.print(P*0.7500637554192,2); // вывод на экран значения в mmHg (мм.рт.ст.) Serial.println(" mmHg");} // вывод на экран единицы измерения давления "mmHg" (мм. Рт.ст.).

После загрузки скетча в окне мониторинг порта появятся данные о температуре и атмосферном давлении.

Датчик BME280 также показывает давление и температуру, дополнительно он может считывать показания о влажности, который по умолчанию выключен. При необходимости можно произвести настройки датчика и начать считывать показания о влажности. Диапазон измерения от 0 до 100%. Библиотека, которая нужна для работы с датчиком, называется Adafruit_BME280.

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

Void printValues() { Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" C"); //определение температуры, вывод ее на экран в градусах Цельсия. Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); //определение давления, вывод его на экран Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); //определение влажности в процентах, вывод измеренного значения на экран. Serial.println(); }

Возможные ошибки при подключении и устранение их

Наиболее часто встречающаяся ошибка – неправильные данные о давлении и температуре, которые отличаются на несколько порядков от реального значения. Причиной этого чаще всего становится неправильное подключение – например, в библиотеке указано, что нужно подключать по I2C, а датчик подключен по SPI.

Также при использовании “китайских” датчиков можно столкнуться с нестандартными I2C или SPI адресами. В этом случае рекомендуется просканировать все присоединенные устройства с помощью одного из популярных скетчей и выяснить, по какому адресу откликается ваш датчик давления.

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

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

Заключение

Датчики атмосферного давления bmp180, bmp280- не самые дешевые виды сенсоров, но во многих случаев альтернативы таким сенсорам практически нет. В проекте метеостанции датчик фиксирует важный параметр – атмосферное давление, благодаря чему становится возможным предсказывать погоду. В проектах, связанных с созданием летающих аппаратов барометр используется в качестве датчика реальной высоты над уровнем моря.

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

Датчик абсолютного давления и температуры (последним сегодня уже никого не удивишь) 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<<6);
Ожидаем спад флага состояния «CSO» в «0»;
Читаем результат из регистров «Out MSB», «Out LSB» и «Out xLSB»;
long UP = («Out MSB»<<16 + «Out LSB»<<8 + «Out xLSB») >> (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 секунд. }

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 В питание и питание логики;

После перезагрузки 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!");

sensors_event_t event;

bmp.getEvent(&event);

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

if (event.pressure)

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

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

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


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

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

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

/* создаем новое событие (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,

Serial.println(" m");

Serial.println("");

Serial.println("Sensor error");

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

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

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


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

float seaLevelPressure = 1009;

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

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

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

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

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

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

#include <Wire.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.println(" Pa");

Serial.println();

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


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

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

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

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();

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


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


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


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