Андрей Смирнов
Время чтения: ~17 мин.
Просмотров: 3

Автоматизация измерения давления, датчик (сравнение, ардуинство)

Wholesale-Water-pressure-sensor-Gas-pressure-sensor-G-1-4-0-0-5-mpa.jpg

  • Цена: $18.50

Данная штука измеряет давление и отдает его в виде напряжения. Мы уже смотрели стрелочный прибор, сейчас будет более продвинутая версия. Кому интересны электронные штуки прошу под кат. Будет немного математики, анализ прибора, ардуинство и прототип готового устройства. Совсем недавно я делал обзор стрелочного прибора для измерения давления (манометра — как многие заметили в комментариях). Как ни странно, наибольший интерес там вызвал гель для придания герметичности резьбовым соединениям, кого это интересует можете почитать там ). Стрелочный прибор конечно хорошо, он показывает броски давления, легко глазом воспринимаются значения, к тому же, у прибора из прошлого обзора имеется крупный циферблат, но… лет 20 назад мы бы наверно на этом и остановились… а сейчас многие стараются автоматизировать рутинные процессы и доступность электроники всячески этому способствует. Поэтому предметом обзора стало устройство преобразующее давление в напряжение, которое легко подается оцифровке и последующему анализу, многие процессы нуждаются в таких действиях, поэтому, думаю тема интересная. Я заказал два прибора (курс был не такой конечно), на 5 атмосфер (как и стрелочный прибор из прошлого обзора) пришли в конверте с пупыркой, фотоcc7f83.jpg Размеры:

Как видно на фото, прибор имеет гнездо куда подключен разъем с проводком, разъем герметичен благодаря прокладке. Продавец клянется что прибор подходит как для воды так и для газа. Первым делом обжимаем кончики проводков, обжимкой из этого моего обзора. Так будет проще с ним работать на этапе тестов.6a28c6.jpg Особых примечательностей снаружи нет, соответственно переходим к электрическим измерениям. Кабель от прибора содержит 3 проводка: красный (питание +5 В), черный (земля) и желтый — собственно сигнал в виде напряжения. Подав питание, измерим ток потребления: Для дальнейших измерений потребукется источник давления, с возможностью регулировки. На эту роль любезно согласилась компрессорная станция: Я уже писал, что один выход станции имеет редуктор с манометром, позволяющий менять выходное давление от 0 до 8 атмосфер — вот он нам и нужен. Собираем нехитрый стенд из предмета обзора, макетной платы с источником питания, вольтметром и проводками. Без давления на выходе прибора 0.5 В. Попробовал дунуть в него 🙂 вольтметр показал слабые возможности моего дыхательного аппарата — 0,67 В, но главное прибор реагирует. Включаем компрессор и пару минут наслаждаемся неслабым звуком его двигателя. Далее собственно измерения, тут лучше показать чем говорить:
При чуть больше чем 5 атмосфер, показывает 5,05 В и выше показания не меняются, 8 атмосфер выдержал спокойно. Видим что продавец слегка слукавил — у него на странице немного другие значения, в частности верхнее он обещает 4.5 а по факту 5.05. Но ничего, мы выведем это дело на чистую воду. В целом ясно что прибор работает… На этом можно заканчивать обзор, но… так ведь скучно, правда? Не всем понятно, как это использовать, к тому же, многие муськовчане ждут своих халявных ардуин по распродаже… В общем, соберем макет реального прибора. Исходные данные: 0 атмосфер — 0.5 В, 5 атмосфер — 5 вольт. А теперь нужно получить функцию зависимости атмосфер от вольт. Все помнят школьный курс геометрии? Как построить прямую по двум точкам? Оставлю этот вопрос для проработки читателям, в комментах проставим оценки :). Итоговое уравнение: -4.5x + 5y — 2.5 = 0 x = 1.111 y — 0.555 где — x — давление, у — напряжение на выходе прибора Возьмем Arduino Nano, покомпактней (чтоб таскать в сарай на свидание к компрессору 🙂 ). Еще нам нужен показометр, чтоб все визуально оценить! (конечно, на самом деле, мне не хотелось тащить ноутбук в сарай), показометр нам вполне подойдет из обзора про температуру в бане (естественно, я не вынимал тот из стены, я заказал их 4 или 5 уже не помню… штука нужная). Подключаем индикатор на 3,4,5 пины Nano, а наш заветный прибор на аналоговый вход a1. Кстати, китаец там что-то писал про цифровое измерение, меня это немного напрягло до получения прибора, так как боялся получить кирпич с непонятным протоколом, но оказалось все проще. Эх… у Nano только один выход 5В придется прибегнуть к помощи макетной платы, ну и ладно. Результат в виде макета: Вроде все хорошо, но наше решение программное, соответственно нужен скетч, конечно я долго и тщательно его писал и отлаживал, аж целых 10 минут. Поэтому давление на космических объектах данным программным обеспечением измеряйте с осторожностью. Вот код (кота в этот раз не будет 🙂 ). Там есть еще один нюанс — аналоговый вход дает значение от 0 до 1024, соответственно нам нужно помножить результат на 5 и поделить на 1024, что и проделано в скетче. Прибор работает в режиме покоя показывая то 0.00, то 0.0.1, то -0.00 — нас все эти результаты устраивают… Дунем в него — 0.21 атмосферы… ну и ладно главное, что реагирует. Топаем со всем этим хозяйством в сарай. Вот тут картинки интереснее чем при прошлых измерениях (местами почему-то шкала манометра засветилась, но фоток с ним достаточно и, думаю, всем все будет понятно):
В целом прибор годный, измерения проводит, результаты очень близки к показаниям манометра. Конечно, имея значения в ардуино — легко их передать по сети или обработать, даже в моих обзорах такое не раз проделывалось. Я планирую интегрировать его в водопроводную систему для мониторинга, настройки реле и давлений гидроаккумуляторов (ну может еще чего 🙂 ). Всем спасибо, надеюсь кому-то поможет сделать свою жизнь более комфортной, ну или хотя бы немного повеселило в процессе чтения. Все покупалось на свои деньги, для конкретных целей.Пес мой обиделся за картинку в прошлом обзоре, поэтому теперь так 🙂

Датчики атмосферного давления 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 соединение. Для программирования можно использовать одну из готовых бесплатных библиотек.

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

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

1bar.jpg

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

GIA_13_22.png

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

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

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

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

box.jpg

Датчики BMP085 и BMP180

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

pres_bmp180.jpg

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

  • диапазон измеряемых значений: от 300 гПа до 1100 гПа  (от -500м от +9000м над уровнем моря);
  • уровень шума: 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_схема.png

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

bmp180_bb-1024x764.png

Программа

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

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

#include  #include <wire_bmp180 pressure="" void="" setup="" serial.begin="" pressure.begin="" loop="" double="" p="" serial.println="" delay="" getpressure="" char="" status="" t="" if="" return="">

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

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

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

for.jpg

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

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

#include  #include <wire>  SF80 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(){     ... }</wire>

Я не стал полностью копировать функцию 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> #include ire>  SFE_BMPessure; 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(){     ... }</serialflow>

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

main-1024x600.jpg

Заключение

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

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

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

1+Используемые источники:

  • https://mysku.ru/blog/aliexpress/33748.html
  • https://arduinomaster.ru/datchiki-arduino/datchiki-atmosfernogo-davleniya-bmp280-bmp180-bme280/
  • https://robotclass.ru/tutorials/arduino-pressure-sensor-bmp180-bmp085/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации