Электрификация

Справочник домашнего мастера

Bmp180 arduino подключение

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

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

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

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

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

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

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

Датчики BMP085 и BMP180

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

Немного важных характеристик 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_Breakout_Arduino_Library

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

#include <SFE_BMP180.h> #include <Wire.h> 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); }

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

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

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

#include <SFE_BMP180.h> #include <Wire.h> 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 <SerialFlow.h> #include <SFE_BMP180.h> #include <Wire.h> 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(){ … }

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

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

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

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

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

Обзор модуля атмосферного давления BMP280

Модуль представляет из себя высокоточный цифровой измеритель атмосферного давления на базе микро-чипа BMP280 от фирмы BOSH. После изготовления каждый датчик проходит индивидуальную калибровку в заводских условиях. Его малые размеры, низкое энергопотребление и высокая измерительная способность позволили завоевать популярность среди множества разработчиков Arduino-проектов. Модуль BMP280 был разработан фирмой как более технологичная модель своего предшественника BMP180. Данная модификация, в отличие от своего младшего брата, предоставляет пользователю целых 2 последовательных интерфейса обмена данными (SPI и I2C), а также 3 режима работы:

  • NORMAL – в данном режиме модуль просыпается с определённой периодичностью, выполняет необходимые измерения и снова засыпает. Частота измерений задаётся программным путём, а результат считывается при необходимости.

  • SLEEP – режим максимально пониженного энергопотребления.

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

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

Рисунок №1 — внешний вид и схема модуля BMP280

Как видно из вышеприведенной схемы на модуле предусмотрены конденсаторы для фильтрации по питанию и подтягивающие резисторы интерфейсов ввода/вывода.

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

К основным техническим характеристикам можно отнести следующие:

  • Напряжение питания: 1.71V – 3.6V;

  • Интерфейс обмена данными: I2C или SPI;

  • Ток потребления в рабочем режиме: 2.7uA при частоте опроса 1 Гц;

  • Диапазон измерения атмосферного давления: 300hPa – 1100hPa (±0.12hPa), что эквивалентно диапазону от -500 до 9000 м над уровнем моря;

  • Диапазон измерения температуры: -40°С … +85°С (±0.01°С);

  • Максимальная частота работы интерфейса I2C: 3.4MHz;

  • Максимальная частота работы интерфейса SPI: 10 МГц;

  • Размер модуля: 21 х 18 мм;

Подключение BMP280 к плате Arduino

Как упоминалось выше, модуль BMP280 может быть подключен к плате Arduino посредствам двух интерфейсов I2C или SPI. Какой выбрать — каждый решает сам исходя из возможностей используемого микроконтроллера и специфики проекта. На рисунке №2 показан вариант подключения датчика к плате Arduino Nano по I2C.

Рисунок №2 — подключение BMP280 по I2C-интерфейсу

Как известно, аппаратный интерфейс I2C у Arduino UNO, Nano, Mini и.т.п. расположен на пинах A4 (SDA) и A5 (SCL). Следовательно, в таком режиме обмена данными понадобиться всего 4 провода, два из которых используются для питания модуля, а два других — непосредственно как информационная шина. Для работы по SPI требуется немного больше проводов — целых 6 штук и подключать их необходимо согласно схемы на рисунке №3.

Рисунок №3 — подключение BMP280 по SPI-интерфейсу

Вышеприведенная схема подключения составлена согласно расположению аппаратного интерфейса SPI на платах Arduino UNO, Nano, Mini и.т.п. Исключением является вывод CSB модуля BMP280. В данной схеме он подключен к 10-му пину Arduino, но может быть соединён с любым цифровым выводом, указанным при составлении программы.

Как правило, для BMP280 в Интернете можно найти с десяток библиотек, упрощающих работу с ним. Библиотека Adafruit_BMP280.h позволяет максимально сократить время на освоение данного модуля, не урезая его функционал. Методы библиотеки дают возможность пользователю выбрать способ подключения, а также настроить периодичность и точность измерений в зависимости от режимов работы. Ниже будут рассмотрены некоторые приёмы работы с данной библиотекой.

Итак, для того чтобы начать работу с BMP280 необходимо установить вышеуказанную библиотеку, подключить сам заголовочный файл Adafruit_BMP280.h, а также ещё два файла Wire.h и SPI.h, для доступа к необходимым интерфейсам.

#include <Wire.h> // Библиотека для работы с шиной I2C

#include <SPI.h> // Библиотека для работы с шиной SPI

#include <Adafruit_BMP280.h> // Библиотека для работы с датчиком BMP280

Далее должен быть создан экземпляр класса Adafruit_BMP280, через который можно получить доступ ко всем функциям датчика атмосферного давления. Экземпляр может быть создан тремя разными способами в зависимости от типа подключения модуля, а именно:

// Для подключения по шине I2C

Adafruit_BMP280 bmp;

// Для подключения по аппаратному SPI (указываем только номер пина CS)

#define PIN_CS 10

Adafruit_BMP280 bmp(PIN_CS);

// Для подключения по программному SPI (указываем все пины интерфейса)

#define PIN_SCK 13

#define PIN_MISO 12

#define PIN_MOSI 11

#define PIN_CS 10

Adafruit_BMP280 bmp(PIN_CS, PIN_MOSI, PIN_MISO, PIN_SCK);

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

Теперь через объект bmp мы имеем возможность работать с функциями библиотеки, но изначально необходимо инициализировать модуль. Делать это целесообразно внутри функции setup() перед основным циклом:

void setup() {

Serial.begin(9600); // Для вывода отладочной информации в терминал

if(!bmp.begin()) { // Если датчик BMP280 не найден

Serial.println(“BMP280 SENSOR ERROR”); // Выводим сообщение об ошибке

while(1); // Переходим в бесконечный цикл

}

}

Таким образом при выводе сообщения об ошибке следует проверить правильность подключения и соответствие его используемому интерфейсу. При успешной инициализации можно переходить к настройке самой микросхемы BMP280. Для этих целей в библиотеке предусмотрена функция setSampling(…), с помощью которой задаётся режим работы модуля, точность измерения атмосферного давления и температуры окружающей среды, степень фильтрации и период активности датчика. Ниже приведён пример настроек, заданных по умолчанию.

bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, // Режим работы

Adafruit_BMP280::SAMPLING_X2, // Точность изм. температуры

Adafruit_BMP280::SAMPLING_X16, // Точность изм. давления

Adafruit_BMP280::FILTER_X16, // Уровень фильтрации

Adafruit_BMP280::STANDBY_MS_500); // Период просыпания, мСек

Рассмотрим подробнее данную функцию. Её первый параметр отвечает за режим работы датчика. Всего доступно 4 варианта, а именно:

  • MODE_NORMAL – в данном режиме модуль циклически выходит из режима сна через установленный интервал времени. В активном состоянии он проводит измерения, сохраняет их в своей памяти и заново уходит в сон.

  • MODE_FORCED – в этом режиме датчик проводит измерения при получении команды от Arduino, после чего возвращается в состояние сна.

  • MODE_SLEEP – режим сна или пониженного энергопотребления.

  • MODE_SOFT_RESET_CODE – сброс на заводские настройки.

Второй и третий параметры отвечают за точность измерения температуры и атмосферного давления соответственно. Они могут принимать следующие значения:

  • SAMPLING_NONE — минимальная точность;

  • SAMPLING_X1 – точность АЦП 16 бит;

  • SAMPLING_X2 – точность АЦП 17 бит;

  • SAMPLING_X4 – точность АЦП 18 бит;

  • SAMPLING_X8 – точность АЦП 19 бит;

  • SAMPLING_X16 – точность АЦП 20 бит.

Четвёртый параметр отвечает за уровень фильтрации измеренных данных. Значения этого параметра могут быть следующие:

  • FILTER_OFF – фильтр выключен;

  • FILTER_X2 – минимальный уровень фильтрации;

  • FILTER_X16 – максимальный уровень фильтрации.

Последний, пятый параметр функции setSampling(…) отвечает за период перехода модуля в активное состояние с целью выполнения измерений. Параметр может принимать следующие значения:

  • STANDBY_MS_1 – модуль просыпается каждую миллисекунду;

  • STANDBY_MS_63 – модуль просыпается каждые 63 миллисекунды;

  • STANDBY_MS_125 – модуль просыпается каждых 125 миллисекунд;

  • STANDBY_MS_250 – модуль просыпается каждых 250 миллисекунд;

  • STANDBY_MS_500 – модуль просыпается каждых 500 миллисекунд;

  • STANDBY_MS_1000 – модуль просыпается каждую секунду;

  • STANDBY_MS_2000 – модуль просыпается каждые 2 секунды;

  • STANDBY_MS_4000 – модуль просыпается каждых 4 секунды;

На этом стадию настройки параметров датчика BMP280 можно считать завершённой. Библиотека Adafruit_BMP280 предоставляет пользователю три функции, с помощью которых можно считать показания температуры, атмосферного давления и высоты над уровнем моря. Ниже приведён фрагмент программного кода, с помощью которого эти данные выводятся в окно терминала. Считывание происходит в основном цикле loop().

void loop() {

// Выводим значение температуры

Serial.print(F(«Temperature = «));

Serial.print(bmp.readTemperature()); // Функция измерения температуры

Serial.println(» *C»);

// Выводим значение атмосферного давления

Serial.print(F(«Pressure = «));

Serial.print(bmp.readPressure()); // Функция измерения атм. давления

Serial.println(» Pa»);

// Выводим значение высоты

Serial.print(F(«Approx altitude = «));

Serial.print(bmp.readAltitude(1013.25)); // Функция измерения высоты

Serial.println(» m»);

}

Следует пару слов сказать о функции bmp.readAltitude(1013.25) и откуда берётся число 1013.25. Это значение давления над уровнем моря конкретной локации, где находится в данный момент датчик. Параметр задаётся в сотнях Ра. Он уникален для каждой местности и по своей сути является отправной точкой или калибровочной константой для корректного измерения высоты. Такой подход обусловлен специфическим алгоритмом вычисления, который построен на принципе фиксации уменьшения атмосферного давления с ростом высоты и наоборот. В любом случае данную константу можно подсмотреть в Интернете на одном из профильных сайтов. Результат вывода значений в терминал показан на рисунке №4.

Рисунок №4 — результат чтения данных с модуля BMP280

Как видно из рисунка, давление выводится в Паскалях, что для восприятия не очень удобно. Гораздо привычнее получать значения в миллиметрах ртутного столба. Как известно 1Ра = 0,00750062 мм. рт. ст., следовательно необходимо полученное с помощью функции readPressure() значение умножить на 0,00750062.

ОБРАТИТЕ ВНИМАНИЕ!!! Может возникнуть такая ситуация, при которой модуль не будет определяться при подключении его по шине I2C. Дело в том, что каждое устройство на этой шине должно иметь свой уникальный адрес. Данная серия модулей в зависимости от модификации может иметь адреса 0x77 или 0x76. Библиотека Adafruit_BMP280.h использует по умолчанию адрес 0х77. Чтобы изменить его на 0х76 необходимо открыть файл Adafruit_BMP280.h установленной библиотеки любым текстовым редактором и найти там нижеследующую строку:

#define BMP280_ADDRESS (0x77) /**< The default I2C address for the sensor. */

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

Пример использования BMP280

Существует несколько направлений применения модулей BMP280. Кто-то использует их в составе полётных контроллеров для определения высоты или в качестве глубиномера, например при погружении в шахту. Но основным направлением является сбор данных для метеостанций. Для более тесного знакомства с модулем, создадим свой проект домашней метеостанции с выводом погодной информации на графический ЖКИ-дисплей от NOKIA 5110. Чтобы сделать проект интереснее, внизу будет выводится график изменения атмосферного давления. Такой подход позволит спрогнозировать приближение дождя по резкому падению давления или хорошую погоду по его динамическому возрастанию. Управлять всем этим будет плата Arduino Nano. На рисунке №5 приведена схема проекта домашней метеостанции.

Рисунок №5 – схема метеостанции

В схеме для запитывания экрана и его подсветки использован модуль линейного стабилизатора напряжения AMS1117-3V3. Это позволит уберечь Arduino Nano от перегрузок. Также потребуется скачать две дополнительные библиотеки для работы с дисплеем, а именно:

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

// Подключаем библиотеки для работы с дисплеем NOKIA 5110

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_PCD8544.h>

// Номара выводов Arduino для подключения димплея

#define PIN_5110_SCLK 3

#define PIN_5110_DIN 4

#define PIN_5110_DC 5

#define PIN_5110_CS 6

#define PIN_5110_RST 7

Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_5110_SCLK, PIN_5110_DIN,

PIN_5110_DC, PIN_5110_CS, PIN_5110_RST);

// Подключаем библиотеки для работы с датчиком BMP280

#include <Wire.h>

#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

uint8_t pp; // Массив значений атм. давления для вывода графика

uint8_t index = 0; // Текущий индекс (точка на графике)

void setup() {

display.begin(); // Инициализация дисплея

display.setContrast(45); // Настройка контрасности

display.display(); // Подготовка к выводу изображения

delay(2000);

display.clearDisplay(); // Очистка дисплея

bmp.begin(); // Инициализация датчика BMP280

// Настройка режима работы датчика BMP280

bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,

Adafruit_BMP280::SAMPLING_X2,

Adafruit_BMP280::SAMPLING_X16,

Adafruit_BMP280::FILTER_X16,

Adafruit_BMP280::STANDBY_MS_500);

for(uint8_t i = 0; i < 84; i++) pp = 0; // Обнуляем массив

}

void loop() {

// Считываем и выводим показания температуры

float t = bmp.readTemperature();

display.setTextSize(1); display.setCursor(0, 0);

display.print(«t=»); display.print(t); display.println(«oC»);

// Считываем и выводим показания высоты

float a = bmp.readAltitude(1005);

display.setCursor(0, 8);

display.print(«h=»); display.print(a); display.println(«m»);

// Считываем и выводим показания атмосверного давления

float p = bmp.readPressure();

p = p * 0.00750062; // Преобразуем Паскали в мм.рт.ст.

display.setCursor(0, 16);

display.print(«p=»); display.print(p); display.println(«mmGh»);

// Преобразуем показания для построения графика

pp = map(p, 730, 760, 0, 24);

// Строим график

index++;

if(index > 83) {

for(uint8_t i = 0; i < 84; i++) pp = 0;

index = 0;

}

display.fillRoundRect(0, 24, 84, 24, 0, WHITE);

for(uint8_t i = 0; i < 84; i++)

display.drawLine(i, 48, i, 48 — pp, BLACK);

display.display();

delay(60000); // График будет обновляться 1 раз в минуту

display.clearDisplay();

}

На рисунке №6 показан результат работы программы.

Рисунок №6 – метеостанция в работе

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

FAQ. Часто задаваемые вопросы

1. Подключаю датчик по шине I2C, заливаю тестовый скетч из библиотеки Adafruit_BMP280.h, но датчик не обнаруживается. В чём может быть причина?

Большинство датчиков BMP280 имеют адрес 0х76, а библиотека Adafruit_BMP280.h по умолчанию работает с адресом 0х77. Чтобы это исправить необходимо открыть файл Adafruit_BMP280.h любым текстовым редактором, найти строку вида:

#define BMP280_ADDRESS (0x77) /**< The default I2C address for the sensor. */

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

2. Чем отличается датчик BMP280 от аналогичного BMЕ280?

  • В датчике BMЕ280 дополнительно есть функция измерения влажности.

3. От чего зависти точность определения высоты?

  • Точность определения высоты напрямую зависит от знания текущего атмосферного давления над уровнем моря для той местности, где используется датчик. Это значение изо дня в день может меняться ввиду различных погодных условий. За вычисление высоты отвечает функция readAltitude(….), параметром которой как раз и является искомое число.

Обзор датчика давления BMP180 (BMP080)

Датчик BMP180 (3.3В, GY-68) — является недорогим и простым в использовании сенсорным датчиком, позволяющий измерить атмосферное давления и температуру окружающей среды. Используют данный датчик для определения высоты (чем выше, тем меньше давление), а так же в самодельных метеостанциях.

Технические параметры

► Напряжение питания: 3.3 В – 5 В
► Рабочий ток: 0.5 мA
► Диапазон измеряемого давления: 300 гПа – 1100 гПа
► Интерфейс: I2C
► Время срабатывания: 4.5 мс.
► Точность измерения давления: 0,1 гектопаскаль;
► Точность измерения температуры: 0,1°С;
► Габариты: 15 мм х 14 мм

Общие сведения

Рассмотрим модуль поближе, в левой части расположен сам сенсорный датчик BMP180 фирмы Bosch. Так как датчик BMP 180, работает от 3.3В (а почти все платы Arduino работают на 5В), на плате предусмотрен стабилизатор напряжения XC6206P332MR в корпус SOT-23, который выдает на выходе напряжение в 3.3В, рядом установлена обвязка стабилизатора, состоящая из двух керамических конденсаторов на 1 мкФ. Подключение осуществляется по интерфейсу I2C, линии SCL и SDA выведены на группу контактов на другой стороне модуля, туда же выведено и питание. Последние два резистора на 4.7 кОм, необходимы подтяжки линии SCL и SDA к питанию, конечно при необходимости их можно выпаять, если используете несколько устройств на I2C линии.

Назначение контактов:
► SCL — линия тактирования (Serial CLock)
► SDA — линия данных (Serial Data)
► VCC — «+» питание
► GND — «-» питание

Принципиальная схема датчика BMP180, показана ниже.

Подключение датчика давления BMP180 к Arduino

Подключение:
В данном примере используем датчик BMP 180 и плату Arduino UNO R3, все получение показание отправлять в «Serial порт», принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате arduino предусмотрено только два вывода A4 и A5, другие вывода не поддерживают I2C, так что учтите при проектирование.

Теперь, о программной части, для нашего удобства разработана библиотека BMP180 Breakout Arduino Library v.1.1.2, которая позволяет упросить работу с датчиком, скачиваем и устанавливаем ее, кстати датчик BMP180 и BMP080 похожи, включая и команды, так что библиотека у них одна.

Загружаем скетч в плату arduino и если все правильно подключено, в окне мониторинг порта, можно увидеть температуру и атмосферное давление.

Ссылки
Библиотека BMP180 Breakout v.1.1.2

Купить на Aliexpress
Контроллер Arduino UNO R3
Барометрический датчик давления BMP180 (3.3В, GY-68)
Комплект проводов DuPont, 2,54 мм, 20 см

Купить в Самаре и области
Купить контроллер Arduino UNO R3
Купить Барометрический датчик давления BMP180 (3.3В, GY-68)
Купить комплект проводов DuPont, 2,54 мм, 20 см

Библиотека iarduino_Pressure_BMP для датчиков давления и температуры BMP180 / BMP280

Библиотека iarduino_Pressure_BMP позволяет считывать температуру окружающей среды и атмосферное давление с датчиков BMP180 и BMP280, а так же рассчитывать высоту.
Преимуществом данной библиотеки является: возможность заменять датчики BMP180 / BMP280 без изменения скетча и схемы включения; она позволяет выбирать режим точности показаний (значение передискретизации) и единицы измерения выводимого давления (Па или мм.рт.ст.); для расчёта высоты, ей не нужно указывать давление над уровнем моря, а достаточно указать любую начальную высоту в качестве аргумента функции begin(). Если вы указали 0 метров (значение по умолчанию), то подняв модуль на 10 метров — получите результат +10, а опустив на 10 метров — получите результат -10. Если в качестве аргумента функции brgin() указать текущую высоту над уровнем моря, то все остальные значения высоты будут соответствовать действительной высоте над уровнем моря.

Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C.
О том как выбрать тип шины I2C рассказано в статье Wiki — расширенные возможности библиотек iarduino для шины I2C.

Назначение функций и переменных:

Подробное описание работы с библиотекой, находится в разделе Trema-модуль датчик давления.

Функция begin( ); // Инициализация работы BMP датчика (с указанием его начальной высоты).

Функция read( ); // Чтение показаний датчика (с выбором единицы измерения давления).

Функция measurement( ЦИФРА ); // Выбор точности измерений (подавление шума).

Переменная temperature // Возвращает температуру окружающей среды в °С.

Переменная pressure // Возвращает атмосферное давление в мм.рт.ст. или Па.

Переменная altitude // Возвращает высоту относительно начальной в м.

Переменная type // Возвращает тип датчика: 180 или 280.

Переменная version // Возвращает версию прошивки датчика.

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

Принцип действия барометра на BMP280, BMP180, BME280

Барометр – устройство, измеряющее атмосферное давление. Электронные барометры используются в робототехнике и различных электронных устройствах. Наиболее распространенными и доступными являются датчики давления от фирмы 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 соединение. Для программирования можно использовать одну из готовых бесплатных библиотек.

В этом уроке мы будем разрабатывать барометрическую систему измерения давления с использованием BMP180 и ARDUINO. Прежде всего для взаимодействия BMP180 с ARDUINO, нам необходимо загрузить библиотеку, специально разработанную для BMP180. Эта библиотека доступна по адресу: https://github.com/adafruit/Adafruit-BMP085-Library После присоединения этой библиотеки мы можем вызвать специальные функции, которые облегчат работу с датчиком BMP180.

Необходимые компоненты
Плата Arduino Uno, соединительные проводники, резистор 220Ω, датчик BMP180, 16×2 LCD, макетная плата.

Схема подключения и принцип работы
После вызова заголовка (“include”) нам не нужно беспокоиться об установлении связи между Arduino Uno и датчиком BMP180. Мы можем просто вызвать специальные функции, которые сделают это для нас. Нам нужно только инициализировать ЖК-дисплей и отобразить вызываемые значения из SENSOR на нем.

В 16×2 ЖК-дисплеях есть 16 контактов, если есть подсветка и 14 контактов, если подсветки нет. Можно включить или выключить подсветку по желанию. Теперь в 14 выводах имеется 8 контактов данных (7-14 или D0-D7), 2 контакта питания (1 и 2 или VSS и VDD или GND и + 5v), 3-й контакт для управления контрастом (VEE – определяет, насколько толстые символы должны отображаться) и 3 управляющих контакта (RS, RW, E).

В схеме вы можно заметить, что я взял только два контрольных контакта, бит контраста и READ/WRITE не часто используются, поэтому их можно закоротить на землю. Это делает ЖК-дисплей максимально контрастным и читаемым. Нам просто нужно управлять контактами ENABLE и RS для отправки символов и данных соответственно.

Соединения, которые выполняются для ЖК-дисплея, приведены ниже:
PIN1 или VSS к ground
PIN2 или VDD или VCC к +5v питания
PIN3 или VEE к ground (дает максимальный контраст, лучше всего для новичка)
PIN4 или RS (Register Selection) к PIN8 ARDUINO UNO
PIN5 или RW (Read/Write) к ground (ставит ЖК-дисплей в режим чтения, облегчает связь для пользователя)
PIN6 или E (Enable) к PIN9 ARDUINO UNO
PIN11 или D4 к PIN10 ARDUINO UNO
PIN12 или D5 к PIN11 ARDUINO UNO
PIN13 или D6 к PIN12 ARDUINO UNO
PIN14 или D7 к PIN13 ARDUINO UNO
ARDUINO IDE позволяет пользователю использовать ЖК-дисплей в 4-битном режиме. Этот тип связи позволяет пользователю уменьшать использование выводов на ARDUINO, в отличие от других, ARDUINO не нужно программировать отдельно для использования в режиме 4, потому что по умолчанию ARDUINO настроен для связи в 4-битном режиме. В схеме вы можете видеть, что мы использовали 4-битную связь (D4-D7).

Поэтому из простого наблюдения из приведенной выше таблицы мы подключаем 6 контактов LCD к контроллеру, в котором 4 контакта являются выводами данных и 2 вывода для управления.

Для подключения BMP180 к Arduino Uno нам необходимо выполнить следующие действия:
1. #include <Adafruit_BMP085.h>
2. #include <Wire.h>
3. #include <LiquidCrystal.h>
4. Serial.begin(9600);
5. String PRESSUREVALUE = String(bmp.readPressure());
6. String TEMPARATUREVALUE = String(bmp.readTemperature());
Сначала нам нужно вызвать файл заголовка для включения специальных функций «#include <Adafruit_BMP085.h>».
С помощью этого заголовочного файла мы можем вызывать функции, которые могут считывать значения из датчика напрямую.
Теперь нам нужно включить связь C, это делается путем вызова заголовочного файла «#include <Wire.h>».
Мы можем читать давление, вызывая «String PRESSUREVALUE = String (bmp.readPressure ());». Здесь значение давления считывается с датчика и сохраняется в строке «PRESSUREVALUE».
Мы можем читать temparature, вызывая «String TEMPARATUREVALUE = String (bmp.readTemperature ());». Здесь значение давления будет считываться с датчика и хранится в строке «TEMPARATUREVALUE».

Сначала нам нужно включить заголовочный файл (‘#include <LiquidCrystal.h>’), этот заголовочный файл имеет инструкции, написанные в нем, что позволяет пользователю подключать ЖК-дисплей к UNO в 4-битном режиме. С этим заголовочным файлом нам не нужно посылать данные на ЖК-дисплей побитово и нам не нужно писать программу для посылки данных или команды на ЖК-дисплей.

В этой инструкции мы собираемся рассказать плате, где мы подключили контакты. Подключенные контакты должны быть представлены в виде «RS, En, D4, D5, D6, D7». Эти контакты должны быть представлены правильно. Так как мы подключили RS к PIN0 и т. д., Как показано на схеме, мы представляем номер контакта на плате как «LiquidCrystallcd (0,1,8,9,10,11);».

Как вы можете видеть, нам не нужно беспокоиться ни о чем другом, мы просто должны инициализировать, и UNO будет готова отображать данные. Нам не нужно писать программный цикл для отправки данных байт за байтом. После считывания значения от датчика мы отобразим их на ЖК-дисплее 16×2.

КОД:

Библиотека подключается в меню “Скетч” — “Подключить библиотеку” — “добавить .zip библиотеку”. В открывшемся окне выберите скачанный архив с библиотекой.

Прошивку можно скачать на github.

//файл с настройками сети и токеном бота #include «secrets.h» //подключение библиотек #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <TelegramBot.h> #include <SFE_BMP180.h> #include <Wire.h> //объявление бота и датчика WiFiClientSecure net_ssl; TelegramBot bot (BotToken, net_ssl); SFE_BMP180 pressure; void setup() { //подключение wifi, бота, датчика Serial.begin(9600); wifiConnect(); bot.begin(); pressure.begin(); } void loop() { //получение сообщения message m = bot.getUpdates(); //если запрос давления if (m.text.equals(«Pressure»)){ //то отправляем данные bot.sendMessage(m.chat_id, String(round(getPressure()))+» Pa»); } } //функция для подключения к wifi void wifiConnect(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(«.»); } Serial.println(«»); Serial.println(«WiFi connected»); Serial.println(WiFi.localIP()); } //функция для получения давления 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); } } } } } Демонстрация работающего устройства.Если вы заметили какие-то ошибки или что-то показалось непонятным, буду очень рад если напишите об этом в комментариях.

admin

Добавить комментарий

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

Наверх