Translate

среда, 25 апреля 2018 г.

Датчик давления BMP180

Ещё один шаг к созданию метеостанции.


Датчик давления BMP180
Посмотрел под увеличением, как запаял пины, и ужаснулся.
Сегодня испытываю датчик давления BMP180. Скажу, что он порадовал меня значительно больше. Запустился без танцев с бубном, библиотека сразу заработала, да и измерения получились куда более точные и эффективные. Дело в том, что это тоже не просто датчик давления, а ещё это датчик температуры и при желании - высоты. Не вдаваясь в подробности, скажу, что атмосферное давление зависит от толщины столба воздуха, находящегося над местом измерений, и чем он толще и плотнее, тем давление выше. Температура, она и в Африке температура, на давление влияет только косвенно, так как у воздуха с разной температурой разная плотность. Но вот на измерения самого прибора, она, похоже, влияет куда сильнее, так что для измерения давления сначала надо замерить температуру. Измеряется она очень быстро в сравнении с медленным и долгим DHT-11 (См. как я долго и мучительно его вчера настраивал). Из недостатков скажу, что для охлаждения и нагревания чипу на датчике тоже нужно время. Если прижать к нему палец, то температура подскакивает до +30 уже через несколько секунд. Остывание же до уличной температуры у открытого окна шло значительно медленне, подозреваю, для полного выравнивания нужны уже десятки минут - до конца так и не доостужал (там холодно и дождик). Рабочий диапазон температур заявлен от 0 до +65°C. Увы, на морозы он, похоже, тоже не рассчитан. Хотя заявлен рабочий диапазон для самого устройства от +85 до -40°C. Ну, хотя бы на улицу вывешивать можно, минус сорок на моей памяти тут у нас ещё не бывало.

Собственно, барометр


Давление измеряет быстро и, кажется, исправно. Однако, при сопоставлениями с настенным анероидом даёт погрешность 7-8 мм ртутного столба. Есть повод задуматься - кто врёт. Нужен третий барометр. Данные Гисметео оказываются где-то посередине - больше датчика на 3 мм и на 4 мм ниже барометра-анероида.
При изменении высоты датчика на уровне комнаты давление исправно меняется на сотые и десятые миллиметра, что приятно радует. Такой точности измерений мой аналоговый прибор со стрелкой дать не может.
Проблемой для точности измерений является также высота. На каждые 10,5 метров давление у поверхности Земли падает с высотой на 1 мм ртутного столба, что весьма ощутимо уже в многоэтажках. А так как нахожусь я в одном из таких творений советской архитектуры на весьма ощутимом удалении от поверхности планеты и тем более ощутимом от уровня Балтийского моря, который и принят за уровень 0 метров. В общем, сопоставить данные своего барометра с данными прогноза погоды я могу весьма условно. С другой стороны, лично мне погрешность в 10 миллиметров ртутного столба не так интересна. Я знаю, что для моего дома нормой является примерно 752 мм, но это ничего не даёт, по большому счёту. Куда интереснее сами изменения давления, пусть и относительно более-менее условной цифры. Мы ведь знаем, что падение давления предвещает ухудшение погоды, а рост - приход антициклона с солнцем и ясным небом.
Что касается изменения колебаний давления, то по мне, так здесь они очень точные и позволяют улавливать перемещение на пару десятков сантиметров минимум. Так что при желании, можно узнать высоту своей местности над уровнем моря и, исходя из этого числа, построить на базе данного прибора альтиметр. Правда, давление ещё меняется в течение суток, так что не могу назвать такой альтиметр очень точным без постоянной калибровки по эталонному барометру на базе, но сделать можно. Мне же интереснее наблюдать погоду, так что для моих целей данный девайс вполне подойдёт.

И, да, барометр измеряет давление в гектапаскалях или миллибарах (это одно и то же). Если нужно вывести давление в привычных миллиметрах ртутного столба (а мне лично именно так и привычнее), то нужно домножать на коэффициент.

1 миллибар = 0,750062 мм рт. ст.

Как узнать высоту точки над уровнем моря?


Для этого рекомендую использовать программу Google Earth. К сожалению, в браузерной версии высота не отображается, а вот в программе, которая, кстати, интересна уже просто сама по себе, можно навести мышь на любую точку земной пверхности и в правом нижнем углу увидеть её высоту. Так высота площади перед Notre Dame de Paris, оказывается, составляет 36 метров над уровнем моря. К сожалению или к счастью, дорогой читатель, мы с вами не живём на Иль-де-ля-Сите, но ничто не мешает найти нам высоту любой другой интересной в данный момент координаты.



Скачать Google Earth Pro сейчас можно совершенно бесплатно вот по этой ссылке:

Подключение


Подключение ну очень простое. Но в комментариях примеров прошивок строго написано:

ПОДКЛЮЧАТЬ К НАПРЯЖЕНИЮ 3,3 В! НАПРЯЖЕНИЕ +5В МОЖЕТ ВЫВЕСТИ ПРИБОР ИЗ СТРОЯ!

Думаю, к их советам лучше прислушаться, так что я не стал экспериментировать и подключил сенсор к выводу +3,3 на ардуине, мало ли.

Следующая неприятность. В библиотеке порты для подключения уже прошиты, а значит для Arduino Nano нужно подключать SDA к A4 и SCL к A5 - только так.

Ссылка на библиотеку: https://github.com/sparkfun/BMP180_Breakout_Arduino_Library

Текст прошивки


//Скетч управляет работой BMP180 и выводит на компьютер
//значения атмосферного давления и температуру

// Увы, библиотека не позволяет настраивать пины для подключения
// Вот таблица для Arduino:
// Наименование Ардино/пины: SDA  SCL
// Nano, Uno, Redboard, Pro:  A4   A5
// Mega2560, Due:             20   21
// Leonardo:                   2    3

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;

void setup() 
{
  Serial.begin(9600);
  pressure.begin();
}

void loop() 
{
  char status;
  double T,P,p0,a;

  // Перед измерением давления нужно измерить температуру
  // Если чтение температуры успешно, функция вернёт время в миллисекундах для ожидания
  // Если произошла ошибка чтения, то вернётся 0
  status = pressure.startTemperature();
  if (status != 0) // Если пришёл не 0
  {
    // Ждём пришедшее число миллисекунд
    delay(status);

    // Записываем значение температуры в T
    // Функция вернёт 1, если чтение успешно, иначе 0
    status = pressure.getTemperature(T);
    if (status != 0) // если не 0 (то есть 1)
    {
      // Вывести значение температуры
      Serial.print("Temperature: ");
      Serial.print(T,2);
      Serial.print(" *C ");
      
      // Старт измерения давления
      // Параметр в скобках от 0 до 3 (чем точнее результат, тем дольше ожидание)
      // Если запрос выполнен успешно, возвращается число миллисекунд для ожидания
      // При неудачном исполнении возвращается 0 
      status = pressure.startPressure(3);
      if (status != 0) // если не 0
      {
        // Ожидаем вернувшееся число миллисекунд до завершения измерения
        delay(status);

        // Измеряем давление
        // Значение сохраняем в P, заметим, что для измерения требуется только что полученное T
        // Если температура стабильна, можно измерить её один раз и подставлять дальше, но я бы не стал так делать
        // Функция тоже возвращает 1, если всё успешно, 0, если что-то пошло не так
        status = pressure.getPressure(P,T);
        if (status != 0) // Если не 0
        {
          // Выводим результаты измерений
          Serial.print("Atm. pressure: ");
          Serial.print(P,2); // Выводим давление
          Serial.print(" mb, "); //...в миллибарах (они же гектапаскали)
          Serial.print(P*0.750062, 2);
          Serial.println("mm Hg");

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

}


Комментариев нет:

Отправить комментарий