Привет, коллеги! Решил поделиться ходом сборки своей умной метеостанции на базе ESP32. Цель — не просто показывать погоду, а собирать данные в облако (точнее, в локальный сервер на Raspberry Pi), строить графики, сохранять историю и в будущем запускать сценарии: «если CO₂ > 1000 ppm — включи вентиляцию», «если влажность упала ниже 30% — напомни полить цветы» и т.п.
Система будет полностью автономной, с питанием от аккумуляторов, и работать в режиме глубокого сна большую часть времени — чтобы экономить заряд. Рассказываю, как это делаю и какие решения принял.
Что у меня в наличии
- Микроконтроллер: ESP32 DevKit (с Wi-Fi и Bluetooth — идеально для IoT)
- Датчики:
- BMP280 (GY-BM280) — температура и атмосферное давление
- BH1750 — освещённость (в люксах)
- GP2Y1010AU0F — датчик пыли (PM, хотя и устаревший — но пока работает)
- Планирую добавить BME280 вместо BMP280, чтобы получить влажность — без неё метеостанция неполноценна
- Питание: блок из 1–2 аккумуляторов 18650 (5 В через повышающий/понижающий модуль)
- Таймер пробуждения: TPL5110 — сверхнизкое энергопотребление (всего ~35 нА!), идеален для периодического включения ESP32
- Экран: планирую подключить 2.9-дюймовый E-Ink (электронные чернила), например, Waveshare или аналог на контроллере SSD1680/ST7789 (уточню позже). Главное — он не жрёт энергию в статике, и я могу обновлять его раз в 2 часа.
Архитектура системы
- ESP32 просыпается по сигналу от TPL5110 (раз в 2 часа).
- Включаются датчики, даётся 30–60 секунд на прогрев (особенно важно для газовых датчиков и пыли — они нестабильны "с холодного").
- Считываются все показания.
- Данные отправляются по Wi-Fi в MQTT-брокер (у меня — Mosquitto на Raspberry Pi).
- MQTT-топики вида:
home/weather/temperature home/weather/humidity home/weather/pressure home/weather/illuminance home/weather/pm - На Raspberry Pi работает PHP-скрипт, который подписывается на топики, пишет всё в MySQL, и отдаёт данные в веб-интерфейс с графиками (Chart.js или аналог).
- ESP32 отправляет данные, ждёт подтверждения, затем уходит в глубокий сон (или просто выключается — TPL5110 сам его включит через 2 часа).
Почему TPL5110 + E-Ink = экономия?
- ESP32 в глубоком сне всё равно потребляет ~10 мкА. Но если его полностью отключить, то потребление падает до нуля.
- TPL5110 — внешний таймер, который физически подаёт питание на ESP32 раз в N минут. Потребление самого таймера — менее 0.1 мкА. Это критично для работы от батарей месяцами.
- E-Ink экран потребляет энергию только при обновлении. После отрисовки — 0 мА. Значит, я могу показать данные раз в 2 часа, и это почти не скажется на автономности.
- Итог: система живёт неделями или месяцами от двух 18650 (3000 мАч каждая).
Важно: датчики вроде GP2Y1010AU0F и газовые модули (если добавлю) требуют прогрева — 30 секунд минимум. Но это раз в 2 часа — допустимо.
Подключение и код (Arduino IDE)
Всё пишется в Arduino IDE с установленными платами ESP32.
Необходимые библиотеки (через Library Manager):
Adafruit BMP280 Library(илиSparkFun BMP280)BH1750от Christopher LawsPubSubClient— для MQTTWiFiClientSecure(если MQTT с TLS)- Для E-Ink:
GxEPD2(поддерживает большинство 2.9" модулей)
Пример структуры кода:
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <BH1750.h>
// Настройки Wi-Fi и MQTT
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
const char* mqtt_server = "192.168.1.100"; // IP Raspberry Pi
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_BMP280 bmp;
BH1750 lightMeter;
void setup() {
Serial.begin(115200);
Wire.begin();
// Инициализация датчиков
if (!bmp.begin(0x76)) {
Serial.println("BMP280 not found!");
while (1);
}
lightMeter.begin();
// Подключение к Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) reconnect();
// Прогрев датчиков (опционально)
delay(30000); // 30 секунд
// Чтение данных
float temp = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0; // в гПа
float lux = lightMeter.readLightLevel();
// Отправка в MQTT
char buffer[20];
sprintf(buffer, "%.2f", temp);
client.publish("home/weather/temperature", buffer);
sprintf(buffer, "%.2f", pressure);
client.publish("home/weather/pressure", buffer);
sprintf(buffer, "%.0f", lux);
client.publish("home/weather/illuminance", buffer);
client.loop();
// Готовимся к выключению
Serial.println("Data sent. Going to sleep...");
delay(1000);
// Если используем TPL5110 — просто завершаем loop()
// ESP32 будет отключён внешним таймером
while (1) {
// Ждём, пока TPL5110 разорвёт питание
// Или можно вызвать esp_deep_sleep, но TPL5110 надёжнее для полного отключения
}
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Weather")) {
// Подписка не нужна — только публикация
} else {
delay(5000);
}
}
}
Совет: не забудь отключать питание датчиков через MOSFET, если они жрут ток в простое! Или выбирай датчики с режимом сна.
А что с экраном?
Планирую подключить 2.9" E-Ink (например, Waveshare 2.9" B/W). Он отлично подходит:
- Потребление только при обновлении (~20 мА на 1–2 сек)
- Читаем на солнце
- Не мерцает
- Данные остаются на экране без питания
В коде после отправки MQTT я буду:
- Инициализировать экран
- Нарисовать текущие значения
- Обновить дисплей
- Отключить его (или просто оставить — он сам не жрёт)
Для E-Ink использую библиотеку GxEPD2 — она поддерживает десятки моделей и умеет "частичное обновление", что ускоряет отрисовку.
Серверная часть (Raspberry Pi)
- Mosquitto — MQTT-брокер
- PHP-скрипт-демон (через
php mqtt clientилиshell_exec + mosquitto_sub) ловит топики - Данные пишутся в MySQL: таблица
weather_logsс полямиtimestamp,sensor,value - Веб-интерфейс на PHP + Chart.js строит графики за день/неделю/месяц
- Есть скрипт резервного копирования — раз в сутки дамп базы уходит в облако
Планы на будущее
- Заменить BMP280 на BME280 → добавить влажность
- Подключить MH-Z19B → CO₂
- Добавить датчик дождя и анемометр на улицу
- Реализовать автоматические сценарии через PHP: если CO₂ растёт — включить реле вентиляции
- Сделать корпус из PLA на 3D-принтере
Заключение
Это не просто «погодная станция из коробки». Это гибкая, расширяемая IoT-система, которая живёт от батарей, экономит энергию и интегрируется в мой локальный умный дом. Главное — начать с базы: датчики → ESP32 → MQTT → база → графики. А дальше — только вверх.
Если интересно — в следующей статье покажу схему подключения, как настроить Mosquitto на Raspberry Pi и как писать PHP-приёмник MQTT.
А зачем это всё, если не для «понтов»?
Честно говоря, я начал не ради графиков и MQTT-топиков. Год почти не мог понять, откуда в квартире постоянный «затхлый» запах — проветриваю, убираю, а он возвращается. Оказалось — разлагается поролон в старом матрасе. Формальдегид, VOC, пыль, отсутствие нормальной вентиляции… Всё это не «фантазии экологов», а реальные факторы, влияющие на сон, головные боли, концентрацию и даже иммунитет.
Станция — это не игрушка. Это инструмент диагностики среды, в которой ты проводишь 8–12 часов в сутки. Если:
- CO₂ постоянно выше 800 ppm — мозг работает хуже, хочется спать;
- PM2.5 зашкаливает — это нагрузка на лёгкие, особенно у детей;
- Влажность ниже 30% — сохнут слизистые, чаще ОРВИ;
- VOC или формальдегид растут — возможны аллергии, раздражение глаз;
- Давление падает — у метеозависимых болит голова.
Без данных ты действуешь вслепую. С данными — можешь точечно решать проблемы: заменить матрас, поставить очиститель воздуха, настроить умную вентиляцию, купить увлажнитель.
Так что да — такая станция стоит каждого вложенного рубля и часа работы. Это инвестиция в здоровье, а не хобби.
Пока еще не делал, так на память сохранил. По отдельности все работает, надо в кучу собрать. Заказал экран по запросу на алиекспресс, надо тестировать. 2.9 inch e ink display SPI 296x128
А сколько вообще проработает от аккумуляторов?
У меня в планах — два аккумулятора 18650 (по 3000 мА·ч каждый) в батарейном блоке или самодельном Power Bank с выходом 5 В. Питание ESP32 и всех датчиков будет полностью отключаться через внешний таймер TPL5110, который физически разрывает цепь питания после завершения цикла.
Цикл работы:
- Раз в 2 часа TPL5110 подаёт питание на ESP32.
- ESP32 включает датчики, ждёт 30–60 секунд на прогрев.
- Считывает данные с BMP280, BH1750, GP2Y1010AU0F.
- Подключается к Wi-Fi, отправляет всё в MQTT.
- Обновляет E-Ink экран (если подключён).
- Подтверждает завершение — TPL5110 отключает питание.
Потребление в активной фазе:
- ESP32 (с Wi-Fi): ~150–200 мА в пике, ~80 мА в среднем во время передачи
- Датчики: ~20–30 мА суммарно
- E-Ink (при обновлении): ~20 мА, но только 1–2 секунды
Итого: активная фаза длится ~70 секунд при среднем токе ~100 мА.
Энергия за цикл: 100 мА × (70 / 3600) ч ≈ 2 мА·ч на цикл.
Циклов в сутки: 24 ч / 2 ч = 12.
Расход в день: 12 × 2 мА·ч = ~24 мА·ч/день.
Потребление в «выключенном» состоянии:
- ESP32 — 0 мА (полное отключение)
- TPL5110 — ~0.035 мА (35 нА)
- Аккумуляторы — саморазряд ~1–2% в месяц
Итого суточное потребление: ~24 мА·ч + (0.035 мА × 24 ч) ≈ 25 мА·ч/день.
Ёмкость двух 18650: 2 × 3000 мА·ч = 6000 мА·ч.
Теоретическое время работы: 6000 / 25 ≈ 240 дней (~8 месяцев).
Но! Реальность вносит поправки:
- Неидеальный КПД преобразователя 5 В
- Потери в проводах и MOSFET-ключах
- Холод снижает ёмкость Li-ion
- Wi-Fi может «зависнуть» и тянуть дольше
Поэтому реалистичная оценка — 3–6 месяцев автономной работы от двух 18650 при цикле раз в 2 часа.
А если уменьшить частоту до раза в 6 часов — легко выйти за год.
Вывод: да, с TPL5110 и полным отключением питания такая метеостанция может работать месяцами без подзарядки. Это не фантастика — это реальность современной IoT-электроники.
Как сделать корпус для метеостанции: пошагово
Корпус — не просто «коробка», а важная часть системы. От него зависит точность датчиков, срок службы и внешний вид. Вот как сделать его правильно.
- Выбери материал
Используй пластик (ABS, PLA, поликарбонат). Металл экранирует Wi-Fi, дерево впитывает влагу. PLA подойдёт для прототипа, но на кухне/в ванной — лучше ABS или промышленный корпус. - Сделай вертикальную компоновку
Корпус должен быть выше, чем шире — это создаёт естественную тягу: тёплый воздух от ESP32 поднимается вверх, засасывая свежий снизу. - Размести компоненты по зонам
- Низ (нижняя треть) — датчики качества воздуха: пыль (GP2Y1010AU0F), CO₂ (MH-Z19B), формальдегид (ZE08), газы (CJMCU-6814).
- Середина — плата ESP32 и модуль питания.
- Верх — E-Ink экран (выведен наружу), вентиляционные отверстия.
- Сделай вентиляцию
— Снизу: отверстия или сетка для притока воздуха.
— Сверху: щели или решётка для вытяжки.
— Расстояние между входом и выходом — минимум 3–5 см по высоте. - Защити от пыли, но не заглуши
На входные отверстия поставь мелкую сетку или нетканый фильтр (например, кусок медицинской маски или чулка). Это задержит крупную пыль, но не остановит поток воздуха. - Выведи свет наружу
Датчик освещённости (BH1750) должен «видеть» комнату. Сделай в корпусе прозрачное окно из матового пластика или светопроводящего канала. - Оставь доступ к кнопкам и разъёмам
Предусмотри отсек или съёмную крышку для:- зарядки аккумуляторов,
- кнопки перезагрузки,
- USB-порта (если нужна прошивка).
- Изолируй ESP32 от датчиков
Не ставь BMP280/BME280 вплотную к ESP32 — его нагрев исказит температуру. Лучше — на 2–3 см выше или сбоку, в зоне воздушного потока. - Продумай место для микро-кулера
Если используешь вентилятор — направь его поток **вдоль датчиков**, но не прямо в сенсорные окна. Включай только на время измерения. - Тестируй до финальной сборки
Сначала собери всё «на столе» с временным корпусом (картон, LEGO, 3D-прототип). Проверь:- стабильность Wi-Fi,
- реакцию датчиков на проветривание,
- нагрев компонентов.
Правильный корпус — это когда станция точно измеряет, долго работает и не привлекает внимания. Удачи в сборке!
Комментарии