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).
Это скетч с подробными комментариями, в которых объясняется, как датчик считывает давление и температуру, а также рассчитывает высоту над уровнем моря.
/* Скетч для библиотеки 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 бод.
В нем должны появиться данные о высоте над уровнем моря, температуре, давлении и пр., считанные датчиком:
См.также
Внешние ссылки
- Страницы с устаревшим атрибутом подсветки синтаксиса «enclose»
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Черновик
- Надо доработать
- Черновой вариант статьи
- Черновой вариант
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino