BME280: подключение к ESP32 и Arduino

Датчик температуры, влажности и давления

Три величины в одном крошечном датчике по шине I2C: температура, влажность и атмосферное давление, а по давлению — ещё и высота. Лучше и быстрее DHT22.

Как работает

BME280 от Bosch меряет температуру (±1 °C), влажность (±3 %) и давление (±1 гПа). Подключается по I2C — двумя проводами SDA и SCL, которые можно делить с другими датчиками и дисплеями на той же шине. Адрес — 0x76 или 0x77 в зависимости от вывода SDO.

Библиотека — Adafruit BME280: bme.begin(0x76), потом readTemperature(), readHumidity() и readPressure() (в паскалях — делите на 100, получите гПа).

Выводы

ВыводНазначение
SCLтактовая линия I2C
SDAлиния данных I2C
VCCпитание
GNDобщий провод

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

BME280ESP32
SCLGPIO22
SDAGPIO21
VCC3V3
GNDGND

Схема из примера «BME280: три величины сразу».

BME280: три величины сразу

Открыть пример целиком
Код скетча
#include <Adafruit_BME280.h>

Adafruit_BME280 bme;

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

  // Адрес зависит от вывода SDO: 0x76 при земле, 0x77 при питании.
  // Перепутанный адрес выглядит как неисправный датчик.
  if (!bme.begin(0x76)) {
    Serial.println("BME280 не отвечает: проверьте адрес и провода");
    while (true) delay(1000);
  }
}

void loop() {
  Serial.printf("%.2f C  %.1f %%  %.2f гПа\n",
                bme.readTemperature(),
                bme.readHumidity(),
                bme.readPressure() / 100.0F);
  delay(1000);
}

Подключение к Arduino Uno

BME280Arduino Uno
SCLA5
SDAA4
VCC5V
GNDGND

Схема из примера «Arduino Uno: давление, влажность и температура».

Arduino Uno: давление, влажность и температура

Открыть пример целиком
Код скетча
#include <Wire.h>
#include <Adafruit_BME280.h>

// BME280 на I2C — A4 и A5.
//
// Адрес у этого датчика бывает двух видов: 0x76 и 0x77, и зависит он от
// того, к чему припаян вывод SDO на плате модуля. Библиотека умеет
// принимать адрес доводом, и проверять оба — обычная практика.
//
// Печать в формате «имя:число» подхватывает вкладка «График»: три ряда
// строятся сами. Давление переводится в миллиметры ртутного столба —
// датчик отдаёт паскали, а по привычке смотрят на миллиметры.

Adafruit_BME280 bme;

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

  if (!bme.begin(0x76) && !bme.begin(0x77)) {
    Serial.println(F("датчик не отозвался: проверьте A4, A5 и питание"));
    return;
  }
}

void loop() {
  float t = bme.readTemperature();
  float h = bme.readHumidity();
  float p = bme.readPressure() / 133.322;   // паскали в мм рт. ст.

  Serial.print("t:");
  Serial.print(t, 1);
  Serial.print(" h:");
  Serial.print(h, 1);
  Serial.print(" p:");
  Serial.println(p, 1);

  delay(1000);
}

В железе

На ESP32 шина I2C по умолчанию — SDA = GPIO21, SCL = GPIO22, на Arduino Uno — A4 и A5. Голый датчик без стабилизатора — строго 3,3 В.

Частые ошибки

Другие детали