Три величины в одном крошечном датчике по шине I2C: температура, влажность и атмосферное давление, а по давлению — ещё и высота. Лучше и быстрее DHT22.
Как работает
BME280 от Bosch меряет температуру (±1 °C), влажность (±3 %) и давление (±1 гПа). Подключается по I2C — двумя проводами SDA и SCL, которые можно делить с другими датчиками и дисплеями на той же шине. Адрес — 0x76 или 0x77 в зависимости от вывода SDO.
Библиотека — Adafruit BME280: bme.begin(0x76), потом readTemperature(), readHumidity() и readPressure() (в паскалях — делите на 100, получите гПа).
#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);
}
#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 В.
Частые ошибки
BMP280 вместо BME280: выглядят одинаково, но у BMP280 нет влажности. Библиотека BME280 его не найдёт (другой идентификатор чипа).
Неверный адрес: begin() без аргумента ищет 0x77, а большинство модулей — 0x76. Запустите сканер I2C.
Датчик рядом с платой: ESP32 греется, и температура получается на 2–3 °C выше. Выносите датчик на проводах.
5 В на модуль без стабилизатора — чип рассчитан на 3,6 В максимум.