Как настроить смартфоны и ПК. Информационный портал

Барометр с расширенными функциями. Датчик атмосферного давления BMP085 и Arduino

Введение

Что можно вывести на двухстрочный экран, кроме «Hello world!»? Почему бы не отображать температуру влажность и давление?

Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino.

Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.

Необходимые комплектующие

Для отправки скетча в arduino был использован USB-UART . Так же можно было использовать Raspberry Pi или компьютер с COM портом.

Схема подключения для прошивки и код программы

Из Китая USB-UART пришёл с набором проводков:

Их вполне хватило. Перемычку оставил на 3.3 вольта, несмотря на то что моя версия arduino питается от 5 вольт.

UART - Arduino
5v - VCC
TXD - RXD
RXD - TXD
GND - GND
CTS - DTR (опционально, у меня не работал, возможно потому что напряжение сигналов осталось 3.3В)

Если не подключать DTR, то после отправки прошивки arduino нужно перезагрузить встроенной кнопкой, начнётся активный обмен данными в обе стороны (о чём свидетельствуют светодиоды на USB-UART), после успешной загрузки прошивки, она сама перезагрузится.

Необходимые сторонние библиотеки:

Непосредственно код, с комментариями из примеров (на случай, если кому то понадобится что то менять).

Код

#include #include "SparkFunBME280.h" #include "Wire.h" #include "SPI.h" #include //Global sensor object BME280 mySensor; LiquidCrystal_I2C lcd(0x3F,16,2); //Адрес дисплея, в моём случае 0x3F void setup() { lcd.init(); lcd.backlight(); //***Driver settings********************************// //commInterface can be I2C_MODE or SPI_MODE //specify chipSelectPin using arduino pin names //specify I2C address. Can be 0x77(default) or 0x76 //For I2C, enable the following and disable the SPI section mySensor.settings.commInterface = I2C_MODE; mySensor.settings.I2CAddress = 0x76; //Адрес датчика, в моём случае не стандартный //For SPI enable the following and dissable the I2C section //mySensor.settings.commInterface = SPI_MODE; //mySensor.settings.chipSelectPin = 10; //***Operation settings*****************************// //renMode can be: // 0, Sleep mode // 1 or 2, Forced mode // 3, Normal mode mySensor.settings.runMode = 3; //В примере предлагают использовать Forced mode, но при обновлении раз в секунду достаточно Normal mode //tStandby can be: // 0, 0.5ms // 1, 62.5ms // 2, 125ms // 3, 250ms // 4, 500ms // 5, 1000ms // 6, 10ms // 7, 20ms mySensor.settings.tStandby = 5; //Очевидно чаще не нужно //filter can be off or number of FIR coefficients to use: // 0, filter off // 1, coefficients = 2 // 2, coefficients = 4 // 3, coefficients = 8 // 4, coefficients = 16 mySensor.settings.filter = 0; //tempOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.tempOverSample = 1; //pressOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.pressOverSample = 1; //humidOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.humidOverSample = 1; //Calling .begin() causes the settings to be loaded mySensor.begin(); } void loop() { //Буквы можно вывести один раз, а далее менять показания, но показания при изменении количества значащих цифр могут сдвигать строку. lcd.setCursor(0,0); lcd.print("H="); lcd.print((uint8_t)mySensor.readFloatHumidity()); lcd.print("%"); lcd.print(" T="); lcd.print(mySensor.readTempC()); lcd.setCursor(13,0); lcd.print(" P:"); lcd.setCursor(0,1); int mmH=mySensor.readFloatPressure()/133; lcd.print(mmH); lcd.print("mmH "); lcd.print(mySensor.readFloatPressure()); lcd.setCursor(14,1); lcd.print("Pa"); delay(1000); }


Адрес датчика можно угадать, их всего два.

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

В данном случае:


И адрес будет 0x3F т.к. A0 - A2 разомкнуты:

Светодиод который обведён в овал лучше можно выпаять.

Схема подключения

Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны).

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

В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».

Итог

На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (возможно станет бегущей строкой).

Приветствую коллеги!
Т.к. зимой погода в основном не летная, то есть много свободного времени, которое не плохо бы чем-то занимать, чтобы мозги не засыхали от безделья. Я с недавних пор решил освоить предмет лютых холиваров и жарких споров, а именно: микроконтроллер Atmega328 в реализации Arduino.
Сильно прошу по поводу самой Ардуины дебатов не устраивать, про все ее плюсы и минусы и так в сети информации навалом.
Итак, учитывая специфику сайта, про "умный дом" рассказывать я думаю не совсем в тему, поэтому на базе Ардуины будем сооружать барометрический высотомер с трехразрядным семисегментным светодиодным дисплеем.

Подробнее?


Сразу скажу, на оригинальность и новаторство не претендую, подобных проектов в сети навалом. Но на этом ресурсе ничего подобного поиском не обнаружил, потому и решил опубликовать, вдруг кому-то пригодится.
Код опять же писал сам, потому, если там сплошная индусятина - не судите строго =) Я пока только учусь. Последний раз контроллеры программировал на 4-м курсе института больше 10 лет назад =) Грамотная и конструктивная критика приветствуется!
Постараюсь доступно и подробно объяснить как собрать такое устройство, справится человек с почти любым уровнем подготовки, я думаю.

Основной плюс данного девайса - его цена. Даже по теперешней жизни и курсе валют можно уложиться в 350р., что в общем-то не деньги. Так же потребуются прямые руки и умение обращаться с паяльником.

Функции устройства:
- Измерение текущей высоты и вывод ее на светодиодный дисплей.
- Запоминание максимального значения высоты имевшей место с момента включения питания.
- Вывод максимальной высоты на дисплей посредством нажатия кнопки.
- Запись максимального значения высоты в энергонезависимую память (EEPROM) контроллера (сохраняется после отключения питания).
- Чтение сохраненной максимальной высоты из EEPROM и вывод ее на дисплей.

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

Что понадобится (в скобках ключевые слова для поиска на всяких там ебаях и т.п.)
- микроконтроллер ардуино, в принципе подойдет почти любой, если код даптировать, но собиралось и проверялось все на базе (Arduino Nano).

- барометрический датчик высоты с шиной I2C (BMP085).

- трехразрядный семисегментный светодиодный дисплей с общим анодом (7-Segment LED Display).
- провода для соединения всего этого в единое целое, я использовал готовые и с разъемами, но это совсем не обязательно (Dupont Wire).

- кнопка, подойдет любая без фиксации положения (Tact Switch Push Button). Например такая:
- резистор от 1КОм до 10КОм.
- три резистора 100Ом.
- паяльник со всеми гобулями и умение им пользоваться.
- Arduino Software .

Опционально:
- макетная плата для распайки дисплея.

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

Сначала немного о дисплее.
Семисегментный светодиодный дисплей с общим анодом представляет из себя вот такую сборку из светодиодов (на картинке обведено красным):
Если повнимательней посмотреть на схему, то станет понятно, что одновременно может светиться только один из разрядов, т.е. чтобы отобразить трехразрядное число, нужно по очереди зажигать и гасить каждый разряд, причем делать это очень быстро. Поэтому цифры как ни крути будут мерцать, главное, чтобы это мерцание было достаточно частым и не воспринималось глазом как мерцание. А это значит, что ардуино будет работать в том числе и в качестве контроллера этого дисплея, по сути рисуя по очереди цифры составляющие число равное текущей высоте.
Сразу оговорюсь, можно купить и готовое решение, со встроенным контроллером, но стоит оно в 5 раз дороже, да и мне не попалось подходящей реализации при поиске, т.к. хотелось именно 3 разрядный, а в продаже все больше 4-х разрядные.
Кстати, учитывая что дисплей трехразрядный, максимальная высота, которую он в состоянии отобразить = 999м. В принципе устройство может быть легко адаптировано для 4-х разрядного дисплея, но программу при этом придется немного модифицировать. Кто разберется в коде для 3-х разрядов, тот легко сможет его адаптировать и для 4-х.
В итоге не смотря на всплывшие проблемы с этим самым мерцанием, удалось добиться более-менее приемлимых результатов, об этом ниже, т.к. проблемы возникли из-за датчика высоты.
Подробней о датчике.
Датчик барометрический, т.е. определяет изменение высоты по изменению атмосферного давления. Фактически датчик измеряет только атмосферное давление, вычислением высоты как функции от давления занимается уже код библиотеки для датчика. При этом датчик имеет встроенный АЦП и интерфейс I2C, т.е. выдает измеренную величину уже в цифровом виде, что несомненно является плюсом. Для работы с датчиком существует готовая библиотка . Я использовал именно первую версию, она менее ресурсоемка и проще встраивается в код. Функционал библиотеки позволяет настраивать точность измерений по шкале от 0 - наименьшая точность, до 3 - наибольшая точность (см. код). Хотя если честно я не заметил особенной разницы между уровнями выше 0. Погрешность измерений составляет около 1 метра, что в общем-то вполне приемлимо. Результат измерений - это абсолютная высота над уровнем моря при нормальном атмосферном давлении. Но это как раз совсем неинтересно. С другой стороны при помощи ардуино и простейших математических операций легко можно вычислить относительную высоту, что и было проделано.
Но не обошлось и без ложки дегтя: опрос датчика при помощи стандартной функции происходит достаточно длительное время, а учитывая, что ардуино еще и контроллер семисегментного дисплея, получились достаточно забавные спецэффекты, т.е. во время опроса датчика вывод на дисплей само собой останавливался и поэтому цифра, которая отображалась на тот момент горела чуть дольше других. В итоге получалась такая типа гирлянда из трех элементов.
В конечном итоге поигравшись с задержками и подобрав оптимальный период опроса датчика удалось добиться практически полного отсутствия мерцания. Тем более, что в опросе датчика каждый цикл программы необходимости нет никакой, высота все же меняется с ограниченной скоростью. А вот мельтешение первого разряда из-за погрешности и слишком частых опросов датчика смотрится не красиво.
В принципе будь у меня скилл покруче, можно было бы переписать библиотеку датчика, но пока не готов. Да и в такой реализации функции свои вполне выполняет, остальное лирика.
Вывод цифр был переведен на прерывание, мерцание ликвидировано, скетч обновлен.
На этом краткий экскурс по элементам устройства пожалуй закончу и перейду к сборке.

Схема соединения элементов устройства (кликабельно):


Предвосхищая вопросы из серии "что, нормальную схему не мог нарисовать?!" скажу, что мог бы, но для непосвященных такой ваиант мне думается будет проще для восприятия, а посвященным все равно, и так читается схема нормально. Распиновку семисегментника нашел только для четырехразрядной версии, трехразрядная версия отличается банально отсутствием 6-й ноги.

Что касется питания устройства: ардуино в первозданном виде способен нормально пережить от 7В до 16В, в крайнем случае от 6В до 20В. Но, учитывая, что у меня был китайский клон, гнусных опытов я ставить не стал, но от батареи LiPo 3S работает без проблем.
Датчик желательно упаковать таким образом, чтобы доступ воздуха был свободный, но при этом исключить прямой обдув потоками воздуха отверстия в датчике, например, прикрыть его пороллоном.
С платы ардуино рекомендую удалить светодиоды RX и TX, т.к. они включены параллелльно 0 и 1 цифровым выводам, из-за чего сегменты подключенные к этим выводам будут светиться с меньшей яркостью.

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 метров со знаком плюс, что гораздо больше похоже на правду.


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

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

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

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

Внешний вид устройства представлен на фотографии.

Результаты измерений выводятся на двухстрочный знакосинтезирующий дисплей. В первую строку выводится результат измерения текущего атмосферного давления в мм.рт.ст., отклонение текущего значения давления от среднего значения для данного места (положительным считается превышение текущего значения давления над средним), а также температура воздуха в градусах Цельсия. Данные, приведенные в верхней строке, обновляются каждые 6 секунд. Вывод новых данных сопровождается вспышкой светодиода, расположенного над индикатором.

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

Барометр предназначен для работы в сухом отапливаемом помещении при температуре 0...40 °C и атмосферном давлении 600...825 мм рт. ст.

Точность измерения давления и температуры полностью определяется точностью использованного датчика давления BMP180 фирмы Bosch. Типовая погрешность измерения давления составляет -1hPa, что примерно соответствует 0.75 мм.рт.ст. Шумовая составляющая при измерении давления - 0.02 hPa (0.015 мм.рт.ст.). Типовая погрешность измерения температуры вблизи значения 25 °C составляет +/- 0.5°C. Более детально с техническими характеристиками датчика BMP180 можно ознакомиться по тех. описанию, находящемуся в приложении.

Интервалы времени в данном устройстве отсчитываются программно. Погрешность формирования этих интервалов, измеренная автором, не превышает одной минуты за 10 часов.

Схема барометра приведена на рисунке.

Основным элементом устройства является модуль Arduino Nano. Автор использовал 3-ю версию с микроконтроллером ATmega 328. Память модуля в данном случае занята только на треть, по этому возможно применение модуля Arduino Nano с микроконтроллером ATmega 168.

Дисплей Winstar WH1602L - двухстрочный на 16 знакомест в каждой строке. Его основой является контроллер HD44780. Резистор R2 позволяет подстроить контрастность изображения. Если напряжение на выводе 3 (Vo) будет сильно отличаться от оптимального, то на дисплее совсем не будет видно никакого изображения. Это обстоятельство необходимо учитывать при первом включении устройства. Для экземпляра дисплея, используемого автором, оптимальным оказалось напряжение на выводе 3 около 1 В. Резистор R3 определяет величину тока светодиодов подсветки.

Датчик давления BMP180 имеет металлический корпус размером 3.6х3.6x1 мм. Выводы его представляют собой контактные площадки, расположенные на дне корпуса. Кроме того датчик требует питания 1.8 - 3.6 В. Уровни сигналов, которыми датчик обменивается с внешним устройством, также отличаются от требуемых. Эти обстоятельства затрудняют непосредственное использование BMP180. К счастью данная проблема легко решается. В продаже имеются модули на основе датчиков BMP180, в состав которых входят сами датчики и все согласующие элементы. Эти модули представляют собой плату размером 10x13 мм. Их стоимость - примерно 1.4 USD. Внешний вид модуля представлен на следующей фотографии.

Светодиод HL1 вспыхивает каждые 6 секунд сигнализируя о том, что на табло барометра выведены новые результаты. Автор использовал зелёный светодиод диаметром 3 мм L-1154GT фирмы Kingbright.
Конденсатор C1 имеет довольно большую ёмкость, что делает устройство нечувствительным к кратковременным сбоям питания. Если это не требуется, то C1 можно уменьшить до 500 микрофарад.
Диод D1 отключает подсветку индикатора при сбоях питания. Это увеличивает время автономной работы барометра от энергии, запасённой в конденсаторе C1.

Устройство можно питать от любого источника постоянного тока (зарядного устройство сотового телефона, блока питания какого-либо гаджета и т.п.) с выходным напряжением 8...12 В. При напряжении 9 В барометр потребляет около 80 mA.

Устройство собрано на макетной плате размером 85 х 55 мм, которая прикреплена к дисплею с помощью пластины из оргстекла.

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

Скетч, который нужно прошить в память модуля Arduino Nano, представлен в приложении. Автор использовал среду Arduino IDE 1.8.1. Для поддержки датчика давления требуется установить библиотеку Adafruit-BMP085. Соответствующий файл имеется в приложении.

Перед загрузкой скетча в строке 17 следует вместо числа 740.0, которое соответствует среднему давлению в месте установки авторского экземпляра барометра, вписать среднее давление в мм. рт. ст. , соответствующее тому месту, где будет установлен Ваш барометр. В первом приближении этот параметр можно определить по формуле Рср = 760 - 0.091h, где h -высота над уровнем моря в метрах. Высоту проще всего определить с помощью GPS навигатора.

Данная формула не учитывает многие факторы, влияющие на атмосферное давление и применима только для высот до 500 м. Описание способов более точного определения среднего давления выходит за рамки данной публикации. С ними можно ознакомиться по многочисленным материалам посвящённым метеорологии, которые имеются в интернете.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
A1 Модуль с датчиком BMP180 1 В блокнот
A2 Плата Arduino

Arduino Nano 3.0

1 В блокнот
VD1 Выпрямительный диод

1N4007

1 В блокнот
HG1 LCD-дисплей WH1602L 1 Winstar В блокнот
HL1 Светодиод L-1154GT 1 Kingbright В блокнот
С1 Электролитический конденсатор 4700 мкФ х 16 В 1

Лучшие статьи по теме