BMP180 это датчик атмосферного давления с цифровым i2c интерфейсом
То есть этот датчик конвертирует в чиселки давление воздуха на него. И кстати это не обязательно может быть атмосферное давление. Можно померить например давление в закрытой бутылке, накачанной воздухом. Еще им можно мерить высоту — чем выше над землей тем меньше давление.
Распиновка синего BMP180
- VIN (не путать с IO на других версиях платы) — сюда можно подать питание 5 вольт — она идет на понижайку напряжения до 3.3 в.
- Сюда подается 3.3 вольта. , если есть. Причем подключать надо либо первый, либо этот. Китайцы молодцы.
- IO — на рисунке его нет, но на некоторых платах он присутствует. Он нужен для питания, если у нас в схеме сильно меньше 3.3 вольт — например 1.8 вольт. Если его подключаете, то не нужны VIN и 3.3 🙂
- Общий типа минус
- i2c clock подключается так:
- Uno, Pro / Pro Mini к А5
- Mega, Due к 21
- Leonardo, Pro Micro к 3
- i2c data так:
- Uno, Redboard, Pro / Pro Mini к А4
- Mega, Due к 20
- Leonardo, Pro Micro к 2
Библиотека Arduino для BMP180
Скачать тут https://github.com/sparkfun/BMP180_Breakout/archive/master.zip (или с нашего сайта тут BMP180_Breakout-master). Там много файлов, но нам нужна папка src. Ее переименовываем в SFE_BMP180 и закидываем в Libraries у Arduino.
В эту же папку SFE_BMP180 закидываем файл keywords.txt и каталог examples.
После этого идем Файл > Примеры > SFE_BMP180 > SFE_BMP180_example
Прошиваем, видим такое:
Разберемся с кодом:
#include <SFE_BMP180.h>
#include <Wire.h>
// Объявим переменную для доступа к SFE_BMP180:
SFE_BMP180 pressure;
#define ALTITUDE 1655.0 // высота над уровнем моря по приколу в метрах
void setup()
{
Serial.begin(9600);
Serial.println("REBOOT");
// инициализация
if (pressure.begin())
Serial.println("BMP180 init ok");
else
{
// Если мы тут то что-то не срослось. Как правило косяки с подключением
Serial.println("BMP180 init fail\n\n");
while(1); // зависаем
}
}
void loop()
{
char status;
double T,P,p0,a;
// Если вы хотите знать давление воздуха, откорректированное по уровню моря, которое обычно используется в прогнозах погоды
// Вам надо знать уровень моря в вашей местности где проводится замер
// Ее и надо указать в константе ALTITUDE в начале кода
Serial.println();
Serial.print("Уровень моря: ");
Serial.print(ALTITUDE,0);
Serial.print(" метров, ");
Serial.print(ALTITUDE*3.28084,0);
Serial.println(" футов");
// Если вы хотите наоборот узнать высоту над уровнем моря, а давление вам известно
// надо указать текущее атмосферное давление. Как это сделать написано в конце кода.
// Так как давление зависит каким-тоо боком от температуры, надо сначала узнать температуру
// В BMP180 есть встроенный термометр. Замер температуры занимает некоторое время.
// Если все ровно, pressure.startTemperature вернет в status количество милисекунд,
// которое нужно подождать для замера температуры
// Если какой-то косяк с проводами, вернет 0
status = pressure.startTemperature();
if (status != 0)
{
// ждем:
delay(status);
// Получаем температуру, засовываем ее в переменную T:
// Функция вернет 1 если все ОК, 0 если не ОК
status = pressure.getTemperature(T);
if (status != 0)
{
// пишем температуру:
Serial.print("температура: ");
Serial.print(T,2);
Serial.print(" градусов C, "); // в цельсиях
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(" градусов F"); // в фаренгейтах
// Определяем атм. давление:
// Параметр указывает разрешение, от 0 до 3 (чем больше разрешение, тем выше точность, тем дольше ждать).
// Если все ровно, pressure.startPressure вернет в status количество милисекунд,
// которое нужно подождать для замера атм. давления
// Если какой-то косяк то вернет 0
status = pressure.startPressure(3);
if (status != 0)
{
// ждем окончания замера:
delay(status);
// Теперь можно получить давление в переменную P.
//Функция вернет 1 если все ОК, 0 если не ОК.
status = pressure.getPressure(P,T);
if (status != 0)
{
// выводим все:
Serial.print("абсолютное давление: ");
Serial.print(P,2);
Serial.print(" миллибар, ");
Serial.print(P*0.0295333727,2);
Serial.println(" дюймов ртутного столба");
// датчик возвращает атм. давление, которое изменяется в зависимости от высоты датчика.
// Если мы хотим как в прогнозе погоды, то нужно сделать сомнительные вычисления
// Параметры: P = давленик с датчика в миллибарах, ALTITUDE = высота над уровнем моря в метрах.
// Результат: p0 = давление, откорректированное по уровню моря
p0 = pressure.sealevel(P,ALTITUDE);
Serial.print("Давление по уровню моря: ");
Serial.print(p0,2);
Serial.print(" миллибар, ");
Serial.print(p0*0.0295333727,2);
Serial.println("дюймов ртутного столба");
// Или если вы хотите сделать наоборот и определить высоту над уровнем моря по известному давлению,
// Parameters: P = давление с датчика в миллибарах, p0 = давление, откорректированное по уровню моря.
// Результат: a = высота над уровнем моря в метрах.
a = pressure.altitude(P,p0);
Serial.print("рассчитанная высота над уровнем моря: ");
Serial.print(a,0);
Serial.print(" метров, ");
Serial.print(a*3.28084,0);
Serial.println(" футов");
}
else Serial.println("ошибка получение давления\n");
}
else Serial.println("ошибка запуска получения давления\n");
}
else Serial.println("ошибка получения температуры\n");
}
else Serial.println("ошибка запуска получения температуры\n");
delay(5000); // пауза 5 секунд.
}





![52bcc96ace395f58558b4567[1]](http://skproj.ru/wp-content/uploads/2015/07/52bcc96ace395f58558b45671-150x150.png)
Добавить комментарий