Подключение барометра bmp180 к arduino. Датчик атмосферного давления BMP085 и Arduino

BMP180 — Датчик абсолютного давления, построенный по пьезорезистивной схеме, он имеет низкий шум и высокую линейность, а также высокую скорость установки показаний. На кристалле расположен MEMS-датчик в виде гибкой кремниевой мембраны, закрывающей камеру со стандартным давлением. На мембране расположены тензодатчики, которые включены по схеме моста, и изменяют своё сопротивление при изгибе мембраны. Изгиб мембраны зависит от разности между окружающим давлением и давлением в камере, и выходной сигнал с тензомоста зависит от давления окружающей среды. Так как параметры мембраны и резисторов зависят от температуры, то на кристалле расположен цифровой термометр, показания которого используются для компенсации данных барометра, но может использоваться и самостоятельно. Не рекомендуется использование для компенсации данных барометра данные о температуре с других датчиков. Термометр в BMP180 расположен на самом измерительном кристалле, он измеряет температуру чувствительного элемента — поэтому его показания наиболее близки к температуре барометра и точны. Барометр может работать с максимальной точностью 2 Пa (если использовать его как барометрический высотомер это соответствует погрешности измерения высоты в 17 см).

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

    Напряжение питания 1.62V — 3.6V.

    Интерфейс подключения I2C.

    Точность до 0.02hPa (17cm).

    Диапазон: 300hPa to 1100hPa (+9000m to -500m).

    Выходные данные: 16 бит давление и температура

    разрешение по давлению 0.01hPa

    разрешение по температуре 0.1 о С

Arduino Example Code

#include
#include

/***************************************************
This is an example for the BMP085 Barometric Pressure & Temp Sensor
Designed specifically to work with the Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
These displays use I2C to communicate, 2 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on "168/"328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on "168/"328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;

Void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}

Void loop() {
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

// Calculate altitude assuming "standard" barometric
// pressure of 1013.25 millibar = 101325 Pascal

Serial.print("Altitude = ");
Serial.print(bmp.readAltitude());
Serial.println(" meters");

Serial.print("Pressure at sealevel (calculated) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");

// you can get a more precise measurement of altitude
// if you know the current sea level pressure which will
// vary with weather and such. If it is 1015 millibars
// that is equal to 101500 Pascals.

Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500 ));
Serial.println(" meters");

Serial.println();
delay(500);
}

Данный скетч выводит

  • Temperature = хх.хх *C — Температура в градусах Цельсия
  • Pressure = хх Pa — Атмосферное давление в Паскалях
  • Altitude = хх.хх meters — Высота в метрах
  • Pressure at sealevel (calculated) = хх Pa — Атмосферное давление в Паскалях (относительно уровня моря (расчетная))
  • Real altitude = хх.хх meters — Реальная высота (расчетная)

Для того чтобы выводить атмосферное давление в мм ртутного столбанадо изменить несколько строк

Serial.print ("Pressure = ");

Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.

Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"

Serial.print ("Pressure at sealevel (calculated) = ");

Serial.print (bmp.readSealevelPressure() / 133.322);

Serial.println (" mm");

Настройка датчика BMP180

Атмосферное давление зависит от места измерения, температуры воздуха и погоды. На уровне моря среднегодовое атмосферное давление составляет p н = 1013.25 мбар = 101,325 кПа (нормальное давление) при среднегодовой температуре 15°С. И при подъеме на каждые 8 м атмосферное давление падает на 100 Па = 1 мбар.

Можно получить более точное измерение высоты. Если мы знаем, текущее давление над уровнем моря для наших координат. Для этого надо узнать нашу реальную высоту над уровнем моря с помощью карт от Google, для этого перейдем по ссылке . В окне с картой от Google находим наше место положение и кликаем левой кнопкой мышки, для установки метки на карте, и получаем данные по высоте над уровнем моря для нашей точки. Также не забываем учесть на каком этаже мы находимся и прибавить высоту этажей нашим данным.

Нормальное атмосферное давление на уровне моря составляет приблизительно 101,3 кПа или 101325 Па. Проще для получения нужного значения воспользоваться онлайн калькулятором - Расчёт атмосферного давления на различных высотах , а для перевода из (мм рт. ст.) в (Па) есть простая формула Па = мм рт. ст. * 133,322 . Для калибровки высоты нам потребуется внести изменения в строку

Serial . print (bmp . readAltitude (101500 ) ) ;

где вместо значения 101500 вводим своё рассчитанное значение.

Вещи, которых нужно остерегаться

Дайте ему воздух: Помните, что BMP180 необходим доступ окружающего воздуха для измерения его давления, так что не стоит его укладывать в герметичный корпус.

Но не слишком много воздуха: С другой стороны, воздействие быстро движущихся воздушных потоков или ветра могут вызвать кратковременные колебания давления, которые будут влиять ваши показания. Защетите устройство от сильных воздушных потоков.

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

Влага: BMP180 чувствителен к влаге и не должен контактировать с водой.

Свет: Удивительно, датчик BMP180 чувствителен к свету, который может войти в устройство через отверстие в верхней части чипа. Для достижения максимальной точности, следует оградить чип от окружающего света.

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

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

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

  • Напряжение питания 3.3 вольт
  • Потребляемый ток 5 мКА при частоте опроса 1 Hz
  • Интерфейс подключения - I2C
  • Разброс точности по измеренному давлению +-0.12 hPa (+-1 метр по высоте)
  • Диапазон измерения температуры от -40*С до +85*С
  • Диапазон измерения давления: от 300 до 1100 hPа

Пришло время подключить датчик к плате Arduino Uno , но так как у нас замеренные и преобразованные значения будут выводиться на 7-ми сегментный дисплей, то на нижеследующей схеме мы покажем полное подключение всех приборов, а также распиновку датчика BMP180 :

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

  • Выводить на дисплей только преобразованные значения температуры (ниже описывается почему)
  • Значения температуры должны быть реализованы с десятыми долями градуса(как это видно на картинке превью)
  • Реализовать визуализацию в виде бегущей строки
  • Обязательно наличие диагностических сообщений о состоянии датчика при включении и инициализации
  • Используем библиотеку для работы с датчиком

Почему же всё таки выводить только значения температуры... Конечно, хотелось бы охватить полностью все возможности датчика BMP180 , но для визуализации на 7-ми сегментном дисплее, потребуется задействовать более сложные символы для отображения в сообщениях "бегущей строки", чем те которые можно реально создать используя для модулей визуализации данного типа. Поэтому было решено отображать только преобразованные значения температуры, но и вообще в целом, обычно редко кто смотрит на показания атмосферного давления когда к примеру собирается на прогулку. И всё же - если кто-то захочет более тонко изучить работу с датчиком BMP180, то в подключаемой библиотеке есть два примера, которые могут более детально разъяснить как получать и преобразовывать давление и температуру при помощи данного датчика.

В итоге, был создан вот такой скетч, с комментариями разработчика:

#include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" //Прототип функции для прокрутки сообщения msgScrolling() void msgScrolling(byte msg, int msgSize, int dScroll); //Прототип функции по обработке данных температуры //и подготовке сообщения void TmsgPreparation(double value, bool degree); //Создаём объект LC класса LedControl для работы с дисплеем LedControl LC = LedControl(12, 11, 10, 8); //Создаём объект BMP180Sensor класса SFE_BMP180 для работы с датчиком SFE_BMP180 BMP180Sensor; //Время задержки отрисовки символов при прокрутке const int delayScrolling = 300; //Сообщение "Инициализация датчика успешна" byte msgInitSuccess = {91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 91, 28, 13, 13, 79, 91, 91}; //Сообщение "Инициализация датчика безуспешна" byte msgInitFail = {91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 71, 119, 48, 14}; //Массив численных символов без точки byte Digit = {126, 48, 109, 121, 51, 91, 95, 112, 127, 123}; //Массив численных символов с точкой byte pDigit = {254, 176, 237, 249, 179, 219, 223, 240, 255, 251}; //Символьные знаки byte deg = 99; //Символ "градуса" byte C = 78; //Символ "С" - Цельсий byte F = 71; //Символ "F" - Фаренгейт byte S = 1; //Символ "-" - знак минуса(если измеренное значение ниже нуля) void setup() { //Устройство(7-ми сегментный дисплей) выводим из спящего режима LC.shutdown(0, false); //Установить яркость дисплея на 8 //Всего возможных режимов яркости от 0 до 15 LC.setIntensity(0, 8); //Очистить дисплей LC.clearDisplay(0); //Инициализация датчика на шине I2C if(BMP180Sensor.begin()) { //Сообщение на прокрутку - инициализация датчика успешна msgScrolling(msgInitSuccess, sizeof(msgInitSuccess), delayScrolling); } else { while(true) { //Сообщение на прокрутку - инициализация датчика безуспешна msgScrolling(msgInitFail, sizeof(msgInitFail), delayScrolling); } } } void loop() { char status; double T, tCelsius, tFahrenheit; //Начинаем измерения температуры //функция startTemperature() возвращает количество миллисекунд //с начала процесса измерения, если процесс измерения прошел правильно, //сохраним это значение в переменную status //Если функция возвращает 0 то процесс измерения прошел неправильно status = BMP180Sensor.startTemperature(); if(status != 0) { //Подождать то самое количество миллисекунд delay(status); //Получить замеренное и обработанное значение температуры //в градусах Цельсия, и сохранить в переменной Т //функция getTemperature() возвращает 1 если вызов её //прошел успешно, и 0 если функция не смогла инициализировать //переменную Т измеренным значением status = BMP180Sensor.getTemperature(T); if(status != 0) { //Присвоение значения переменным //и обработка градуировок для шкалы Фаренгейта tCelsius = T; tFahrenheit = (9.0 / 5.0) * T + 32.0; } } //Обработка значения и //подготовка сообщения - температура TmsgPreparation(tCelsius, false); TmsgPreparation(tFahrenheit, true); } //Здесь собственно сама функция для прокрутки готовых сообщений //справа - налево /* * Параметры: * byte msg - указатель на массив символьных данных * int msgSize - размер массива символьных данных * int dScroll - задержка прокрутки(сдвига сообщения влево) * в миллисекундах */ void msgScrolling(byte msg, int msgSize, int dScroll) { for(int i = 0; i < 8 + msgSize; i ++) { for(int n = i, j = 0; n >= 0, j < msgSize; n --, j ++) { LC.setRow(0, n, msg[j]); LC.setRow(0, n - 1, B00000000); } delay(dScroll); } } /* * Здесь функция подготовки сообщения, прежде чем оно будет выведено * для прокрутки на дисплее. Параметры: * double value - значение температуры двойной степени точности * bool degree - флаг для определения шкалы градуирования * если false - значит градусы Цельсия * если true - значит градусы Фаренгейта */ void TmsgPreparation(double value, bool degree) { //Приводим к абсолютному значению и сохраняем в переменной T //Это унифицирует значение и сократит код функции вдвое double T = abs(value); //Здесь значение фильтруется, если есть отклонение на пол градуса //от нуля то всё равно формировать сообщение что температура равна 0 //Итак, если замеренная температура меньше 0.5 то ставим 0 if(T < 0.5) { //Резервируем символьный массив на три символа byte preMsg; //Первый символ - это естественно 0 preMsg = Digit; //Второй символ - это сгенерированный символ "градус" preMsg = deg; //Проверка флага градуировки if(degree) { //Если true - то это градусы Фаренгейта //и третий символ в массиве будет содержать //сгенерированный символ F(код 71) preMsg = F; } else { //Иначе, если true - то это градусы Цельсия //и третий символ в массиве будет содержать //сгенерированный символ С(код 78) preMsg = C; } //Отправляем указатель на проинициализированный символьный массив preMsg //в качестве первого параметра функции для прокрутки сообщений //второй параметр - это размер символьного массива preMsg //третий параметр - задержка сдвига(прокрутки влево) в миллисекундах msgScrolling(preMsg, sizeof(preMsg), delayScrolling); //После прокрутки сообщения покинуть тело функции return; } //Если больше 0.5 но меньше 1 if(T < 1) { byte preMsg; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } //Здесь нужно знать показания температуры //Отрицательные или положительные, //если отрицательные - добавить отрисовку знака минус if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 1 но меньше 10 if(T < 10) { byte preMsg; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 10 но меньше 100 if(T < 100) { byte preMsg; preMsg = Digit; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 100 но меньше 1000 if(T < 1000) { byte preMsg; preMsg = Digit; preMsg = Digit; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } }

Еще хотелось бы сказать, что в стандартной библиотеке LedControl не было найдено функций прокрутки, может быть мы будем теми кто дополнит эту библиотеку? Что же, всё зависит от пожеланий наших посетителей, комментируйте, пробуйте, задавайте вопросы... Ждем ваших отзывов. Видео работы скетча также прилагается к этой статье, смотрим результаты работы скетча:


Пожалуйста, включите javascript для работы комментариев.

Программа для Ардуино с комментариями:

/* SFE_BMP180 library example sketch

This sketch shows how to use the SFE_BMP180 library to read the
Bosch BMP180 barometric pressure sensor.
https://www.sparkfun.com/products/11824
Like most pressure sensors, the BMP180 measures absolute pressure.
This is the actual ambient pressure seen by the device, which will
vary with both altitude and weather.
Before taking a pressure reading you must take a temparture reading.
This is done with startTemperature() and getTemperature().
The result is in degrees C.
Once you have a temperature reading, you can take a pressure reading.
This is done with startPressure() and getPressure().
The result is in millibar (mb) aka hectopascals (hPa).
If you"ll be monitoring weather patterns, you will probably want to
remove the effects of altitude. This will produce readings that can
be compared to the published pressure readings from other locations.
To do this, use the sealevel() function. You will need to provide
the known altitude at which the pressure was measured.
If you want to measure altitude, you will need to know the pressure
at a baseline altitude. This can be average sealevel pressure, or
a previous pressure reading at your altitude, in which case
subsequent altitude readings will be + or - the initial baseline.
This is done with the altitude() function.

Hardware connections:
- (GND) to GND
+ (Vin) to 5V
You will also need to connect the I2C pins (SCL and SDA) to your
Arduino. The pins are different on different Arduinos:
Any Arduino pins labeled: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Due: 20 21
Leonardo: 2 3

The SFE_BMP180 library uses floating-point equations developed by the
Weather Station Data Logger project: http://wmrx00.sourceforge.net/

V10 Mike Grusin, SparkFun Electronics 10/24/2013
V1.1.2 Updates for Arduino 1.6.4 5/2015
*/

// Your sketch must #include this library, and the Wire library.
// (Wire is a standard library included with Arduino.):

#include
#include
#include

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// You will need to create an SFE_BMP180 object, here called "pressure":
SFE_BMP180 pressure;

void setup()
{
lcd.begin(16, 2);
// Initialize the sensor (it is important to get calibration values stored on the device).
pressure.begin();
}

void loop()
{
char status;
double T,P,p0=1013.0,a;// 1013.0 - давление в гПа на уровне моря

// You must first get a temperature measurement to perform a pressure reading.
// Start a temperature measurement:

status = pressure.startTemperature();
if (status != 0)
{
delay(status);

// Retrieve the completed temperature measurement:
// Note that the measurement is stored in the variable T.

status = pressure.getTemperature(T);
if (status != 0)
{
lcd.setCursor(0, 0);
lcd.print(" Temp=");
lcd.print(T,2);
lcd.print("C");
// Start a pressure measurement:
// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
// If request is successful, the number of ms to wait is returned.
// If request is unsuccessful, 0 is returned.

status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);

// Retrieve the completed pressure measurement:
// Note that the measurement is stored in the variable P.
// Note also that the function requires the previous temperature measurement (T).
// (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
// Function returns 1 if successful, 0 if failure.

status = pressure.getPressure(P,T);
if (status != 0)
{
// Print out the measurement:
lcd.setCursor(0, 1);
lcd.print("P=");
lcd.print(P/1.333,0); // коэф. 1.333 - преобразование гПа в мм.рт.ст.

// If you want to determine your altitude from the pressure reading,
// use the altitude function along with a baseline pressure (sea-level or other).
// Parameters: P = absolute pressure in mb, p0 = 1013 baseline pressure in mb.
// Result: a = altitude in m.

a = pressure.altitude(P,p0);
lcd.print(" H=");
lcd.print(a,2);
lcd.print("m");
}
else lcd.print("error ");
}
else lcd.print("error ");
}
else lcd.print("error ");
}
else lcd.print("error ");
delay(5000); // Pause for 5 seconds.

BMP085 – это сенсор для контроля барометрического давления (кроме этого, он еще контролирует и температуру).

Датчик используется во многих проектах, в том числе и с использованием Arduino, так как у него практически нет аналогов. Кроме того, стоит он тоже недорого. Первый вопрос, который возникает: а зачем кому-то мерять атмосферное давление? На то есть две причины. Первая - контролировать высоту над уровнем моря. С увеличением высоты над уровнем моря, давление падает. Очень удобно в походах, в качестве альтернативы GPS навигаторам. Кроме того, показатель атмосферного давления используют для прогнозирования погоды.

На смену BMP085 в свое время пришел датчик BMP180, который подключается к Arduino и другим микроконтроллерам так же как и его предшественник, но при этом меньше и стоит дешевле.

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

  • Диапазон чувствительности: 300-1100 гПа (9000 м - 500 м над уровнем моря);
  • Разрешающая способность: 0.03 гПа / 0.25 м;
  • Рабочая температура -40 до +85°C, точность измерения температуры +-2°C;
  • Подключение по i2c;
  • V1 на модуле использует 3.3 В питания и питания логики;
  • V2 на модуле использует 3.3-5 В питание и питание логики;

После перезагрузки Arduino IDE, можете запустить первый скетч-пример, код которого приведен ниже:

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

void setup(void)

Serial.begin(9600);

Serial.println("Pressure Sensor Test"); Serial.println("");

/* Инициализируем сенсор */

if(!bmp.begin())

/* Если появилась надпись: "There was a problem detecting the BMP085 ...",

Проверьте правильность подключения сенсора */

Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");

sensors_event_t event;

bmp.getEvent(&event);

/* отображаем результаты (барометрическое давление измеряется в гПа) */

if (event.pressure)

/* Отображаем атмосферное давление в гПа */

Serial.print("Pressure: "); Serial.print(event.pressure); Serial.println(" hPa");

Открываем окно серийного монитора (скорость передачи данных - 9600). Наш скетч должен выводить данные о давлении в гПа (гектопаскалях). Можно проверить работоспособность сенсора, нажав пальцем на сенсор. На рисунке показаны значения давления после нажатия пальцем.


Измерение высоты над уровнем моря

Вы наверняка знаете, что давление падает с увеличением высоты. То есть, мы можем рассчитать высоту, зная давление и температуру. Опять таки, математику мы оставим за кадром. Если вам интересны расчеты, можете ознакомиться с ними на этой странице Википедии .

В примере, который приведен ниже будет использована дополнительная библиотека Arduino. Для расчета высоты с помощью датчика BMP085, обновите функцию "void loop()". Необходимые изменения скетча приведены в скетче ниже. В результате вы получите значение температуры на основании уровня давления и значения температуры.

/* создаем новое событие (event) для сенсора */

sensors_event_t event;

bmp.getEvent(&event);

/* отображаем результаты (барометрическое давление в гПа) */

if (event.pressure)

/* отображаем атмосферное давление в гПа */

Serial.print("Pressure: ");

Serial.print(event.pressure);

Serial.println(" hPa");

/* для расчета высоты с определенной точностью, необходимо знать *

* среднее давление и температуру окружающей среды

* в градусах по цельсию в момент снятия показаний*

* если у вас нет этих данных, можно использовать "значение по умолчанию",

* которое равно 1013.25 гПа (это значение определено как

* SENSORS_PRESSURE_SEALEVELHPA *

* в файле sensors.h). Но в результаты будут не точными*

* необходимые значения можно найти на сайтах с прогнозами температур*

* или на ресурсах информационных центров при больших аэропортах*

* например, для Париже, Франция, можно найти текущее среднее значение давления*

* по на сайте: http://bit.ly/16Au8ol */

/* получаем текущее значение температуры с датчика BMP085 */

float temperature;

bmp.getTemperature(&temperature);

Serial.print("Temperature: ");

Serial.print(temperature);

Serial.println(" C");

/* конвертируем полученные данные в высоту */

/* обновляем следующую строку, отображая текущие значения */

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print("Altitude: ");

Serial.print(bmp.pressureToAltitude(seaLevelPressure,

Serial.println(" m");

Serial.println("");

Serial.println("Sensor error");

Запускаем скетч и видим рассчитанную высоту над уровнем моря.

Точность показаний BMP085 можно значительно увеличить, уточнив среднестатистическое значение давления, которое меняется в зависимости от погоды. Каждый 1 гПа давления, который мы не учли, приводит к ошибке в 8.5 метра!

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


Изменим в нашем скетче следующую строку, записав в ней актуальное значение (1009 гПа):

float seaLevelPressure = 1009;

В результате мы получим несколько другие результаты:

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

Использование BMP085 (API v1)

Повторимся в очередной раз: для того, чтобы узнать давление и высоту над уровнем моря, надо провести некоторые расчеты. Но все они уже включены в библиотеку Adafruit_BMP085 Arduino Library (API v1), скачать которые можно ссылке .

После установки библиотек, необходимо перезагрузить Arduino IDE

После перезагрузки можете запустить первый скетч-пример:

#include <Wire.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.println(" Pa");

Serial.println();

После прошивки вашего Arduino, откройте серийный монитор. Установите скорость обмена данными на 9600. Скетч будет выводить температуру в градусах по Цельсию и давление в паскалях. Если вы приложите палец к чувствительному элементу датчика, температура и давление увеличатся:


Измерение высоты над уровнем моря (API v1)

Для контроля высоты над уровнем моря, достаточно просто запустить скетч, который приведен ниже:

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.print("Temperature = ");

Serial.print(bmp.readTemperature());

Serial.println(" *C");

Serial.print("Pressure = ");

Serial.print(bmp.readPressure());

Serial.println(" Pa");

// рассчитываем высоту над уровнем моря, отталкиваясь от значений

//"стандартного" барометрического давления, равного 1013.25 милибар = 101325 Паскаль

Serial.print("Altitude = ");

Serial.print(bmp.readAltitude());

Serial.println(" meters");

Serial.println();

Запускаем скетч для отображения результатов:


Судя по показаниям выше, мы находимся на высоте -21.5 метра относительно уровня моря. Но ведь мы знаем, что находимся над морем! Вспоминаем о той же проблеме, что и при использовании API V2. Надо учесть погоду! Ок. Предположим, мы нашли качественный метеорогический веб-сайт и давление составляет 101,964 Па. Открываем пример Examples->BMP085test в Arduino IDE и правим строку, которая выделена на рисунке ниже:


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


Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!