BME280 и BMP280: различия и подключение к Arduino и ESP32

BME280 и BMP280: различия и подключение к Arduino и ESP32

Подробное руководство по BME280 и BMP280: температура, влажность, давление, различия чипов, модули 4 и 6 пинов, I2C/SPI, питание 3.3/5 В, адреса 0x76/0x77, схемы и код для Arduino и ESP32

BME280 и BMP280 — одни из самых удобных датчиков для метеостанций, домашних дисплеев, логгеров, теплиц, высотомеров и IoT-проектов. Они маленькие, цифровые, не требуют аналоговой калибровки в каждом скетче и подключаются к контроллеру двумя проводами I2C.

Но вокруг них много путаницы. Продавец может подписать карточку «BME280», а на плате окажется BMP280. Модуль на 4 пина иногда работает от 5 В, а такой же визуально похожий — только от 3,3 В. Контакты SCL и SDA на шестипиновом модуле могут быть не только I2C, но и линиями SPI. А ошибка Could not find a valid BME280 sensor часто означает не сломанный датчик, а неверный I2C-адрес: 0x76 вместо 0x77.

Разберём всё по порядку.

BME280 и BMP280: главное отличие

ВозможностьBMP280BME280
ТемператураДаДа
Атмосферное давлениеДаДа
Относительная влажностьНетДа
ИнтерфейсыI2C и SPII2C и SPI
Типичное применениеБарометр, высотомер, компенсация давленияМетеостанция, климат, теплица, домашний мониторинг
Совместимость библиотекНужна библиотека BMP280 или универсальнаяНужна библиотека BME280 или универсальная
BMP280vsBME280

 

Главное правило простое:

  • нужен только температурный датчик и барометр — BMP280 достаточно;
  • нужна ещё и влажность — покупай BME280;
  • если в проекте рассчитан вывод %RH, BMP280 не подойдёт физически: в нём нет чувствительного элемента влажности.

Что именно измеряют датчики

Температура

Оба датчика показывают температуру самого корпуса микросхемы. Если модуль стоит рядом с ESP32, стабилизатором, экраном или внутри закрытого корпуса, он часто покажет температуру выше, чем в комнате. Это не поломка: датчик слегка нагревается от окружающей электроники.

Для домашней метеостанции выноси BME280/BMP280 дальше от тёплых компонентов и не закрывай его герметично. Для измерения температуры воздуха в корпусе полезно сделать вентиляционные отверстия, но защитить плату от прямого света, воды и пыли.

Атмосферное давление

Датчик измеряет абсолютное давление в точке установки. На уровне моря стандартное давление принято считать около 1013,25 гПа, но реальное значение зависит от погоды и высоты над уровнем моря.

Давление удобно использовать для:

  • наблюдения за погодной тенденцией;
  • оценки высоты и изменения высоты;
  • компенсации показаний других датчиков;
  • построения графика давления в домашней метеостанции.

Не путай абсолютное давление с тем, которое показывают в прогнозе погоды. Сервисы обычно приводят давление к уровню моря. Датчик в квартире на 150 м над уровнем моря покажет меньше, и это будет правильно.

Влажность

Только BME280 умеет мерить уровень влажности. Он измеряет относительную влажность — сколько водяного пара содержится в воздухе относительно максимального количества, которое воздух может удержать при этой температуре.

Влажность зависит от температуры, поэтому BME280 измеряет её вместе с температурой и выдаёт уже компенсированный результат. Для контроля комнаты, теплицы, шкафа с филаментом, инкубатора или хранения электроники это намного полезнее одного BMP280.

Почему модули выглядят одинаково

Чипы BME280 и BMP280 выпускаются в маленьком LGA-корпусе. На дешёвом breakout-модуле обычно видна небольшая квадратная микросхема под защитной крышкой/на плате, и по фото отличить её бывает трудно.

Дополнительная проблема — маркировка продавцов. Иногда одинаковые синие или фиолетовые платы называют BME280 независимо от реального установленного чипа. Надпись на PCB тоже не стопроцентная гарантия: производители могут использовать одну разводку для обоих вариантов.

Как проверить, какой датчик у вас

Самый надёжный способ — прочитать идентификатор микросхемы по I2C.

  • 0x60 — BME280.
  • 0x58 — BMP280.

Адрес устройства (0x76 или 0x77) и идентификатор чипа — это разные вещи. Адрес отвечает на вопрос «где датчик на I2C-шине?», а chip ID — «какой датчик ответил».

Ниже есть готовый скетч, который сканирует I2C и читает регистр ID 0xD0.

Почему библиотека иногда «видит» BMP280 как BME280?

Некоторые библиотеки сначала проверяют адрес и базовые регистры, а затем пытаются читать данные по похожей карте памяти. Давление и температура могут выглядеть правдоподобно, потому что у чипов родственная архитектура. Но значение влажности на BMP280 будет отсутствовать, быть нулевым, nan или бессмысленным.

Проверяй chip ID, а не только название товара или то, что программа «не выдала ошибку».

Модуль на 4 и 6 пинов

Количество выводов относится не к чипу Bosch, а к готовой плате-модулю. Один и тот же BME280/BMP280 может быть распаян на разных PCB.

4 пина: обычный I2C-модуль

Наиболее распространённый вариант:

VCC(VIN) | GND | SCL | SDA

Такой модуль уже настроен на I2C. Вы просто подаёте питание и соединяете SDA/SCL с контроллером.

ПинНазначение
VCC / VINПитание модуля
GNDОбщий провод
SCLТактовая линия I2C
SDAЛиния данных I2C

Это лучший вариант для первого проекта: проводов мало, библиотек много, а скорости I2C достаточно для температуры, давления и влажности.

6 пинов: I2C + SPI

На универсальном модуле обычно есть:

VCC | GND | SCL(SCK) | SDA(SDI) | CS(CSB) | SDO

Это не две разные платы. В режиме I2C линии используются так:

Маркировка на платеВ режиме I2C
SCL / SCKSCL, тактирование I2C
SDA / SDISDA, данные I2C
CS / CSBДолжен быть подтянут к питанию, чтобы выбрать I2C
SDOВыбирает I2C-адрес: GND = 0x76, VCC = 0x77

В режиме SPI те же контакты получают другое назначение:

МаркировкаВ режиме SPI
SCL / SCKSCK, тактовая линия SPI
SDA / SDIMOSI, данные от контроллера к датчику
SDOMISO, данные от датчика к контроллеру
CS / CSBChip Select, выбор датчика

Поэтому шестипиновый модуль не «лучше измеряет» и не имеет больше датчиков. Он просто даёт доступ к обоим цифровым интерфейсам.

В документации BME280 для breakout-платы с шестью контактами как раз перечислены VCC, GND, SCL/SCK, SDA/SDI, CSB и SDO; BME280 поддерживает как I2C, так и SPI.

I2C или SPI: что выбрать

Для 95% любительских метеостанций выбирай I2C.

КритерийI2CSPI
Провода к одному датчику2 сигнальных4 сигнальных + CS
УдобствоОчень высокоеНиже, больше соединений
Несколько устройствОбщая шина, разные адресаОбщие линии, отдельный CS на каждый датчик
СкоростьДостаточна для BME/BMP280Выше, но обычно не нужна
Когда использоватьДатчики, OLED, RTC, обычный DIYАдресный конфликт, длинный/нагруженный проект, специфическая архитектура

BME280/BMP280 меняются медленно: температура, влажность и давление не требуют тысяч измерений в секунду. Преимущество SPI по скорости здесь почти никогда не важно.

SPI стоит выбрать, если:

  • на I2C-шине уже есть устройство с тем же адресом и нельзя изменить адрес;
  • вы используете несколько одинаковых BME/BMP280;
  • проект уже построен вокруг SPI;
  • хотите изучить SPI на реальном примере.

Адреса I2C: 0x76 и 0x77

У BME280 и BMP280 есть два стандартных 7-битных I2C-адреса:

0x76
0x77

Адрес выбирается входом SDO:

SDO → GND  = 0x76
SDO → VCC  = 0x77

На 4-пиновом модуле SDO часто уже подтянут к земле через резистор, поэтому по умолчанию он отвечает на 0x76. На 6-пиновом модуле этот вывод может быть доступен отдельно, и адрес можно изменить перемычкой или проводом.

В режиме I2C вход CS/CSB должен быть подтянут к VCC. На готовом 4-пиновом модуле это обычно уже сделано на плате. На шестипиновом модуле проверь схему: часто CS уже подтянут к VCC, но не всегда.

Два одинаковых датчика можно подключить к одной I2C-шине, если один работает на 0x76, а второй — на 0x77. Третий такой же датчик потребует I2C-мультиплексор, SPI или отдельную I2C-шину.

Питание: сам чип и готовый модуль — не одно и то же

Это самое важное место статьи.

Сам BME280/BMP280

Оригинальный чип Bosch — 3,3-вольтовый. BME280 допускает основное питание 1,71–3,6 В и интерфейс 1,2–3,6 В. Подача 5 В на контакты самого чипа или на его линии I2C/SPI может его повредить. [web:187][web:197]

Готовый модуль

Готовая breakout-плата может содержать:

  • стабилизатор 3,3 В;
  • резистивные делители или level shifter для I2C;
  • подтягивающие резисторы;
  • защитные компоненты;
  • только сам чип с конденсаторами, без какой-либо защиты.

Поэтому маркировка VCC не гарантирует допустимость 5 В. Если на плате написано VIN, 3-5V или в документации указано питание 3,3/5 В, вероятно, на ней есть стабилизатор и согласование уровней. Если написано 3V3, 3.3V only или вы видите минимальный модуль без стабилизатора, подавайте только 3,3 В.

Тип модуляЧем питать от Arduino UnoЧем питать от ESP32/RP2040/STM32 3,3 ВОсобенность
Голый чип/минимальная плата 3,3 В3.3V, не 5V3.3VЛинии логики тоже только 3,3 В
Модуль с VIN/3-5V и level shifting5V или 3.3V по документацииЛучше 3.3VПроверяй, куда подтянуты SDA/SCL
Неизвестный модульТолько 3.3V до проверки3.3VСамый безопасный вариант

Почему для ESP32 лучше 3,3 В даже на «5V-compatible» плате

Если датчик и ESP32 работают от 3,3 В, у I2C линий безопасный высокий уровень 3,3 В. Если подать на breakout 5 В, его SDA/SCL могут быть подтянуты к 5 В. Для ESP32 это опасно.

Некоторые качественные модули действительно имеют level shifter и безопасны при питании 5 В, но с дешёвым модулем лучше не гадать. Питание 3,3 В почти всегда решает вопрос.

Подключение по I2C к Arduino Uno/Nano

Вариант: 3,3-вольтовый или неизвестный модуль

Питайте от 3.3V Arduino, чтобы I2C-уровни не стали 5-вольтовыми.

BME280/BMP280Arduino Uno/Nano
VCC / 3V33.3V
GNDGND
SDAA4 / SDA
SCLA5 / SCL
BME280 / BMP280             Arduino Uno / Nano
---------------             ------------------
VCC     ------------------- 3.3V
GND     ------------------- GND
SDA     ------------------- A4 / SDA
SCL     ------------------- A5 / SCL

У Arduino Uno/Nano классические I2C-пины логически работают от 5 В. Многие BME/BMP280-модули нормально принимают 5-вольтовый HIGH на SCL/SDA, если на плате есть согласование уровней; но для голого 3,3-вольтового модуля нужен двунаправленный I2C level shifter. Питание от 3,3 В само по себе не всегда делает I2C безопасным: Arduino всё ещё может активно выдавать HIGH около 5 В.

Для быстрого учебного старта лучше использовать breakout, который явно заявлен как совместимый с 5 В, либо Arduino-плату с 3,3-вольтовой логикой. Если модуль неизвестен, не считай подключение к Uno «автоматически безопасным».

Вариант: модуль, явно поддерживающий 3–5 В

Если datasheet модуля подтверждает встроенный стабилизатор и согласование уровней:

BME280/BMP280Arduino Uno/Nano
VIN / VCC5V
GNDGND
SDAA4 / SDA
SCLA5 / SCL

На Arduino Mega I2C — это SDA = 20 и SCL = 21. На Arduino Leonardo/Micro и современных платах лучше ориентироваться на подписи SDA/SCL, а не на номера аналоговых входов.

Подключение по I2C к ESP32

Для классической ESP32 DevKit принято использовать GPIO21 как SDA и GPIO22 как SCL.

BME280/BMP280ESP32 DevKit
VCC / 3V33V3
GNDGND
SDAGPIO21
SCLGPIO22
BME280 / BMP280             ESP32 DevKit
---------------             -----------
VCC     ------------------- 3V3
GND     ------------------- GND
SDA     ------------------- GPIO21
SCL     ------------------- GPIO22

На ESP32 I2C можно назначить на другие GPIO программно, но начинай с GPIO21/22: так проще использовать примеры. Не подключай к этим линиям модуль, который подтягивает SDA/SCL к 5 В.

Сканер I2C для Arduino и ESP32

Прежде чем ставить библиотеку, проверь, что контроллер вообще видит модуль. Сканер должен найти 0x76 или 0x77.

#include <Wire.h>

#if defined(ESP32)
constexpr int SDA_PIN = 21;
constexpr int SCL_PIN = 22;
#endif

void setup() {
  Serial.begin(115200);

#if defined(ESP32)
  Wire.begin(SDA_PIN, SCL_PIN);
#else
  Wire.begin();
#endif

  Serial.println("I2C scan started");
}

void loop() {
  int devices = 0;

  for (uint8_t address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    uint8_t error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("Found device at 0x");
      if (address < 16) Serial.print('0');
      Serial.println(address, HEX);
      devices++;
    }
  }

  if (devices == 0) {
    Serial.println("No I2C devices found");
  }

  Serial.println("---");
  delay(3000);
}

Ожидаемый результат:

Found device at 0x76

или:

Found device at 0x77

Если I2C-сканер не видит ничего, не переходи к сложному коду с библиотекой. Сначала проверь GND, питание, SDA/SCL, уровни 3,3/5 В и распиновку платы.

Как проверить chip ID: BME280 или BMP280

После того как известен адрес I2C, прочитаем регистр 0xD0.

#include <Wire.h>

constexpr uint8_t SENSOR_ADDRESS = 0x76;  // Если сканер показал 0x77 — измени здесь.
constexpr uint8_t CHIP_ID_REGISTER = 0xD0;

uint8_t readRegister(uint8_t address, uint8_t reg) {
  Wire.beginTransmission(address);
  Wire.write(reg);
  Wire.endTransmission(false);

  Wire.requestFrom(address, (uint8_t)1);

  if (Wire.available()) {
    return Wire.read();
  }

  return 0x00;
}

void setup() {
  Serial.begin(115200);

#if defined(ESP32)
  Wire.begin(21, 22);
#else
  Wire.begin();
#endif

  uint8_t id = readRegister(SENSOR_ADDRESS, CHIP_ID_REGISTER);

  Serial.print("Chip ID: 0x");
  Serial.println(id, HEX);

  if (id == 0x60) {
    Serial.println("Это BME280: температура, давление, влажность");
  } else if (id == 0x58) {
    Serial.println("Это BMP280: температура и давление, без влажности");
  } else {
    Serial.println("Неожиданный ID. Проверь адрес, подключение и модуль.");
  }
}

void loop() {
}

Этот тест полезнее, чем спор по фотографии товара: он проверяет фактическую микросхему на вашей плате.

Библиотеки для Arduino IDE

Для примеров ниже используются библиотеки Adafruit:

  • Adafruit BME280 Library;
  • Adafruit BMP280 Library;
  • Adafruit Unified Sensor — обычно устанавливается как зависимость.

Установка:

  1. Открой Sketch → Include Library → Manage Libraries….
  2. Найди Adafruit BME280 Library или Adafruit BMP280 Library.
  3. Нажми Install.
  4. Если Arduino IDE предложит установить Adafruit Unified Sensor, согласись.

Для BME280 и BMP280 нужны разные заголовки и разные классы. Не используй библиотеку BME280 для настоящего BMP280 только потому, что его плата подписана похоже.

Код BME280 для Arduino и ESP32: температура, влажность, давление

Этот скетч подходит для Arduino Uno/Nano и классического ESP32. Для ESP32 оставь строку Wire.begin(21, 22). Для Arduino она не выполняется благодаря условной компиляции.

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

Adafruit_BME280 bme;

bool connectBME280() {
  // Сначала пробуем самый частый адрес.
  if (bme.begin(0x76)) {
    return true;
  }

  // Затем второй допустимый адрес.
  return bme.begin(0x77);
}

void setup() {
  Serial.begin(115200);

#if defined(ESP32)
  Wire.begin(21, 22);
#else
  Wire.begin();
#endif

  if (!connectBME280()) {
    Serial.println("BME280 не найден. Проверь адрес 0x76/0x77, питание и SDA/SCL.");
    while (true) {
      delay(1000);
    }
  }
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(bme.readTemperature(), 1);
  Serial.println(" C");

  Serial.print("Humidity: ");
  Serial.print(bme.readHumidity(), 1);
  Serial.println(" %");

  Serial.print("Pressure: ");
  Serial.print(bme.readPressure() / 100.0F, 1);
  Serial.println(" hPa");

  Serial.println("---");
  delay(2000);
}

Метод readPressure() возвращает давление в паскалях, поэтому для гПа (hPa) его делят на 100. Один hPa равен одному mbar, поэтому на погодных сайтах и экранах метеостанций эти единицы часто используют как взаимозаменяемые.

Код BMP280 для Arduino и ESP32: температура и давление

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

Adafruit_BMP280 bmp;

bool connectBMP280() {
  if (bmp.begin(0x76)) {
    return true;
  }

  return bmp.begin(0x77);
}

void setup() {
  Serial.begin(115200);

#if defined(ESP32)
  Wire.begin(21, 22);
#else
  Wire.begin();
#endif

  if (!connectBMP280()) {
    Serial.println("BMP280 не найден. Проверь адрес, питание и подключение.");
    while (true) {
      delay(1000);
    }
  }
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(bmp.readTemperature(), 1);
  Serial.println(" C");

  Serial.print("Pressure: ");
  Serial.print(bmp.readPressure() / 100.0F, 1);
  Serial.println(" hPa");

  Serial.println("---");
  delay(2000);
}

Если в этом коде температура и давление читаются нормально, а вы ожидали влажность, проверь chip ID. Скорее всего, вместо BME280 у вас BMP280.

Подключение 6-пинового модуля по SPI

SPI почти всегда избыточен для BME/BMP280, но полезно понимать распиновку.

Пример для Arduino Uno:

Модуль BME/BMP280Arduino Uno
VCC3.3V или 5V только для подтверждённого 5V-модуля
GNDGND
SCK / SCLD13 / SCK
SDI / SDAD11 / MOSI
SDOD12 / MISO
CS / CSBD10 или другой цифровой пин
BME280/BMP280 (SPI)           Arduino Uno
-------------------           -----------
SCK / SCL      ------------- D13 / SCK
SDI / SDA      ------------- D11 / MOSI
SDO            ------------- D12 / MISO
CS / CSB       ------------- D10
GND            ------------- GND
VCC            ------------- 3.3V / по документации модуля

Для SPI нужна библиотека, поддерживающая этот режим, и другой конструктор с CS-пином. В большинстве обычных скетчей не переходи на SPI без причины: I2C требует меньше проводов и проще диагностируется сканером.

Высота по давлению: почему это приблизительно

BME/BMP280 позволяют оценить высоту, потому что давление с высотой уменьшается. Многие библиотеки имеют метод вроде readAltitude(seaLevelPressure).

Но это не GPS. Если давление на улице изменилось из-за погоды, датчик решит, что вы переместились по высоте. Ошибка в 1 гПа соответствует примерно 8 метрам высоты возле уровня моря.

Для относительного измерения — например, поднялись на лестнице, лифте или на дроне — BME/BMP280 очень полезны. Для абсолютной высоты нужно регулярно обновлять давление на уровне моря из метеоданных или иметь известную высоту стартовой точки.

Пример для BME280:

float altitude = bme.readAltitude(1013.25F);
Serial.print("Estimated altitude: ");
Serial.print(altitude, 1);
Serial.println(" m");

Значение 1013.25 — стандартное давление на уровне моря, а не универсально правильное число для вашего города и текущей погоды.

Настройки точности, шума и расхода

BME280/BMP280 позволяют выбирать oversampling, фильтр и режим измерения. Чем больше усреднений, тем спокойнее показания, но тем дольше измерение и выше расход энергии.

Для домашней метеостанции, которая обновляет экран раз в 1–5 секунд, обычно достаточно стандартных настроек библиотеки. Для батарейного устройства полезно:

  • использовать forced mode: датчик измерил, вернулся в сон;
  • измерять реже, например раз в минуту;
  • отключать OLED и радиомодуль между измерениями;
  • не включать максимальное oversampling без необходимости;
  • проверять потребление всей платы, а не только датчика.

Часто ESP32 DevKit с USB-UART и светодиодом расходует намного больше BME280 в sleep-режиме. Поэтому замена датчика сама по себе не гарантирует хороший срок работы от батареи.

Частые проблемы

Сканер не находит 0x76 или 0x77

Проверь по порядку:

  • Есть ли соединение GND между модулем и контроллером.
  • Не перепутаны ли SDA и SCL.
  • Для ESP32: вызван ли Wire.begin(21, 22) и подключены ли провода к GPIO21/22.
  • Получает ли модуль 3,3 В или допустимые 5 В согласно его документации.
  • Не подтянуты ли линии I2C к 5 В при работе с ESP32/RP2040/STM32.
  • Не выбрали ли вы SPI-модуль, у которого CS не подтянут к VCC для режима I2C.
  • Не сидит ли устройство на 0x77, пока код ищет только 0x76.

На BME280 влажность равна 0% или nan

  • Проверь chip ID: возможно, это BMP280.
  • Убедись, что используется Adafruit_BME280, а не Adafruit_BMP280.
  • Не закрыт ли модуль конденсатом, герметиком или плотной лентой.
  • Дай датчику стабилизироваться после включения.

Температура выше комнатной на 2–5 °C

Чаще всего BME280 стоит слишком близко к ESP32, линейному стабилизатору, OLED или DC-DC. Вынеси его на проводах, добавь отверстия в корпусе и не размещай над горячими компонентами.

Давление «не совпадает» с погодным сайтом

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

BME280 периодически пропадает на длинных проводах

I2C плохо любит длинные провода, большую ёмкость и слишком сильные/слабые подтяжки. Укороти соединения, уменьшите частоту I2C, убедись в общей земле и не ставь множество pull-up резисторов параллельно без расчёта.

Я подключил 6-пиновый модуль как 4-пиновый, но он не работает

На части 6-пиновых плат для I2C необходимо подтянуть CS/CSB к VCC. Если этого не сделать, чип может ожидать SPI. Проверь datasheet именно своей платы: CS должен быть HIGH для I2C, а SDO задаёт адрес 0x76/0x77.

Что выбрать: быстрый ответ

СценарийЧто покупать
Домашняя метеостанция, влажность комнаты, теплицаBME280, 4-пиновый I2C-модуль
Барометр, высотомер, давление и температура без влажностиBMP280, 4-пиновый I2C-модуль
Два одинаковых датчика на одной шинеМодули с адресами 0x76 и 0x77 либо 6-пиновый модуль с SDO
Нужно изучить SPI или избежать конфликта адресов6-пиновый BME280/BMP280 с CS и SDO
ESP32/RP2040/STM32 с 3,3 ВЛюбой подтверждённый 3,3-вольтовый модуль; питать от 3V3
Arduino Uno/Nano с 5 ВМодуль, где явно заявлены 3–5 В и level shifting, либо 3,3 В breakout + I2C level shifter
Нужно точнее измерять температуру воздухаВнешний датчик DS18B20/SHT31, расположенный дальше от греющейся платы

Что запомнить

  • BMP280: температура + давление. BME280: температура + давление + влажность.
  • Влажность нельзя «добавить библиотекой»: у BMP280 для неё нет физического чувствительного элемента.
  • Четыре пина почти всегда означают I2C; шесть пинов дают I2C и SPI.
  • В I2C у CS должен быть HIGH, а SDO выбирает адрес: GND = 0x76, VCC = 0x77.
  • Сам чип Bosch рассчитан на 3,3 В. 5 В допустимы только на breakout-модуле с подходящей обвязкой.
  • Для ESP32 безопасный базовый вариант: питать от 3V3 и подключить SDA к GPIO21, SCL к GPIO22.
  • Сначала запускай I2C-сканер, затем считывай chip ID 0xD0, и только потом выбирай библиотеку.
  • Датчик показывает температуру своего окружения, а не обязательно точную температуру воздуха в комнате.

Проверь себя

  1. В карточке товара написано BME280, но код показывает chip ID 0x58. Какие данные вы реально сможете получить?
  2. Почему не стоит автоматически подавать 5 В на любой модуль с надписью BME280/BMP280?
  3. Что нужно сделать с SDO, чтобы переключить I2C-адрес с 0x76 на 0x77?
  4. Зачем на шестипиновом модуле контакт CS, если вы хотите использовать только I2C?
Показать ответы
  1. ID 0x58 соответствует BMP280. Он измеряет температуру и давление, но не влажность. Нужно использовать библиотеку BMP280 и не ждать корректного %RH.
  2. Сам BME280/BMP280 — 3,3-вольтовый чип. У некоторых модулей есть стабилизатор и согласование уровней, у других — нет. На минимальную 3,3-вольтовую плату 5 В могут повредить чип или линии I2C/SPI.
  3. Подтянуть SDO к VCC. При SDO на GND используется 0x76, при SDO на VCC — 0x77.
  4. CS/CSB выбирает интерфейс. Для I2C он должен находиться в HIGH, чтобы чип не перешёл в SPI-режим. На 4-пиновом модуле это обычно уже сделано разводкой платы.