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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Гайд по использованию датчика 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

См.также

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