BMP180 это датчик атмосферного давления с цифровым i2c интерфейсом

То есть этот датчик конвертирует в чиселки давление воздуха на него. И кстати это не обязательно может быть атмосферное давление. Можно померить например давление в закрытой бутылке, накачанной воздухом. Еще им можно мерить высоту — чем выше над землей тем меньше давление.

Распиновка синего BMP180

  1. VIN (не путать с IO на других версиях платы) — сюда можно подать питание 5 вольт — она идет на понижайку напряжения до 3.3 в.
  2. Сюда подается 3.3 вольта. , если есть. Причем подключать надо либо первый, либо этот. Китайцы молодцы.
  3. IO — на рисунке его нет, но на некоторых платах он присутствует. Он нужен для питания, если у нас в схеме сильно меньше 3.3 вольт — например 1.8 вольт. Если его подключаете, то не нужны VIN и 3.3 🙂
  4. Общий типа минус
  5. i2c clock подключается так:
    1. Uno, Pro / Pro Mini к А5
    2. Mega, Due к 21
    3. Leonardo, Pro Micro к 3
  6. i2c data так:
    1. Uno, Redboard, Pro / Pro Mini к А4
    2. Mega, Due к 20
    3. Leonardo, Pro Micro к 2

Библиотека Arduino для BMP180

Скачать тут https://github.com/sparkfun/BMP180_Breakout/archive/master.zip (или с нашего сайта тут BMP180_Breakout-master).  Там  много файлов, но нам нужна папка src. Ее переименовываем в SFE_BMP180 и закидываем в Libraries у Arduino.

BMP180_lib

В эту же папку SFE_BMP180 закидываем файл keywords.txt и каталог examples.

После этого идем Файл > Примеры > SFE_BMP180 > SFE_BMP180_example

Прошиваем, видим такое:

52bcc96ace395f58558b4567[1]

Разберемся  с кодом:

#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 секунд.
}