ПроектОпубликовано 28 мая 2025 · обновлено 9 октября 2026

Метеостанция на ESP32 и BME280: температура, влажность и давление по Wi-Fi

ESP32 читает температуру, влажность и давление с BME280 и отдаёт их на веб-страницу по Wi-Fi. Три провода питания и связи, один скетч и страница, которую открывают с телефона.

Уровень
Есть опыт
Понадобится
Паяльник
Время сборки: вечерСложность: средняяДеталей: 7Питание: 3,3 В от платы ESP32, питание платы по USB
Содержание

Метеостанция на ESP32 и BME280 собирается из двух деталей и четырёх проводов. Датчик подключают к плате по I2C (SDA — GPIO 21, SCL — GPIO 22, питание 3,3 В), а скетч поднимает на ESP32 веб-страницу с температурой, влажностью и давлением. Страницу открывают с телефона в той же Wi-Fi-сети.

По даташиту Bosch датчик питается от 1,71 до 3,6 В, поэтому 5 В на него подавать нельзя. Главное при сборке — не ставить датчик рядом с самой платой: она греется, и температура получается завышенной.

Ниже — данные даташитов, подключение, скетч, проверка и ошибки, из-за которых показания «врут».

Что понадобится и что известно о деталях

Модуль датчика давления и температуры рядом с платой ESP32

Данные из даташита Espressif на ESP32: одно или два 32-разрядных ядра Xtensa LX6 до 240 МГц и 520 КБ SRAM. Есть Wi-Fi 802.11 b/g/n на 2,4 ГГц, Bluetooth v4.2 (BR/EDR и LE), 34 вывода GPIO и 12-разрядный АЦП.

Логика у ESP32 трёхвольтовая, поэтому 5 В на выводы подавать нельзя.

Данные из даташита Bosch на BME280:

Параметр Значение
Питание VDD от 1,71 до 3,6 В
Интерфейсы I2C (до 3,4 МГц) и SPI
Диапазон −40…+85 °C, влажность 0…100 %, давление 300…1100 гПа
Точность влажности ±3 % отн. влажности (20…80 %, 25 °C, включая гистерезис)
Точность давления (абсолютная) ±1,0 гПа (300…1100 гПа, 0…65 °C); ±1,7 гПа (−20…0 °C)
Точность температуры ±0,5 °C (при 25 °C); ±1,0 °C (0…65 °C); ±1,25 °C (−20…0 °C); ±1,5 °C (−40…−20 °C)
Потребление 3,6 мкА при одном измерении в секунду всех трёх величин
Адрес I2C 0x76 (вывод SDO на землю) или 0x77 (SDO на питание)

BME280 не путайте с BMP280: у того нет датчика влажности. По даташиту регистр 0xD0 («id») у BME280 содержит значение 0x60, и именно по нему можно отличить микросхему на модуле без надписи.

Подключение

Модуль подключают четырьмя проводами.

BME280 ESP32
VCC 3V3
GND GND
SDA GPIO 21
SCL GPIO 22

Выводы GPIO 21 и 22 — стандартные для I2C в Arduino-ядре ESP32. Не подключайте модуль к 5 В, если он не рассчитан на такое питание: у самого датчика предел 3,6 В.

Библиотеки

В менеджере библиотек Arduino IDE 2 установите Adafruit BME280 Library (Adafruit) вместе с зависимостью Adafruit Unified Sensor.

Для платы нужен пакет esp32 (Espressif Systems) в менеджере плат; сетевые библиотеки WiFi.h и WebServer.h входят в него.

Скетч

Имена классов и методов сверены по исходникам библиотеки Adafruit на GitHub (Adafruit_BME280, begin(uint8_t addr, TwoWire*), readTemperature(), readPressure(), readHumidity()) и по примеру HelloServer из ядра arduino-esp32.

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

const char *WIFI_SSID = "имя_сети";
const char *WIFI_PASS = "пароль";

Adafruit_BME280 bme;
WebServer server(80);

void handleRoot() {
  float t = bme.readTemperature();          // °C
  float h = bme.readHumidity();             // % относительной влажности
  float p = bme.readPressure() / 100.0F;    // Па -> гПа

  String page = "<!DOCTYPE html><html><head><meta charset=\"utf-8\">";
  page += "<meta http-equiv=\"refresh\" content=\"10\">";
  page += "<title>Метеостанция</title></head><body>";
  page += "<p>Температура: " + String(t, 1) + " °C</p>";
  page += "<p>Влажность: " + String(h, 0) + " %</p>";
  page += "<p>Давление: " + String(p, 1) + " гПа</p>";
  page += "</body></html>";
  server.send(200, "text/html", page);
}

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

  if (!bme.begin(0x76)) {                   // 0x77, если SDO подключён к питанию
    Serial.println("BME280 не найден: проверьте провода и адрес");
    while (true) delay(10);
  }

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }
  Serial.println();
  Serial.print("Адрес страницы: http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
}

void loop() {
  server.handleClient();
  delay(2);
}

Как проверить

Проверка занимает несколько минут.

  1. Подставьте имя и пароль сети.Измените две строки в начале скетча.
  2. Загрузите скетч.Откройте монитор порта на 115200 бод.
  3. Дождитесь адреса.Он появится после точек подключения.
  4. Откройте адрес в браузере.Телефон или компьютер должны быть в той же сети.
  5. Проверьте реакцию.Согрейте датчик ладонью: температура и влажность должны измениться.

Страница обновляется каждые 10 секунд.

Нюансы измерений

Жалюзийный защитный экран датчика метеостанции на улице

Показания зависят от места установки. Ниже — четыре причины ошибок.

  • Температура завышена.Плата ESP32 сама греется, особенно при активном Wi-Fi. Датчик рядом с ней покажет температуру на несколько градусов выше окружающей: вынесите его на проводах подальше от платы и источников тепла.
  • Влажность и вода.По даташиту жидкость не должна попадать на датчик. Также Bosch не рекомендует подвергать BME280 сильному свету: он влияет на точность.
  • Давление.Абсолютное давление зависит от высоты над уровнем моря. Метеосводки приводят к уровню моря, поэтому цифры у вас и в прогнозе будут отличаться. Пересчёт есть в примере библиотеки (функция readAltitude).
  • Адрес.Если begin() не находит датчик, попробуйте адрес 0x77 или проверьте, что у вас именно BME280, а не BMP280.

Эти причины объясняют почти все расхождения с бытовым термометром.

Питание от батареи

Батарейки в держателе питают маленькую плату на столе

Для автономной работы изучите режим глубокого сна ESP32: по даташиту в нём чип потребляет 10 мкА (при работе таймера RTC и памяти RTC). Ежесекундный опрос с постоянно включённым Wi-Fi от батареи работать не будет.

Готовая плата DevKit в сне потребляет заметно больше, чем чип. Подробнее — в статье «ESP32 на солнечной батарее».

Типовые ошибки

  • Питание модуля 5 В.Выводы I2C бывают подтянуты к 5 В, нужна проверка по схеме модуля.
  • Перепутаны SDA и SCL.Датчик не отвечает.
  • Неверный адрес I2C.0x76 и 0x77 различаются состоянием вывода SDO.
  • Датчик рядом с ESP32.Показания температуры завышены.
  • Не установлена библиотека Adafruit Unified Sensor.Скетч не компилируется.
  • Вместо BME280 стоит BMP280.Влажности нет, и begin() может не находить датчик.

Где пригодится сегодня

Домашняя станция для комнаты, балкона, теплицы. Тот же датчик передают в системы «умного дома» и рисуют графики.

Данные станции удобно передавать по MQTT. Выбор платформы — в статье «ESP32 или Arduino Uno». Другой проект на ESP — датчик протечки на ESP8266.

Что в итоге

Подходит: комнатная и уличная станция для дома, эксперимент с Wi-Fi и I2C. Не подходит: точные метеорологические измерения и работа на морозе ниже −40 °C или во влаге.

Для расширения — второй датчик, запись данных на карту или отправка на сервер.

Частые вопросы

Почему BME280 показывает завышенную температуру?

Плата ESP32 греется, особенно при активном Wi-Fi, и датчик рядом с ней нагревается тоже. Разница бывает несколько градусов.

Вынесите датчик на проводах подальше от платы и источников тепла. Показания можно сравнить с бытовым термометром.

Какой адрес I2C у BME280?

По даташиту 0x76, если вывод SDO подключён к земле, и 0x77, если к питанию VDDIO.

Если begin(0x76) не находит датчик, попробуйте 0x77. Адрес на модуле задаётся состоянием вывода SDO: смотрите схему своего модуля.

Можно ли подключить BME280 к 5 В?

У самого датчика предел питания 3,6 В. Подключайте модуль к 3V3 платы.

Если модуль рассчитан на 5 В, на нём стоит регулятор, но выводы I2C бывают подтянуты к 5 В, и это опасно для ESP32. Проверьте схему модуля.

Как отличить BME280 от BMP280?

У BMP280 нет датчика влажности. По даташиту Bosch регистр 0xD0 («id») у BME280 содержит 0x60.

Если влажность не измеряется, у вас, вероятно, BMP280. В российских магазинах радиодеталей проверяйте маркировку на микросхеме.

Почему давление отличается от прогноза?

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

Пересчёт есть в примере библиотеки: функция readAltitude.

Что понадобится

ОбозначениеНоминалТипКол-во
—Плата ESP32 (DevKit)с USB и выводом 3V31
—Модуль BME280на 3,3 В, интерфейс I2C1
—ПроводаVCC, GND, SDA, SCL4
—Кабель USBдля питания и прошивки1
Тегиesp32bme280meteostanciya
Редакция СхемОкАвторМатериалы готовит редакция сайта, формулы и номиналы сверяются с даташитами производителей, расчёты — с калькуляторами сайта.99 материалов

Похожие материалы