Датчик давления для Arduino: подключение, код и настройка

Иван Корнев·05.05.2026·6 мин

Для подключения цифрового датчика давления (например, BMP180 или BME280) к Arduino используйте интерфейс I2C: соедините пины SDA и SCL с аналоговыми входами A4 и A5 (на Uno) или соответствующими пинами на других платах. Питание подавайте строго 3.3 В. Для считывания данных установите библиотеку Adafruit Sensor и используйте готовые функции readPressure() и readTemperature().

Эти сенсоры позволяют измерять не только атмосферное давление, но и температуру, а при наличии точного эталона — вычислять высоту над уровнем моря. Ниже разберем выбор модуля, схему сборки и программную часть.

Оглавление

Выбор датчика: BMP180 против BME280

Для любительских проектов стандартом де-факто стали цифровые модули от Bosch Sensortec. Они компактны, энергоэффективны и общаются с микроконтроллером по шине I2C или SPI.

ХарактеристикаBMP180 (устаревший)BME280 (рекомендуемый)BMP280
Измеряемые величиныДавление, ТемператураДавление, Температура, ВлажностьДавление, Температура
Точность давления±0.12 гПа (высокая)±1 гПа (достаточная)±1 гПа
ИнтерфейсI2C / SPII2C / SPII2C / SPI
Напряжение питания1.8 – 3.6 В1.71 – 3.6 В1.71 – 3.6 В
СтоимостьНизкаяСредняяНизкая

Рекомендация: Если проект требует измерения влажности (например, домашняя метеостанция), выбирайте BME280. Если нужна только высота или давление — подойдет более дешевый BMP280. Модуль BMP180 считается устаревшим, но все еще широко доступен; его плюс — чуть более высокая точность в узком диапазоне, но он сложнее в калибровке.

Покупайте модули в виде готовых плат (breakout board), например, серии GY (GY-68 для BMP180, GY-BME280). Они уже содержат стабилизатор напряжения и подтягивающие резисторы для линий I2C, что позволяет безопасно подключать их к Arduino.

Схема подключения к Arduino (I2C)

Цифровые датчики BMP/BME используют протокол I2C. Это означает, что для подключения требуется всего 4 провода.

Распиновка для Arduino Uno / Nano

  • VCC3.3V (Внимание! Не подключайте к 5V, если на плате модуля нет линейного стабилизатора. Чип сенсора сгорит.)
  • GNDGND
  • SDA (Data) → A4
  • SCL (Clock) → A5

Распиновка для Arduino Mega 2560

  • VCC3.3V
  • GNDGND
  • SDAPin 20
  • SCLPin 21

Проверка напряжения: Большинство чипов BMP/BME работают только от 3.3 В. Если ваш модуль не имеет маркировки "5V tolerant" или встроенного LDO-стабилизатора, подключение к 5 В выведет его из строя мгновенно. Используйте пин 3.3V на Arduino.

Если вы используете несколько устройств на одной шине I2C, убедитесь, что их адреса не конфликтуют. Стандартный адрес BMP180/BMP280 — 0x77. У BME280 адрес может быть 0x76 или 0x77 в зависимости от состояния пина SDO (подтянут к земле или к питанию).

Программная настройка и библиотеки

Для работы с сенсором не нужно писать драйвер с нуля. Используйте проверенные библиотеки от Adafruit, которые абстрагируют сложную математику компенсаций.

  1. Откройте Arduino IDE.
  2. Перейдите в СкетчПодключить библиотекуУправлять библиотеками.
  3. В поиске введите Adafruit BMP280 Library (подходит и для BMP180, и для BMP280) или Adafruit BME280 Library.
  4. Нажмите Установить. IDE автоматически предложит установить зависимую библиотеку Adafruit Unified Sensor — согласитесь.

Готовый код для считывания данных

Ниже приведен универсальный пример для BMP280/BMP180. Код считывает давление, температуру и вычисляет приблизительную высоту.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

// Создаем объект датчика
Adafruit_BMP280 bmp; 

// Адрес I2C (по умолчанию 0x77 для BMP180/280, 0x76 для некоторых BME280)
#define BMP_ADDR 0x77 

void setup() {
  Serial.begin(9600);
  Serial.println(F("Инициализация датчика давления..."));

  // Инициализация датчика
  if (!bmp.begin(BMP_ADDR)) {
    Serial.println(F("Ошибка: Датчик не найден. Проверьте проводку!"));
    while (1);
  }
  
  // Настройка режима работы (стандартный)
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Режим работы */
                  Adafruit_BMP280::SAMPLING_X2,     /* Температура */
                  Adafruit_BMP280::SAMPLING_X16,    /* Давление */
                  Adafruit_BMP280::FILTER_X16,      /* Фильтр шумов */
                  Adafruit_BMP280::STANDBY_MS_500); /* Интервал сна */
                  
  Serial.println("Датчик готов.");
}

void loop() {
  // Считывание данных
  float temperature = bmp.readTemperature();
  float pressure = bmp.readPressure() / 100.0F; // Перевод Па в гПа (гектопаскали)
  
  // Расчет высоты относительно уровня моря (требуется знание давления на уровне моря)
  // 1013.25 гПа - стандартное атмосферное давление
  float altitude = bmp.readAltitude(1013.25); 

  Serial.print("Температура: ");
  Serial.print(temperature);
  Serial.println(" °C");

  Serial.print("Давление: ");
  Serial.print(pressure);
  Serial.println(" гПа");

  Serial.print("Высота: ");
  Serial.print(altitude);
  Serial.println(" м");

  Serial.println("---");
  delay(2000); // Пауза 2 секунды
}

Как это работает:

  1. bmp.begin() проверяет связь по шине I2C.
  2. setSampling() настраивает точность и скорость. Чем выше сэмплинг (например, X16), тем точнее данные, но дольше измерение.
  3. readPressure() возвращает значение в Паскалях. Делим на 100, чтобы получить привычные гектопаскали (гПа) или миллибары (мбар).

Калибровка и повышение точности

«Из коробки» датчики показывают относительную высоту, исходя из стандартного давления 1013.25 гПа. Поскольку реальное атмосферное давление меняется в зависимости от погоды, показания высоты будут «плавать».

1. Коррекция по текущему давлению

Чтобы получать точную высоту, нужно знать текущее давление на уровне моря в вашем регионе.

  • Узнайте актуальное давление в вашем городе через погодный сервис (в гПа).
  • Замените число 1013.25 в функции bmp.readAltitude(...) на полученное значение.

2. Фильтрация шумов

Датчики чувствительны к электрическим помехам и турбулентности воздуха. Для стабилизации показаний используйте простое скользящее среднее:

float getSmoothedPressure(int samples = 10) {
  float sum = 0;
  for (int i = 0; i < samples; i++) {
    sum += bmp.readPressure();
    delay(50); // Небольшая задержка между замерами
  }
  return (sum / samples) / 100.0F;
}

Тест на герметичность: Если вы используете датчик для контроля давления в замкнутом объеме (например, в корпусе), убедитесь, что есть отверстие для выравнивания давления с атмосферой, если только вы не измеряете избыточное давление специально.

Работа с аналоговыми датчиками (MPX5700)

Если вам нужно измерять высокое давление (жидкости, газы в трубах, пневматика), барометрические сенсоры не подойдут. Используйте аналоговые датчики, такие как серия MPX5xxx от NXP.

Отличия:

  • Выход: Аналоговый сигнал (0–5 В).
  • Подключение: Пин OUT к аналоговому входу Arduino (A0–A5).
  • Питание: Обычно 5 В.

Пример кода для MPX5700AP (до 700 кПа)

const int sensorPin = A0;
const float Vcc = 5.0; // Напряжение питания

void setup() {
  Serial.begin(9600);
}

void loop() {
  int rawValue = analogRead(sensorPin);
  float voltage = rawValue * (Vcc / 1023.0);
  
  // Формула из даташита MPX5700: Vout = Vs * (0.009 * P + 0.04)
  // Где P - давление в кПа. Выражаем P:
  // P = (Vout/Vs - 0.04) / 0.009
  
  float pressure_kPa = (voltage / Vcc - 0.04) / 0.009;
  
  // Ограничиваем диапазон, так как датчик линейен только в определенных пределах
  if (pressure_kPa < 0) pressure_kPa = 0;
  if (pressure_kPa > 700) pressure_kPa = 700;

  Serial.print("Давление: ");
  Serial.print(pressure_kPa);
  Serial.println(" кПа");
  
  delay(500);
}

Частые ошибки при подключении

  1. Путаница с напряжением (3.3В vs 5В). Самая частая причина поломки. Чипы BMP/BME — 3.3-вольтовые. Если вы подключили VCC к 5V на Arduino без промежуточного стабилизатора на модуле, датчик выйдет из строя.
  2. Перепутаны линии SDA и SCL. Хотя некоторые современные платы имеют защиту, классическая ошибка — перепутать желтый (SDA) и зеленый (SCL) провода. Данные передаваться не будут.
  3. Отсутствие подтягивающих резисторов. Шина I2C требует подтяжки линий к питанию. На большинстве готовых модулей (GY-серия) они уже есть. Если вы подключаете голый чип, добавьте резисторы 4.7–10 кОм от SDA и SCL к VCC (3.3V).
  4. Конфликт адресов. Если к Arduino подключены два устройства с адресом 0x77, работать будет только одно (или ни одного). Проверьте адрес сканером I2C.

FAQ: Вопросы и ответы

В: Можно ли подключить BMP180 к 5-вольтовой Arduino напрямую? О: Только если на модуле есть стабилизатор напряжения (LDO) и преобразователь уровней для линий данных. Если модуль маленький и имеет только 4 пина без дополнительных компонентов — подключайте только к 3.3V.

В: Почему показания высоты скачут на ±10 метров? О: Атмосферное давление нестабильно. Изменение погоды меняет давление на уровне моря. Для точного альтиметра нужно постоянно обновлять опорное давление (через интернет или ручной ввод). Также на показания влияют сквозняки и нагрев самого датчика от окружающих компонентов.

В: Как узнать I2C-адрес датчика, если он не работает? О: Загрузите в Arduino скетч I2C Scanner (доступен в примерах многих библиотек или в интернете). Он просканирует шину и выведет в монитор порта все найденные адреса.

В: Подходит ли этот датчик для измерения давления в шинах автомобиля? О: Нет. BMP/BME измеряют около 1 атмосферы (100 кПа). Давление в шинах — 2–3 атмосферы (200–300 кПа) и выше. Для шин нужны специализированные датчики серии MPX5500 или готовые TPMS-сенсоры.