Метеостанция на ESP32 и BME280: температура, влажность и давление по Wi-Fi
ESP32 читает температуру, влажность и давление с BME280 и отдаёт их на веб-страницу по Wi-Fi. Три провода питания и связи, один скетч и страница, которую открывают с телефона.
Содержание
Метеостанция на ESP32 и BME280 собирается из двух деталей и четырёх проводов. Датчик подключают к плате по I2C (SDA — GPIO 21, SCL — GPIO 22, питание 3,3 В), а скетч поднимает на ESP32 веб-страницу с температурой, влажностью и давлением. Страницу открывают с телефона в той же Wi-Fi-сети.
По даташиту Bosch датчик питается от 1,71 до 3,6 В, поэтому 5 В на него подавать нельзя. Главное при сборке — не ставить датчик рядом с самой платой: она греется, и температура получается завышенной.
Ниже — данные даташитов, подключение, скетч, проверка и ошибки, из-за которых показания «врут».
Что понадобится и что известно о деталях

Данные из даташита 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);
}
Как проверить
Проверка занимает несколько минут.
- Подставьте имя и пароль сети.Измените две строки в начале скетча.
- Загрузите скетч.Откройте монитор порта на 115200 бод.
- Дождитесь адреса.Он появится после точек подключения.
- Откройте адрес в браузере.Телефон или компьютер должны быть в той же сети.
- Проверьте реакцию.Согрейте датчик ладонью: температура и влажность должны измениться.
Страница обновляется каждые 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 и выводом 3V3 | 1 |
| — | Модуль BME280 | на 3,3 В, интерфейс I2C | 1 |
| — | Провода | VCC, GND, SDA, SCL | 4 |
| — | Кабель USB | для питания и прошивки | 1 |





















