Подключение датчика давления HX710B к Arduino
Автор: Сергей · Опубликовано 03.09.2022 · Обновлено 01.09.2022
На сайте уже есть несколько статьей про датчики давления, BME280 и BMP180. В этой статье расскажу, еще об одном датчик давления для Arduino, собранном на датчике MPS20N0040D и аналого-цифровом преобразователе HX710B. Модуль способен измерять давление воздуха от 0 до 40 кПа.
Технические параметры:
► Напряжение питания: 3.3 В — 5 В;
► Основные функции интегральных: MPS20N0040D-D и HX710B;
► Выход тип: цифровой;
► Диапазон измерения: 0 — 40 кпа;
► Размеры: 19 x 19 x 12 мм;
► Вес: 3 грамма.
Общие сведенья
Основан модуль на небольшом датчке давления MPS20N0040D имеющим всего 6 вводов. Датчик собран на основе тензодатчика, который прикреплен к диафрагме и при любом изменении давлении происходит изменение электрического сопротивления.
По схеме выше можно понять, что датчик MPS20N0040D собран по мосту Уитстона.
Чуть ниже, установлена микросхема HX710B, которая представляет собой 24-битный аналого-цифровой преобразователь (АЦП). По сути, данный модуль представляет собой тензодатчик и усилитель, о котором рассказывал раньше, в этой статье.
Назначение контактов:
► VIN, GND — Вывод источник питания;
► SCK — Тактовый вывод;
► OUT — Цифровой вывод.
Подключение датчика давления HX710B к Arduino
Необходимые детали:
► Контроллер Arduino UNO R3 x 1 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.
► Барометрический датчик давления 0-40 кПа HX710B x 1 шт.
Описание:
В примере покажу как подключить датчика давления HX710B к Arduino, все показания будем передавать в последовательный порт.
Подключение:
Из приведенной ниже принципиальной схемы можно увидеть, что мы используем всего четыре провода. Сначала подключаем вывода SCK и OUT к выводам D3 и D2, затем подключаем к VCC и GND к 5 В и GND.
Установка библиотеки:
Для работы датчиком HX710B необходимо установить библиотеку, для этого заходим на сайт скачиваем библиотеку и устанавливаем в среду разработки IDE (так же можно скачать в конце статьи)
Программа:
Схема и библиотека установлена, можно приступить к программой части. Открываем среду разработки Arduino IDE и копируем скетч ниже и загружаем его в Arduino UNO
Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino
Добавьте в свой следующий проект на Arduino возможность отслеживать состояние окружающей среды с помощью датчика BMP180.
Взаимодействие BMP180, датчика атмосферного давления и температуры, с Arduino
Это простой датчик, разработанный специально для измерения атмосферного давления, и он действительно полезен для двух вещей.
- По мере того, как мы поднимаемся от уровня моря до горной вершины, атмосферное давление снижается. Это означает, что, измеряя давление, мы можем определить высоту. Таким образом, мы можем использовать этот датчик в качестве альтиметра (высотомера).
- Поскольку атмосферное давление меняется в зависимости от погоды, мы можем использовать его для мониторинга изменений погоды.
Эти датчики довольно просты в использовании, предварительно откалиброваны и не требуют дополнительных компонентов, поэтому вы можете начать измерение атмосферного давления, высоты над уровнем моря и температуры воздуха в самые кратчайшие сроки.
Обзор железа
В основе модуля лежит цифровой датчик давления и температуры нового поколения производства Bosch – BMP180.
Чип BMP180
BMP180 может измерять атмосферное давление от 300 гПа до 1100 гПа (что соответствует высотам от 9000 до -500 метров над уровнем моря) и температуру от -40°C до 85°C с точностью ±1,0°C.
Рисунок 1 – Чип BMP180 на модуле
Измерения давления настолько точны (небольшой шум соответствует колебаниям высоты 0,25 м), что вы даже можете использовать его в качестве альтиметра с точностью ±1 метр.
Рисунок 2 – Технические характеристики датчика BMP180
Требования к питанию
Модуль поставляется со встроенным стабилизатором 3,3В LM6206, поэтому вы можете без проблем использовать его с микроконтроллером с логикой 5 В, например, с Arduino.
Рисунок 3 – Стабилизатор 3,3 В на модуле BMP180
BMP180 потребляет менее 1 мА во время измерений и только 5 мкА в режиме ожидания. Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием.
Интерфейс I2C
Модуль использует простой двухпроводной интерфейс I2C, поэтому его можно легко подключить к любому микроконтроллеру по вашему выбору.
Адрес на шине I2C данного модуля установлен аппаратно, он равен 0x77HEX.
Распиновка модуля BMP180
Модуль BMP180 имеет только 4 вывода, связывающих его с внешним миром. Назначение выводов показано ниже:
Рисунок 4 – Распиновка модуля BMP180
VIN – вывод для подключения источника питания для модуля, напряжение питания может находиться в диапазоне от 3,3 до 5 В.
GND подключается к выводу земля на Arduino
SCL – это вывод синхронизации для интерфейса I2C.
SDA – вывод данных для интерфейса I2C.
Подключение модуля BMP180 к Arduino
Давайте подключим модуль BMP180 к Arduino.
Подключение довольно простое. Начните с соединения выводов GND на модуле и на плате Arduino, затем подключите вывод VIN к выводу 5V на Arduino.
Теперь остаются выводы, которые используются для связи I2C. Обратите внимание, что у разных плат Arduino для I2C используются разные выводы. На платах Arduino с разводкой R3 SDA (линия передачи данных) и SCL (линия синхронизации) находятся на разъеме выводов рядом с выводом AREF. Они также известны как A5 (SCL) и A4 (SDA).
Если у вас Arduino Mega, выводы будут отличаться! Вам необходимо использовать цифровые выводы 21 (SCL) и 20 (SDA). В таблице ниже приведены выводы, использующиеся для I2C на разных платах Arduino.
SCL | SDA | |
---|---|---|
Arduino Uno | A5 | A4 |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Leonardo/Micro | 3 | 2 |
Следующая диаграмма показывает, как всё подключить.
Рисунок 5 – Подключение модуля BMP180 к Arduino
Установка необходимых библиотек
Расчет высоты и барометрического давления с помощью модуля BMP180 требует много математики. К счастью, была написана библиотека Adafruit BMP180, чтобы скрыть все сложности, и мы могли бы выполнять простые команды для считывания данных о температуре, атмосферном давлении и высоте.
Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управлять библиотеками…». Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Рисунок 6 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE
Отфильтруйте результаты поиска, набрав «bmp180». Там должно быть пара записей. Ищите библиотеку Adafruit BMP085 by Adafruit. Нажмите на эту запись, а затем выберите «Установка».
Рисунок 7 – Установка библиотеки Arduino BMP180
Код Arduino, чтение показаний температуры и атмосферного давления
Следующий скетч даст вам полное представление о том, как считывать с модуля BMP180 показания температуры и атмосферного давления, и может послужить основой для более практичных экспериментов и проектов.
Вот как выглядит вывод в мониторе последовательного порта.
Рисунок 8 – Вывод в мониторе последовательного порта
Каждое снижение давления на уровне моря на 1 гПа приводит к ошибке 8,5 м в расчетах высоты. Поэтому высота, которую мы получаем, достаточно близка, но не точна.
Вы можете получить более точное измерение высоты, если знаете текущее давление на уровне моря, которое будет зависеть от погоды.
Данный код предполагает, что текущее давление на уровне моря составляет 1013,25 миллибар, что равно 101325 Паскалям. Вот почему переменная seaLevelPressure_hPa установлена в 1013.25 .
Объяснение кода
Скетч начинается с включения двух библиотек, а именно Wire.h и Adafruit_BMP085.h .
Далее мы определяем переменную seaLevelPressure_hPa , необходимую для расчета высоты. Измените ее значение на текущее давление на уровне моря в вашем регионе.
Мы также создаем объект bmp , чтобы получить доступ к функциям, связанным с ним.
В функции setup() мы инициализируем последовательную связь с компьютером и вызываем функцию begin() .
Функция begin() инициализирует интерфейс I2C и проверяет правильность идентификатора чипа. Затем она программно перезапускает микросхему и ждет окончания калибровки датчика после запуска.
В функции основного цикла для считывания с модуля BMP180 показаний температуры, атмосферного давления и высоты мы используем следующие функции:
- функция readTemperature() возвращает от датчика температуру;
- функция readPressure() возвращает от датчика атмосферное давление;
- функция readAltitude(seaLevelPressure_hPa * 100) вычисляет высоту (в метрах) исходя из текущего атмосферного давления (в гПа);
- функция readSealevelPressure() вычисляет давление на уровне моря (в гПа).
Как подключить датчик давления к Ардуино
Конец двадцатого века был временем взрывного роста технологий, которое выразилось не сколько разработкой новых устройств, а скорее расширением возможностей привычных механизмов. Примером тут может служить обыденный выключатель света. Если раньше все его функции состояли в подаче тока и прекращению хода электричества к устройствам потребления, — теперь он может сообщать в конгломерат домашней техники, работающей в единой сети, о своем статусе, или менять состояние по удаленным командам.
Расширение функционала стало доступным за счет широкого использования микроконтроллеров. В своей основе — они представляют собой миниатюрные компьютеры, ориентированные на управление внешними устройствами в рамках своей программы и происходящих вокруг факторов. Информацию о последних логический модуль получает за счет специализированных датчиков.
Существует не так много моделей микроконтроллеров, служащих базой «умной» техники. Среди них определенной популярностью пользуется Arduino, в качестве достаточно универсальной основы создания интеллектуального оборудования. Своей известности микроконтроллер обязан не только быстродействием или удобством подключения внешних компонентов, но и широтой их моделей, представленной на рынке. Среди последних, богатый выбор сенсоров, устройств индикации, средств интерфейса и получения команд, сетевых и коммуникационных плат, а также управляющих внешней аппаратурой узлов.
Собственно, чувствительные элементы платформы и будут рассмотрены в теле статьи, а конкретно один из них — датчик давления Ардуино.
Что измеряет сенсор
Давление — некая физическая величина численно равная перпендикулярно направленной силе действующей на единицу площади поверхности. Сам датчик можно представить своеобразными очень чувствительными весами. Последнее замечание сделано по причине того, что и вода, и газы тоже имеют свою массу, которая влияет на поверхность под ними. На практике, за счет указанного фактора, можно определить глубину погружения (чем ниже, тем больше вес слоя воды) или высоту подъема в атмосферу (чем выше — тем меньше плотность, а значит и слабее воздействие). Кроме того, в отношении давления воздуха не стоит забывать о погодных колебаниях. Резкое падение названой характеристики атмосферы — к дождю или буре.
Опять же, насчет газов и частично жидкостей. Их можно сжимать. Но, уплотненные вещества будут стремиться вернуться в первоначальное состояние. И чем сильнее компрессия, тем мощнее будет конечное давление газа или жидкости внутри сосуда их содержащего.
Собственно, детектор Ардуино о котором идет речь, и измеряет силу воздействия на единицу площади сенсорного элемента прибора. Правда, в большинстве выпускаемых моделей, описанное — не все их функциональные возможности. Бонусом, у многих идет замер температуры окружающей среды, а у некоторых еще и влажности или ускорения.
Устройство
Суммарное количество чувствительных элементов датчика давления зависит от его модели. Главными остается пьезоэлементы, определяющие саму силу действия на свою плоскость. Физическая основа работы – возникновение электрического тока на внутренних кварцевых пластинах в результате их деформации при соприкосновении с влияющим фактором. В настоящем случае, о котором идет речь — газом или жидкостью.
Выработанное аналоговое напряжение идет в модуль АЦП преобразования, где его сила перекодируется в числовой вид и через интерфейсы датчика I2C и SPI отправляется на микроконтроллер. Библиотека функций, ориентированных на работу с конкретным сенсором, переводит полученные величины в понятный человеком вид, на основе единиц измерений давления в стандарте Си — Паскалях.
Все дополнительные измеряющие элементы конкретного устройства действуют похожим образом, конвертируя с помощью АЦП аналоговые значения в цифру, для последующей отправки их в Arduino.
Представленные на рынке модели
Датчики Arduino, относящиеся к давлению, делятся согласно средам применения и конструктивным особенностям, непосредственно связанным с получением конечного результата. Есть модели, защищенные от влаги и предназначенные для применения в жидкостях, другие работают только в качестве анероидов атмосферы, иные устанавливаются в разрыв движения потока, четвертые в качестве определителей внутреннего давления наполняющего емкость газа. Их всех объединяет наличие общих интерфейсов подключения к микроконтроллеру и низкое, не более нескольких милливатт (реже Ватт), потребление энергии.
Наименование | Питание (V) | Точность | Разрешение (hPa) | Диапазон (hPa) | Рабочая температура (°C) | Интерфейсы | Примечание | ||
---|---|---|---|---|---|---|---|---|---|
SPI | I2C | UEXT | |||||||
Атмосферные | |||||||||
MOD-BMP085 | 1.8–3.6 | 0.03 hPa | 0.01 | 300–1100 (от 500 м ниже уровня моря до 9 км. высоты | –40..+85 | + | + | Измерение температуры | |
GY-BMP280 | 3.3 | 0.12 hPa | 0.0016 | 300–1100 | –40..+85 | + | + | Измерение температуры до +65, с точностью 0.01 | |
MD-PS002 | 5V | ±0.2% | –100–+150 | –40..+125 | + | Только не агрессивные среды | |||
Жидкостные | |||||||||
MS5803-02BA | 1.8–3.6 | 20 см жидкости | 30–1100 (10–2000) | –40..+85 | + | + | |||
MS5803-07BA | 1.8–3.6 | 0–7 мбар (70 м погружения) | –20..+85 | + | + | ||||
Open-Smart 5V G1/4 0-1.2 MPa Hydraulic Pressure Sensor for Non-Corrosive Water | 5 | 1.5 % | 1–2.4 мбар (max 3) | 0..+85 | Собственный коннектор, соединяемый к I2C через резистор, датчик оснащен термометром |
Конечно, в приведенном списке числятся далеко не все существующие модели. В нем указаны только те, которые обладают определенной популярностью и затребованы пользователями.
Схемы подключения датчика давления жидкости
Среди множества схем, демонстрирующих работу Arduino с датчиком давления жидкости, была выбрана наиболее простая, использующая минимум радиодеталей. С ее помощью можно проводить измерение глубины погружения или уровня заполнения сосуда водой. Итак, понадобится:
Элемент | Наименование/характеристики | Количество |
---|---|---|
Микроконтроллер | Arduino Nano/Uno или любой клон | 1 |
Экран | Display 2×16 ST7032 | 1 |
Датчик | MS5803 | 1 |
Резистор | 10 кОм | 2 |
Конденсатор | 0.1 мкФ | 1 |
Кнопка | Любая, без фиксации нажатия | 1 |
Библиотека работы с датчиком давления берется здесь: https://github.com/millerlp/MS5803_05
С экраном тут: https://yadi.sk/d/KKJwJ1VtDx9PCw
Принципиальная схема
Кнопка нужна для выбора режима отображения — однократное нажатие переключает вывод абсолютных и относительных данных, с сохранением состояния на последующих опросах датчика.
Скетч
Достаточно простая программа для микроконтроллера, заливаемая в него при помощи Arduino IDE:
#DEFINE fButton_pin 2
#DEFINE LED_pin 13
#DEFINE DISPLAY_height 2
#DEFINE DISPLAY_width 16
#DEFINE DISPLAY_contrast 63
// Подключение библиотек и инициализация датчика вместе с дисплеем
#include
#include
// Wire.h подключать не нужно он уже вызван в TroykaTextLCD.h
MS_5803 S = MS_5803(512);
TroykaTextLCD DISPLAY;
// переменные программы
float mmWater = 0;
float TechAtmosphere = 0;
float dObtainedValue = 0;
float ObtainedValue = 0;
void setup() <
// параметры экрана
DISPLAY.setContrast(DISPLAY_contrast);
DISPLAY.begin(DISPLAY_width, DISPLAY_height);
// Установка датчика в 0, FALSE функции блокирует отправку технической информации в консоль
S.initializeMS_5803(FALSE);
delay(1000); // ждем, пока он выполнит инициализацию
// кнопка и светодиод показывающий режимы
pinMode(fButton_pin, INPUT_PULLUP);
pinMode(LED_pin, OUTPUT);
>
void loop() <
// Инициировать сенсор в режим взятия показаний
S.readSensor();
DISPLAY.setCursor(0, 0);
// получить и высветить значения в верхней строчке экрана
ObtainedValue = S.pressure();
DISPLAY.print(ObtainedValue);
DISPLAY.print(«mbar «);
DISPLAY.print(S.temperature());
DISPLAY.print(«C»);
// действия при нажатии кнопки
if (!digitalRead(fButton_pin)) <
// Изменение режима работы светодиода на противоположный
digitalWrite(LED_pin, !digitalRead(LED_pin));
dObtainedValue = ObtainedValue;
>
if (!digitalRead(LED_pin)) <
// абсолютные значения
mmWater = ObtainedValue * 1.019744288922 * 10;
TechAtmosphere = ObtainedValue * 0.001019716212978;
> else <
// относительные значения
mmWater = ((ObtainedValue — dObtainedValue) * 1.019744288922) * 10;
TechAtmosphere = (ObtainedValue — dObtainedValue) * 0.001019716212978;
>
// отображаем на экране значения в технических атмосферах и см воды
DISPLAY.setCursor(0, 1);
DISPLAY.print(TechAtmosphere,3);
DISPLAY.print(«TA «);
DISPLAY.print(mmWater,0);
DISPLAY.print(«mm»);
delay(1000);
DISPLAY.clear();
>
Схемы подключения датчика давления воздуха
Следующая конструкция построена на сенсоре-анероиде BMP180. Экран, в нее входящий, будет отображать текущее давление атмосферного воздуха и температуру окружающей среды. Для изготовления понадобятся:
Элемент | Наименование/характеристика | Количество |
---|---|---|
Микроконтроллер | Arduino UNO/Nano | 1 |
Датчик | BMP180 | 1 |
Экран | HD447080LCD-1602 | 1 |
Резистор | 100 Ом | 1 |
Регулируемый резистор | До 10 кОм | 1 |
Ну и конечно провода для связки всего названого в единую систему.
Библиотека, управляющая сенсором берется тут: https://github.com/adafruit/Adafruit-BMP085-Library
Принципиальная схема
Фотография итогового устройства:
Плата-шилд самодельная, для желающих повторить, она вблизи:
Датчик питается от 3.3V, соответственно и подключаются его контакты получения энергии (VCC и GND) к плате Arduino. Для передачи данных используются входы A5 (SCL) и A4(SDA). Дисплей с микроконтроллером соединяется согласно следующей таблицы:
Arduino | Экран |
---|---|
D6 | E и D4 вместе |
D4 | D5 |
D3 | D6 |
D2 | D7 |
GND | GND |
D7 | RS |
Скетч
Приведенная программа — всего лишь базис операций. Ее можно модифицировать по собственному разумению, добавляя функции отслеживания давления или температуры. Можно даже использовать конечное устройство, после необходимой модификации кода, в качестве своеобразного барометра, предупреждающего об идущей буре. Показания давления, в названом случае сильно упадут.
#define mPAUSE 2500
#include
#include
#include
Adafruit_BMP085 SENS;
LiquidCrystal DISPLAY(7, 6, 5, 4, 3, 2);
void setup() <
DISPLAY.clear();
>
void loop() <
float p = SENS.readSealevelPressure()/101.325 * 0.76;
DISPLAY.setCursor(1, 0);
DISPLAY.print(«T.= «);
if ( SENS.readTemperature()
Использование стороннего аналогового датчика давления
Редко, но все же случаются ситуации, когда по каким-либо причинам использовать в схеме специализированный сенсор, рассчитанный на работу конкретно с Ардуино, не получается. Скажем, его невозможно найти сразу в близлежащих магазинах электроники, а ждать посылку долго. Выходом могут стать датчики давления, применяемые в автомобильной электронике. Их тоже можно связать непосредственно с микроконтроллером.
Примером послужит WABCO 4410400130 — сенсор указанного плана, используемый на большегрузных фурах. Единственное, требующее внимания в представленной схеме — питание у элемента раздельно с Arduino. В последнем, просто нет требуемых для запуска датчика +24 В. В связи с чем и приходится использовать дополнительный блок энергообеспечения, с правильными и достаточными характеристиками питания — 8–32 V постоянного тока, при минимуме 400 mА мощности.
Что касается соединения сенсора напрямую к плате микроконтроллера — в нем на выходе не более 5 В. И чем больше давление, тем меньший ток будет поступать на аналоговые контакты логического устройства. Вот только, на всякий случай, рекомендуется проверить изначальный выход мультиметром, с целью контроля варианта «пробития» сенсора, с возникновением обстоятельств беспрепятственного связывания OUT с минусом или плюсом питающей детектор линии.
Пример скетча получения информации с аналогового датчика:
#include
LiquidCrystal_I2C DISPLAY (0x27, 16, 2);
#define Detector_Pin 0
#include
void setup() <
DISPLAY.init();
DISPLAY.clear;
AnalogReference(DEFAULT);
DISPLAY.setCursor (0,0);
DISPLAY.print(«Data:»);
>
void loop() <
static int AVC = 0;
AVC = (AVC * 3 + AnalogRead(Detector_Pin))/4;
float v = AVC * 5.0 / 1024.0;
float ObtainedValue = (v — 0.5) * 10/4;
DISPLAY.setCursor(0,1);
DISPLAY.print(» «);
DISPLAY.setCursor(0,1);
DISPLAY.print (ObtainedValue);
>
Теперь, что касается данных получаемых на выходе скетча. Нужно провести их градацию с использованием классического манометра, оценив какие цифры идут от сенсора при разном давлении и ввести соответствующую формулу в тело программы.
И в окончании, технические характеристики WABCO 4410400130, для сравнения с похожими датчиками Arduino:
- Тип: пьезоэлемент
- Питание: 8–32 V
- Рабочая температура: −40..+80 °С
- Диапазон измерения: от 0 до 10 bar
- Точность: 0.2–0.3 %
- Предельное давление разрушения: 16 bar
Резюмируя
Надеемся, представленная информация дала достаточно сведений, чтобы выполнить подключение датчика давления любого вида к плате микроконтроллера Arduino. В сущности, ничего сложного нет, для всех вариантов изначальных сенсоров — специализированных цифровых или сторонних аналоговых. Даже количество дополнительных радиодеталей в схемах стремится к нулю.
Видео по теме