Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Ambox content.png Черновик


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

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

Описание

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

Barometric bmp180.jpg

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

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

Где купить?

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

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

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

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

Схема

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

Bmp180-barometris-sensor bb.png

Код

Чтобы управлять барометрическим датчиком 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).

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

  1. /* Скетч для библиотеки SFE_BMP180
  2.  
  3. Этот скетч демонстрирует, как использовать библиотеку SFE_BMP180,
  4. чтобы считывать данные с барометрического датчика Bosch BMP180.
  5. https://www.sparkfun.com/products/11824
  6.  
  7. Как и большинство датчиков, BMP180 измеряет абсолютное давление.
  8. По сути, это давление воздуха, находящегося вокруг датчика, и оно
  9. может меняться в зависимости от погоды и высоты над уровнем моря.
  10.  
  11. Перед считываем данных о давлении вам нужно сосчитать
  12. данные о температуре. Это делается при помощи функций
  13. startTemperature() and getTemperature(). Результат возвращается
  14. в градусах Цельсия.
  15.  
  16. Теперь вы можете сосчитать данные о давлении. Это делается
  17. при помощи функций startPressure() и getPressure().
  18. Результат возвращается в миллибарах (мбар), они же гектопаскали (гПа).
  19.  
  20. Если вы отслеживаете погодные паттерны, то, возможно,
  21. захотите исключить эффект от высоты над уровнем моря. В результате
  22. у вас будут данные о давлении, которые можно будет сравнить
  23. с данными из других мест. Для этого в SFE_BMP180
  24. есть функция sealevel(). С ее помощью вы задаете высоту
  25. над уровнем моря для локации, где замеряете давление.
  26.  
  27. Если вы хотите измерить высоту над уровнем моря, то вам нужно знать
  28. информацию о давлении. Это может быть или средний показатель
  29. давления на уровне моря, или данные о давлении, измеренные ранее.
  30. Будьте готовы к тому, что итоговое значение может быть больше
  31. или меньше базовой величины. Расчет высоты над уровнем моря
  32. выполняется функцией altitude().
  33.  
  34. Подключение:
  35.  
  36. - (GND) – к GND
  37. + (VDD) – к 3.3V
  38.  
  39. ВНИМАНИЕ: Не подключайте контакт «+» к 5V, т.к. это повредит датчик!
  40.  
  41. Кроме того, подключите контакты датчика (SCL и SDA) к Arduino.
  42. На разных Arduino для шины I2C используются разные контакты:
  43.  
  44. Модель               SDA  SCL
  45. Uno, Redboard, Pro   A4   A5
  46. Mega2560, Due        20   21
  47. Leonardo             2    3
  48.  
  49. Контакт IO (VDDIO) оставьте неподключенным. Этот контакт
  50. используется для подключения BMP180 к системам
  51. с пониженной вольтовой логикой (вроде 1,8-вольтовой).
  52.  
  53. Желаем приятно провести время! –Ваши друзья из SpakFun
  54.  
  55. Библиотека SFE_BMP180 использует уравнения, в которых используются числа с плавающей точкой. Они разработаны проектом
  56. Weather Station Data Logger (http://wmrx00.sourceforge.net/).
  57.  
  58. Этот скетч распространяется по «пивной лицензии».
  59. Вы можете делать с ним что угодно. Абсолютно все, кроме шуток.
  60. Если этот скетч окажется полезным, при случае угостите меня пивом.
  61.  
  62. V10 Mike Grusin, SparkFun Electronics 10/24/2013
  63. */
  64.  
  65. // подключаем к скетчу две библиотеки, SFE_BMP180 и Wire; Wire –
  66. // это стандартная библиотека, идущая в комплекте с IDE Arduino.
  67. #include <SFE_BMP180.h>
  68. #include <Wire.h>
  69.  
  70. // создаем экземпляр класса SFE_BMP180 и называем его «pressure»:
  71. SFE_BMP180 pressure;
  72.  
  73. // это высота над уровнем моря в штаб-квартире SparkFun, в Боулдере;
  74. // указана в метрах:
  75. #define ALTITUDE 1655.0
  76.  
  77. void setup()
  78. {
  79.   Serial.begin(9600);
  80.   Serial.println("REBOOT");  //  "ПЕРЕЗАГРУЗКА"
  81.  
  82.   // инициализируем датчик (важно извлечь калибровочные данные,
  83.   // хранящиеся в устройстве):
  84.   if (pressure.begin())
  85.     Serial.println("BMP180 init success");
  86.     // "Инициализация BMP180 прошла успешно"
  87.   else
  88.   {
  89.     // упс, что-то пошло не так!
  90.     // как правило, так происходит из-за проблем с подключением
  91.     // (о том, как подключить датчик правильно, читайте выше):
  92.     Serial.println("BMP180 init fail\n\n");
  93.     // "Инициализация BMP180 не удалась"
  94.     while(1); // вечная пауза
  95.   }
  96. }
  97.  
  98. void loop()
  99. {
  100.   char status;
  101.   double T,P,p0,a;
  102.  
  103.   // блок loop() считывает давление каждые 10 секунд
  104.  
  105.   // если вам нужно давление, приведенное к уровню моря
  106.   // (т.е. давление, используемое в прогнозах погоды),
  107.   // вам нужно знать, уровень моря в месте,
  108.   // где вы измеряете давление;
  109.  
  110.   // в данном скетче мы используем константу ALTITUDE:
  111.  
  112.   Serial.println();
  113.   Serial.print("provided altitude: ");
  114.   //  "заданная высота над уровнем моря"
  115.   Serial.print(ALTITUDE,0);
  116.   Serial.print(" meters, ");  //  " метров, "
  117.   Serial.print(ALTITUDE*3.28084,0);
  118.   Serial.println(" feet");   //  " футов, "
  119.  
  120.   // если вы хотите измерить высоту над уровнем моря,
  121.   // то вам нужно знать информацию о давлении; расчет высоты
  122.   // над уровнем моря показан в конце скетча
  123.  
  124.   // чтобы рассчитать давление, сначала нужно измерить температуру
  125.  
  126.   // запускаем измерение температуры; если функция
  127.   // будет выполнена успешно, она вернет количество
  128.   // миллисекунд, потребовавшихся на измерение;
  129.   // а если неуспешно, то вернет «0»:
  130.   status = pressure.startTemperature();
  131.   if (status != 0)
  132.   {
  133.     // ждем, когда завершится измерение:
  134.     delay(status);
  135.  
  136.     // извлекаем данные о температуре; обратите внимание,
  137.     // что измеренные данные хранятся в переменной «T»;
  138.     // если функция будет выполнена успешно, она вернет «1»,
  139.     // а если нет, то «0»
  140.  
  141.     status = pressure.getTemperature(T);
  142.     if (status != 0)
  143.     {
  144.       // печатаем измеренную температуру:
  145.       Serial.print("temperature: ");  //  "температура: "
  146.       Serial.print(T,2);
  147.       Serial.print(" deg C, ");  //  " градусов Цельсия, "
  148.       Serial.print((9.0/5.0)*T+32.0,2);
  149.       Serial.println(" deg F");  //  " градусов Фаренгейта"
  150.      
  151.       // запускаем измерение давления; параметр отвечает
  152.       // за частоту дискретизации данных; допустимые значения
  153.       // для параметра – от «0» до «3», где «3» - это
  154.       // самое высокое разрешение, но и самая долгая задержка;
  155.       // если функция будет выполнена успешно, она вернет
  156.       // количество миллисекунд, потребовавшихся на ожидание,
  157.       // а если неуспешно, то «0»:
  158.       status = pressure.startPressure(3);
  159.       if (status != 0)
  160.       {
  161.         // ждем завершения измерения:
  162.         delay(status);
  163.  
  164.         // извлекаем данные о давлении; обратите внимание,
  165.         // что измеренные данные хранятся в переменной «P»;
  166.         // также обратите внимание, что этой функции
  167.         // требуются данные о температуре (переменная «T»);
  168.         // если температура стабильна, то для многократного
  169.         // измерения давления вы можете измерить температуру
  170.         // всего один раз;
  171.  
  172.         // если функция будет выполнена успешно, она вернет «1»,
  173.         // а если нет, то «0»:
  174.  
  175.         status = pressure.getPressure(P,T);
  176.         if (status != 0)
  177.         {
  178.           // печатаем результат:
  179.           Serial.print("absolute pressure: ");
  180.           // "абсолютное давление: "
  181.           Serial.print(P,2);
  182.           Serial.print(" mb, ");  // " мбар, "
  183.           Serial.print(P*0.0295333727,2);
  184.           Serial.println(" inHg");  // " дюймов рт. ст."
  185.  
  186.           // датчик давления возвращает данные об абсолютном давлении,
  187.           // которые могут варьироваться в зависимости от высоты
  188.           // над уровнем моря; чтобы убрать эффект от высоты
  189.           // над уровнем моря, используйте функцию sealevel(),
  190.           // указав в ней высоту над уровнем моря для вашей локации
  191.  
  192.           // показатель давления без учета высоты над уровнем моря
  193.           // используется, как правило, в прогнозах погоды;
  194.           // параметры: P = абсолютное давление в миллибарах,
  195.           // ALTITUDE = высота над уровнем моря в метрах;
  196.           // результат: p0 = давление без учета
  197.           // высоты над уровнем моря в миллибарах
  198.  
  199.           p0 = pressure.sealevel(P,ALTITUDE);
  200.           // здесь, в Боулдере, 1655 метров над уровнем моря
  201.           Serial.print("relative (sea-level) pressure: ");
  202.           // относительное давление (приведенное к уровню моря)
  203.           Serial.print(p0,2);
  204.           Serial.print(" mb, ");  // " мбар, "
  205.           Serial.print(p0*0.0295333727,2);
  206.           Serial.println(" inHg");  // " дюймов рт. ст."
  207.  
  208.           // кроме того, зная давление, вы можете определить
  209.           // высоту над уровнем моря;
  210.           // это выполняется при помощи функции altitude();
  211.           // параметры: P = абсолютное давление в миллибарах,
  212.           // p0 = базовое давление в миллибарах
  213.           // результат: a = высота над уровнем моря в метрах
  214.  
  215.           a = pressure.altitude(P,p0);
  216.           Serial.print("computed altitude: ");
  217.           // "расчитанная высота над уровнем моря: "
  218.           Serial.print(a,0);
  219.           Serial.print(" meters, "); // " метров, "
  220.           Serial.print(a*3.28084,0);
  221.           Serial.println(" feet"); // " футов"
  222.         }
  223.         else Serial.println("error retrieving pressure measurement\n");
  224.         // "ошибка при извлечении данных о давлении"
  225.       }
  226.       else Serial.println("error starting pressure measurement\n");
  227.       // "ошибка при запуске измерения давления"
  228.     }
  229.     else Serial.println("error retrieving temperature measurement\n");
  230.     // "ошибка при извлечении данных о температуре"
  231.   }
  232.   else Serial.println("error starting temperature measurement\n");
  233.   // "ошибка при запуске измерения температуры"
  234.   delay(5000);  // 5-секундная пауза
  235. }

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

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

#define ALTITUDE 1655.0

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

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

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

Serial-monitor.png

См.также

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

  1. randomnerdtutorials.com - Guide for BMP180 Barometric Sensor with Arduino