Arduino:Примеры/Гайд по использованию датчика BMP180 с платой Arduino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Гайд по использованию датчика BMP180 с платой Arduino[1]

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

Описание

Барометрический датчик BMP-180 (модель GY-68) можно наблюдать на картинке ниже (вид спереди и сзади). Это очень маленький модуль размерами 1 мм на 1,1 мм.

Этот датчик измеряет абсолютное давление в воздухе вокруг себя. Диапазон измеряемых значений – от 300 до 1100 гектопаскалей (гПа) с точностью до 0,02 гПа. Кроме того, он умеет измерять высоту над уровнем моря и температуру.

Барометрический датчик BMP180 коммуницирует через интерфейс I2C. Это значит, что для «общения» с Arduino ему нужно всего 2 контакта.

Где купить?

Это очень дешевый датчик. Его можно купить на eBay примерно за 3 доллара.

Подключение контактов

В подключении датчика к Arduino ничего мудреного нет:

  • Контакт Vin на BMP180 – к 5V на Arduino
  • GND – к GND
  • SCL – к A5
  • SDA – к A4

Схема

Схематически подключение датчика BMP180 к плате Arduino выглядит следующим образом:

Код

Чтобы управлять барометрическим датчиком BMP180, вам нужно установить библиотеку SFE_BMP180.

  1. Кликните здесь, чтобы скачать библиотеку. Затем ищите в загрузках ZIP-архив с соответствующим названием.
  2. Распакуйте этот архив. В результате у вас должна получиться папка под названием «BMP180_Breakout_Arduino_Library-master».
  3. Переименуйте папку на «BMP180_Breakout_Arduino_Library».
  4. Переместите ее в папку «libraries» IDE Arduino.
  5. Перезапустите IDE Arduino.

Теперь открываем в IDE Arduino нужный код. Это можно сделать, скопировав и вставив код, показанный ниже, или кликнув в IDE Arduino на Файл > Примеры > SparkfunBMP180 > SFE_BMP180_example (File > Examples > SparkfunBMP180 > SFE_BMP180_example).

Это скетч с подробными комментариями, в которых объясняется, как датчик считывает давление и температуру, а также рассчитывает высоту над уровнем моря.

/* Скетч для библиотеки SFE_BMP180 

Этот скетч демонстрирует, как использовать библиотеку SFE_BMP180,
чтобы считывать данные с барометрического датчика Bosch BMP180.
https://www.sparkfun.com/products/11824

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

Перед считываем данных о давлении вам нужно сосчитать 
данные о температуре. Это делается при помощи функций 
startTemperature() and getTemperature(). Результат возвращается
в градусах Цельсия. 

Теперь вы можете сосчитать данные о давлении. Это делается 
при помощи функций startPressure() и getPressure(). 
Результат возвращается в миллибарах (мбар), они же гектопаскали (гПа).

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

Если вы хотите измерить высоту над уровнем моря, то вам нужно знать 
информацию о давлении. Это может быть или средний показатель 
давления на уровне моря, или данные о давлении, измеренные ранее.
Будьте готовы к тому, что итоговое значение может быть больше 
или меньше базовой величины. Расчет высоты над уровнем моря 
выполняется функцией altitude().

Подключение:

- (GND) – к GND
+ (VDD) – к 3.3V

ВНИМАНИЕ: Не подключайте контакт «+» к 5V, т.к. это повредит датчик!

Кроме того, подключите контакты датчика (SCL и SDA) к Arduino.
На разных Arduino для шины I2C используются разные контакты:

Модель               SDA  SCL
Uno, Redboard, Pro   A4   A5
Mega2560, Due        20   21
Leonardo             2    3

Контакт IO (VDDIO) оставьте неподключенным. Этот контакт 
используется для подключения BMP180 к системам 
с пониженной вольтовой логикой (вроде 1,8-вольтовой).

Желаем приятно провести время! –Ваши друзья из SpakFun

Библиотека SFE_BMP180 использует уравнения, в которых используются числа с плавающей точкой. Они разработаны проектом
Weather Station Data Logger (http://wmrx00.sourceforge.net/).

Этот скетч распространяется по «пивной лицензии». 
Вы можете делать с ним что угодно. Абсолютно все, кроме шуток. 
Если этот скетч окажется полезным, при случае угостите меня пивом.

V10 Mike Grusin, SparkFun Electronics 10/24/2013
*/

// подключаем к скетчу две библиотеки, SFE_BMP180 и Wire; Wire –
// это стандартная библиотека, идущая в комплекте с IDE Arduino.
#include <SFE_BMP180.h>
#include <Wire.h>

// создаем экземпляр класса SFE_BMP180 и называем его «pressure»:
SFE_BMP180 pressure;

// это высота над уровнем моря в штаб-квартире SparkFun, в Боулдере;
// указана в метрах:
#define ALTITUDE 1655.0 

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;

  // блок loop() считывает давление каждые 10 секунд

  // если вам нужно давление, приведенное к уровню моря 
  // (т.е. давление, используемое в прогнозах погоды),
  // вам нужно знать, уровень моря в месте, 
  // где вы измеряете давление;
  
  // в данном скетче мы используем константу ALTITUDE:
  
  Serial.println();
  Serial.print("provided altitude: ");
  //  "заданная высота над уровнем моря"
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");  //  " метров, "
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");   //  " футов, "
  
  // если вы хотите измерить высоту над уровнем моря, 
  // то вам нужно знать информацию о давлении; расчет высоты
  // над уровнем моря показан в конце скетча

  // чтобы рассчитать давление, сначала нужно измерить температуру

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

    // извлекаем данные о температуре; обратите внимание, 
    // что измеренные данные хранятся в переменной «T»;
    // если функция будет выполнена успешно, она вернет «1»,
    // а если нет, то «0» 

    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // печатаем измеренную температуру:
      Serial.print("temperature: ");  //  "температура: "
      Serial.print(T,2);
      Serial.print(" deg C, ");  //  " градусов Цельсия, "
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");  //  " градусов Фаренгейта"
      
      // запускаем измерение давления; параметр отвечает 
      // за частоту дискретизации данных; допустимые значения 
      // для параметра – от «0» до «3», где «3» - это
      // самое высокое разрешение, но и самая долгая задержка;
      // если функция будет выполнена успешно, она вернет 
      // количество миллисекунд, потребовавшихся на ожидание, 
      // а если неуспешно, то «0»:
      status = pressure.startPressure(3);
      if (status != 0)
      {
        // ждем завершения измерения:
        delay(status);

        // извлекаем данные о давлении; обратите внимание, 
        // что измеренные данные хранятся в переменной «P»;
        // также обратите внимание, что этой функции 
        // требуются данные о температуре (переменная «T»);
        // если температура стабильна, то для многократного
        // измерения давления вы можете измерить температуру
        // всего один раз;

        // если функция будет выполнена успешно, она вернет «1»,
        // а если нет, то «0»:

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // печатаем результат:
          Serial.print("absolute pressure: ");
          // "абсолютное давление: "
          Serial.print(P,2);
          Serial.print(" mb, ");  // " мбар, "
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");  // " дюймов рт. ст."

          // датчик давления возвращает данные об абсолютном давлении,
          // которые могут варьироваться в зависимости от высоты 
          // над уровнем моря; чтобы убрать эффект от высоты 
          // над уровнем моря, используйте функцию sealevel(),
          // указав в ней высоту над уровнем моря для вашей локации

          // показатель давления без учета высоты над уровнем моря
          // используется, как правило, в прогнозах погоды;
          // параметры: P = абсолютное давление в миллибарах,
          // ALTITUDE = высота над уровнем моря в метрах;
          // результат: p0 = давление без учета
          // высоты над уровнем моря в миллибарах

          p0 = pressure.sealevel(P,ALTITUDE);
          // здесь, в Боулдере, 1655 метров над уровнем моря
          Serial.print("relative (sea-level) pressure: ");
          // относительное давление (приведенное к уровню моря)
          Serial.print(p0,2);
          Serial.print(" mb, ");  // " мбар, "
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");  // " дюймов рт. ст."

          // кроме того, зная давление, вы можете определить 
          // высоту над уровнем моря; 
          // это выполняется при помощи функции altitude();
          // параметры: P = абсолютное давление в миллибарах,
          // p0 = базовое давление в миллибарах
          // результат: a = высота над уровнем моря в метрах

          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          // "расчитанная высота над уровнем моря: "
          Serial.print(a,0);
          Serial.print(" meters, "); // " метров, "
          Serial.print(a*3.28084,0);
          Serial.println(" feet"); // " футов"
        }
        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-секундная пауза
}

Настройка данных о высоте над уровнем моря

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

#define ALTITUDE 1655.0

Демонстрация

После загрузки кода откройте монитор порта на скорости 9600 бод.

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

См.также

Внешние ссылки