Arduino:Примеры/Гайд по использованию датчика BMP180 с платой Arduino
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
![]() |
Черновик |
Содержание
Гайд по использованию датчика BMP180 с платой Arduino[1]
Эта статья рассказывает о том, как использовать барометрический датчик BMP180 вместе с платой Arduino, но она применима и для других похожих барометрических датчиков.
Описание
Барометрический датчик BMP-180 (модель GY-68) можно наблюдать на картинке ниже (вид спереди и сзади). Это очень маленький модуль размерами 1 мм на 1,1 мм.
Этот датчик измеряет абсолютное давление в воздухе вокруг себя. Диапазон измеряемых значений – от 300 до 1100 гектопаскалей (гПа) с точностью до 0,02 гПа. Кроме того, он умеет измерять высоту над уровнем моря и температуру.
Барометрический датчик BMP180 коммуницирует через интерфейс I2C. Это значит, что для «общения» с Arduino ему нужно всего 2 контакта.
Где купить?
Это очень дешевый датчик. Его можно купить на eBay примерно за 3 доллара.
Подключение контактов
В подключении датчика к Arduino ничего мудреного нет:
Схема
Схематически подключение датчика BMP180 к плате Arduino выглядит следующим образом:
Код
Чтобы управлять барометрическим датчиком BMP180, вам нужно установить библиотеку SFE_BMP180.
- Кликните здесь, чтобы скачать библиотеку. Затем ищите в загрузках ZIP-архив с соответствующим названием.
- Распакуйте этот архив. В результате у вас должна получиться папка под названием «BMP180_Breakout_Arduino_Library-master».
- Переименуйте папку на «BMP180_Breakout_Arduino_Library».
- Переместите ее в папку «libraries» IDE Arduino.
- Перезапустите 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 бод.
В нем должны появиться данные о высоте над уровнем моря, температуре, давлении и пр., считанные датчиком:
См.также
Внешние ссылки