Обзор датчика давления 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
Необходимые детали:
► Барометрический датчик давления BMP180 (3.3В, GY-68) x 1 шт.
► Arduino UNO R3 (DCCduino, CH340G)x 1 шт.
► Провод DuPont 10x, 2,54 мм, 20 см, F-F (Female — Female) x 1 шт.
Подключение:
В данном примере используем датчик BMP 180 и плату Arduino UNO R3, все получение показание отправлять в «Serial порт», принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате arduino предусмотрено только два вывода A4 и A5, другие вывода не поддерживают I2C, так что учтите при проектирование.
Теперь, о программной части, для нашего удобства разработана библиотека BMP180 Breakout Arduino Library v.1.1.2, которая позволяет упросить работу с датчиком, скачиваем и устанавливаем ее, кстати датчик BMP180 и BMP080 похожи, включая и команды, так что библиотека у них одна.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include <SFE_BMP180.h> #include <Wire.h> 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 Breakout v.1.1.2
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Барометрический датчик давления BMP180 (3.3В, GY-68)
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Барометрический датчик давления BMP180 (3.3В, GY-68)
В итоговом коде сказано, что для нахождения давления необходимо сначала вычислить температуру. Это необходимо при каждом измерении? В моей ситуации просто важно иметь актуальную информацию о давлении (датчик будет перемещаться относительно уровня моря) и не критично ошибиться на 1 градус по Цельсию. Можно ли выставить время обновления давления в 0.25 сек, а температуры — в 2 сек., или каждый раз надо измерять обе величины?
Значение температуры используется для корректировки данных давления и влажности. Поэтому без него не обойтись, придется вычислять каждый раз.
Зачем в данном случае подтяжки линий SCL и SDA к питанию через резисторы?
Потому что формирование импульсов на шине происходит путем подтяжки той или иной линии к земле внутренними транзисторами датчика и процессора. Не будет резисторов — не будет и изменения уровней, то есть передачи данных. То есть резисторы подтяжки обязательны.
Но! Если к этой же шине уже подключены резисторы на плате микропроцессора или на другом датчике, подключенном параллельно, то необходимости в них уже нет.