#25. Подключение датчика температуры и давления BMP180 к Arduino.

Данный датчик отлично подойдёт для Arduino проекта, в котором необходимо измерять температуру и давление окружающей среды. Благодаря I2C интерфейсу подключения, данный датчик не занимает дополнительных пинов. Напряжение питания от 3.3 до 5 вольт, что позволяет использовать BMP180 как с Arduino, так и с такими микроконтроллерами как ESP32, ESP8266 и STM32. Если вас интересуют уроки по программированию ESP32, ESP8266, то на моем втором сайте «Ардуино технологии» вы найдете уроки по данной теме, и много другой полезной информации.

BMP180 достаточно точный датчик, погрешность измерения давления: 0,1 гектопаскаль, и погрешность измерения температуры: 0,1°С.
Параметры датчика давления и температуры BMP180.
- Напряжение питания: 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 линии.
Рассмотрим датчик давления и температуры BMP180 (Digital Pressure Sensor)
Датчик поставляется в виде модуля (на печатной плате) с 4 или 5 выводами:
- если у модуля 4 вывода (VIN GND SCL SDA), то на вывод VIN подаётся питание +3,3в.
- если у модуля 5 выводов (VIN 3V3 GND SCL SDA), то на вывод VIN подаётся +5в. (так же можно запитать модуль с 5 выводами от 3,3в, подав их на вывод 3V3 оставив вывод VIN свободным)
- если у модуля 5 выводов с выводом IO или VDDIO, то считайте, что у вашего модуля 4 вывода. Не подавайте +5в.
Выводы датчика BMP180:
1 — CS, 2 — VDD, 3 — VDDIO, 4 — MOSI, 5 — CSL (CSLK), 6 — SDA (MISO), 7 — GND.
Датчик имеет возможность передачи данных, используя интерфейсы I2C (выводы: 5-CSL и 6-SDA) или SPI (выводы: 1-CS, 4-MOSI, 5-CSLK и 6-MISO)
В рассматриваемых модулях используется протокол I2C, а значит, выводы 1 и 4 датчика не используются, но должны быть припаяны к плате для симметрии
Виды некоторых модулей с установленным датчиком BMP180:

В примере будем использовать первый датчик BMP180, из указанных выше.
Выводы модуля BMP180:
- VIN (Vcc, Vdd) плюс питания;
- GND (-) (англ. GrouND) общий (минус питания);
- SDA (DA) (англ. Serial DAta) линия данных, интерфейс I2C
- SCL (CL) (англ. Serial CLock) линия тактирования, интерфейс I2C
Принципиальная схема датчика BMP180, показана ниже.

Подключение датчика давления BMP180 к Arduino.
Для урока понадодиться:
- ARDUINO NANO. Купить можно на AliExpress или в России.
- BMP 180. Купить можно на AliExpress или в России.
- Провод DuPont. Купить можно на AliExpress или в России.
- Плата макетная беспаечная 55х82х8.5 мм. Купить можно на AliExpress или в России.
Подключение датчика давления BMP180 к Arduino:
В данном примере используем датчик BMP 180 и плату Arduino NANO, все полученные показания отправляем в «Монитор порта», в принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате Arduino предусмотрено только два вывода A4 и A5.

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

Подключение датчика давления BMP180 к Arduino UNO.
Теперь, о программной части. Для нашего удобства разработана библиотека BMP180 Breakout Arduino Library, которая позволяет упросить работу с датчиком, скачиваем и устанавливаем ее.
#include #include SFE_BMP180 pressure; // Объявляем переменную для доступа к SFE_BMP180 void setup() < Serial.begin(9600); // Задаем скорость передачи данных Serial.println("REBOOT"); // Вывод текста "Перезагрузка" if(pressure.begin()) // Инициализация датчика Serial.println("BMP180 init success"); // Вывод текста "BMP180 подключен" else< // В противном случаи, датчик не подключен Serial.println("BMP180 init fail\n\n"); // Вывод текста "BMP180 не подключен" while(1); // Пауза. >> void loop() < char status; double T,P,p0,a; /* Так как давление зависит от температуры, надо сначало узнать температуру * Считывание температуры занимает какоето время. * Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд * которые нужно подождать. Ксли какае то проблема, то функция вернет 0. */ status = pressure.startTemperature(); // Считывание показания if(status!=0)< // Если значение status не 0, выполняем следующию команду. delay(status); // Ждем status = pressure.getTemperature(T); // Полученые показания, сохраняем в переменную T if(status!=0)< // Если все хорошо, функция вернет 1, иначе вернет 0 Serial.print("Temperature: "); // Вывод текста "Температура" Serial.print(T,2); // Вывод показания переменной "Т" Serial.println(" C, "); // Вывод текста "С" /* Определяем показания атмосферного давления * Параметр указывает расширение, от 0 до 3 (чем больше расширение, тем больше точность, тем долше ждать) * Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд * которые нужно подождать. Если какая то проблема, то функция вернет 0. */ status = pressure.startPressure(3); // Считывание показания if(status!=0)< // Если значение status не 0, выполняем следующию команду. delay(status); // Ждем status = pressure.getPressure(P,T); // Полученные показания, сохраняем в переменную P if(status!=0)< // Если все хорошо, функция вернет 1, иначе вернет 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" else Serial.println("error retrieving pressure measurement\n");> // Ошибка получения давления else Serial.println("error starting pressure measurement\n");> // Ошибка запуска получения давления else Serial.println("error retrieving temperature measurement\n");> // Ошибка получения температуры else Serial.println("error starting temperature measurement\n"); // Ошибка запуска получения температуры delay(5000); // Пауза в 5с >
Загружаем скетч в плату Arduino, и если все правильно подключено, то в окне мониторинга порта можно увидеть температуру и атмосферное давление.

В данном уроке рассмотрели Подключение датчика температуры и давления BMP180 к Arduino. В предыдущем уроке мы рассматривали, как можно реализовать анимацию на сегментном дисплее TM1637.
Появились вопросы или предложения, не стесняйся, пиши в комментарии!
Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.
Всем Пока-Пока.
И до встречи в следующем уроке
Понравилась статья? Поделитесь ею с друзьями:
Датчик давления воды для ардуино

Среди множества датчиков для ардуино нашлось место датчику давления воды. Как понятно из названия, датчик давления воды для ардуино измеряет давление создаваемое водой. Это полезно знать, например в квартире на верхних этажах, или в частном доме.
Модель датчика давления воды для ардуино представлен на алиэкспрессе моделью USP-G41-1.2. Внешний вид датчика представлен на рисунке ниже:

Датчик давления воды USP-G41-1.2 преобразует давление воды в напряжение в виде линейной зависимости.
Характеристики датчика

Программный код Arduino IDE для работы с датчиком давления
#define SENSOR A0 // Пин на который подключен датчик void setup() < Serial.begin(9600); >void loop() < int raw = analogRead(SENSOR); float voltage = (float) raw * 5.0 / 1024.0; // напряжение на измерительном контакте ардуино Serial.println("Pressure is"); float pressure_kPa = (voltage - 0.5) / 4.0 * 1200.0; // перевод напряжения в давление Serial.print(pressure_kPa); Serial.println(" kPa"); float pressure_psi = pressure_kPa * 0.14503773773020923; // перевод кПа в psi Serial.print(pressure_psi); Serial.println(" psi"); delay(500); >
- Выход датчика (OUT) подключается к аналоговому контакту А0 Ардуино.
- В строчке float pressure_kPa = (voltage — 0.5) / 4.0 * 1200.0; вычисляется значение давления датчика учитывая измеряемый диапазон.
- Строчка float pressure_psi = pressure_kPa * 0.14503773773020923; переводит давление из КилоПаскалей в единицы psi.
Также учитывайте, что данный датчик имеет температурную погрешность. Ее, при необходимости, нужно учитывать.
Подключение датчика давления HX710B к Arduino

На сайте уже есть несколько статьей про датчики давления, 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
Arduino.ru
На аналоговый выход через делитель. А нету ссылочки на схему делителя? Спасибо!
- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 — 17:11
Зарегистрирован: 12.02.2012
Два резистора номналом от 5 до 50 кОм, подклучаете так: GND->резистор->вход дуины->резистор->выход датчика и соедените землю (GND) дуины с землей (-) датчика.
- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 — 17:17
ramon_sobaka
Зарегистрирован: 24.10.2012
Но рабочее напряжение датчика [V] 20. 30 DC. А на аналоговом выходе датчика от 4 до 20 мА смотря какое давление будет! Выход дуины не спалю.
- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 — 17:28
Зарегистрирован: 12.02.2012
На выходе датчика 0 — 10 вольт, причем тут 4 — 20 мА?
- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 — 18:32
Зарегистрирован: 12.02.2012

- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 — 22:05
AlexFisher

Зарегистрирован: 20.12.2011
Можно вход думны зашунтировать 250 Ом и подвть 20 мА — как раз выйдет 5 вольт при 20 мА
- Войдите на сайт для отправки комментариев
Втр, 04/12/2012 — 22:49
Зарегистрирован: 14.11.2012
а надо ли при такой схеме подключения выставлять AREF в external и подключать к нему внешнее напряжение?
- Войдите на сайт для отправки комментариев
Ср, 05/12/2012 — 11:13
Andrey_Y_Ostanovsky
Зарегистрирован: 03.12.2012
rembo пишет:
а надо ли при такой схеме подключения выставлять AREF в external и подключать к нему внешнее напряжение?
Смотря что Вы планируете при этом получить.
Внешнее напряжение на AREF все равно больше 5 вольт не подать, а стабилизировать — лучше питание контроллера целиком, тем более, что там не такая уж большая нагрузка.
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 14:57
Зарегистрирован: 14.01.2013
И так начнем с того что я программист, и у меня нормально работает только ЦИФРА, как доходит дело до аналогов я вынужден побираться, искать чужой опыт и прочее .
Задача . делается приспособление, которое будет работать на меге и отчитываться по MODBUS, при его разработке возникла жудкая проблема . я не как не могу прикрутить датчики к ATMEGA’e . причем датчики разношерстные:
один датчик (температура) это тип Pt1000 с ним всё понятно это термо резистор, если получить его сопротивление с перещётом проблем не будет
второй (давление) выдаёт сигнал 4-20 ма .
Прочитал тонну но видимо мне совсем не везёт, даже мысли в proteus выложил всё равно не прёт с измерениями .
был бы оченеь при очень благодарен если бы кто то подсказал обвязку ног атмеги , с условием что питание всех датчиков идёт от 24 вольт, а атмега питается от них же но через 7805 стабилизатор . особое качество не требуется , но хотя бы чтобы начать .
За рание спасибо
p.s. Читал про делители токовые петли . ну не моё это программер я . и по цифре .
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 15:31
Andrey_Y_Ostanovsky
Зарегистрирован: 03.12.2012
Faster пишет:
один датчик (температура) это тип Pt1000 с ним всё понятно это термо резистор, если получить его сопротивление с перещётом проблем не будет
второй (давление) выдаёт сигнал 4-20 ма .
Как бы Вам этого ни хотелось, придется разобраться что такое делитель напряжения и измерение тока с помощью шунта, и делать эти делители из дополнительных резисторов. А дальше сигнал 0-5 вольт подается на аналоговый вход ардуины, после чего остается привязать данные с датчика к значениям, выдаваемым АЦП.
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 16:31
Зарегистрирован: 14.01.2013
Для меня аналоговые расчеты просто жесть 3 дня мараю об это руки , а MODBUS протокол реализовал за 2 часа .
Вот читаю . но это жесть , был бызнающий человек чтобы помочь . ух был бы благодарен
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 16:38
Andrey_Y_Ostanovsky
Зарегистрирован: 03.12.2012
Ну, считайте аналог неким массивом плавно изменяющихся данных. 🙂 А рассчеты делителя — есть прямо в интернете. Вбиваете туда значения и смотрите — что получается.
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 16:45
Зарегистрирован: 14.01.2013
Но задачи то две сначалао укатать до 0-5в а потом уже ток мерять
- Войдите на сайт для отправки комментариев
Пнд, 14/01/2013 — 18:27
Andrey_Y_Ostanovsky
Зарегистрирован: 03.12.2012
Faster пишет:
Ссылку бы ? Но задачи то две сначалао укатать до 0-5в а потом уже ток мерять
- Войдите на сайт для отправки комментариев
Втр, 15/01/2013 — 16:27
Зарегистрирован: 14.01.2013
Обидно видить серчь гугла ..но спасибо калькулятор нашёл уже раньше тем же методом . я думал может есть удобный софт или ещё что .
Счас решаю . задачи по силекции между двумя типами датчиков на одной ножке .
- Войдите на сайт для отправки комментариев
Пнд, 08/04/2013 — 21:48
Зарегистрирован: 12.09.2011
Faster, свяжитесь со мной по почте [email protected] , решим вашу проблему. Или ответьте здесь.
- Войдите на сайт для отправки комментариев
Сб, 23/09/2017 — 23:19
Зарегистрирован: 04.04.2016
Доброго времени суток, коллеги
Я так понимаю тоже через делитель ?
Цель сделать управляемое реле на насосе
когда давление достигло определенной отметки чтоб реле разомкнулось
В интернете не нашел достточно информации
Как правильно вычислять давление на нем ?
Всем спасибо за уделенное время
- Войдите на сайт для отправки комментариев
Сб, 23/09/2017 — 23:29
Зарегистрирован: 04.04.2016
Использую вот такой код для измерений, скопировал на одном из сайтов, но пока не понимаю почему порт выводит не свзанные показания /* Pressure Sensor test Code */ const int analogInPin = A0; // Sensor connected to A0 int sensorValue = 0; // value read from the pressure sensor via the amplifier stage float outputValue = 0; // value output to the Serial port void setup() < // initialize serial communications at 9600 bps: Serial.begin(9600); >void loop() < // read the analog in value: sensorValue = analogRead(analogInPin); // print the results to the serial monitor: Serial.print("sensor = " ); Serial.print(sensorValue); outputValue = map(sensorValue, 60, 1006, 0, 32); // convert the raw bit value Serial.print("sensor forum-post-footer clear-block">
- Войдите на сайт для отправки комментариев

