Категории

IOT метеостанция на ESP32

2025-09-28 13:39:43 | IOT умный дом
Создаю iot метеостанцию на базе ESP32 для мониторинга воздуха в квартире

Привет, коллеги! Решил поделиться ходом сборки своей умной метеостанции на базе ESP32. Цель — не просто показывать погоду, а собирать данные в облако (точнее, в локальный сервер на Raspberry Pi), строить графики, сохранять историю и в будущем запускать сценарии: «если CO₂ > 1000 ppm — включи вентиляцию», «если влажность упала ниже 30% — напомни полить цветы» и т.п.

Система будет полностью автономной, с питанием от аккумуляторов, и работать в режиме глубокого сна большую часть времени — чтобы экономить заряд. Рассказываю, как это делаю и какие решения принял.

Что у меня в наличии

Архитектура системы

  1. ESP32 просыпается по сигналу от TPL5110 (раз в 2 часа).
  2. Включаются датчики, даётся 30–60 секунд на прогрев (особенно важно для газовых датчиков и пыли — они нестабильны "с холодного").
  3. Считываются все показания.
  4. Данные отправляются по Wi-Fi в MQTT-брокер (у меня — Mosquitto на Raspberry Pi).
  5. MQTT-топики вида:
    home/weather/temperature
    home/weather/humidity
    home/weather/pressure
    home/weather/illuminance
    home/weather/pm
            
  6. На Raspberry Pi работает PHP-скрипт, который подписывается на топики, пишет всё в MySQL, и отдаёт данные в веб-интерфейс с графиками (Chart.js или аналог).
  7. ESP32 отправляет данные, ждёт подтверждения, затем уходит в глубокий сон (или просто выключается — TPL5110 сам его включит через 2 часа).

Почему TPL5110 + E-Ink = экономия?

Важно: датчики вроде GP2Y1010AU0F и газовые модули (если добавлю) требуют прогрева — 30 секунд минимум. Но это раз в 2 часа — допустимо.

Подключение и код (Arduino IDE)

Всё пишется в Arduino IDE с установленными платами ESP32.

Необходимые библиотеки (через Library Manager):

Пример структуры кода:


#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). Он отлично подходит:

В коде после отправки MQTT я буду:

  1. Инициализировать экран
  2. Нарисовать текущие значения
  3. Обновить дисплей
  4. Отключить его (или просто оставить — он сам не жрёт)

Для E-Ink использую библиотеку GxEPD2 — она поддерживает десятки моделей и умеет "частичное обновление", что ускоряет отрисовку.

Серверная часть (Raspberry Pi)

Планы на будущее

Заключение

Это не просто «погодная станция из коробки». Это гибкая, расширяемая IoT-система, которая живёт от батарей, экономит энергию и интегрируется в мой локальный умный дом. Главное — начать с базы: датчики → ESP32 → MQTT → база → графики. А дальше — только вверх.

Если интересно — в следующей статье покажу схему подключения, как настроить Mosquitto на Raspberry Pi и как писать PHP-приёмник MQTT.

А зачем это всё, если не для «понтов»?

Честно говоря, я начал не ради графиков и MQTT-топиков. Год почти не мог понять, откуда в квартире постоянный «затхлый» запах — проветриваю, убираю, а он возвращается. Оказалось — разлагается поролон в старом матрасе. Формальдегид, VOC, пыль, отсутствие нормальной вентиляции… Всё это не «фантазии экологов», а реальные факторы, влияющие на сон, головные боли, концентрацию и даже иммунитет.

Станция — это не игрушка. Это инструмент диагностики среды, в которой ты проводишь 8–12 часов в сутки. Если:

Без данных ты действуешь вслепую. С данными — можешь точечно решать проблемы: заменить матрас, поставить очиститель воздуха, настроить умную вентиляцию, купить увлажнитель.

Так что да — такая станция стоит каждого вложенного рубля и часа работы. Это инвестиция в здоровье, а не хобби.

Пока еще не делал, так на память сохранил. По отдельности все работает, надо в кучу собрать. Заказал экран по запросу на алиекспресс, надо тестировать. 2.9 inch e ink display SPI 296x128

А сколько вообще проработает от аккумуляторов?

У меня в планах — два аккумулятора 18650 (по 3000 мА·ч каждый) в батарейном блоке или самодельном Power Bank с выходом 5 В. Питание ESP32 и всех датчиков будет полностью отключаться через внешний таймер TPL5110, который физически разрывает цепь питания после завершения цикла.

Цикл работы:

  1. Раз в 2 часа TPL5110 подаёт питание на ESP32.
  2. ESP32 включает датчики, ждёт 30–60 секунд на прогрев.
  3. Считывает данные с BMP280, BH1750, GP2Y1010AU0F.
  4. Подключается к Wi-Fi, отправляет всё в MQTT.
  5. Обновляет E-Ink экран (если подключён).
  6. Подтверждает завершение — TPL5110 отключает питание.

Потребление в активной фазе:

Итого: активная фаза длится ~70 секунд при среднем токе ~100 мА.
Энергия за цикл: 100 мА × (70 / 3600) ч ≈ 2 мА·ч на цикл.

Циклов в сутки: 24 ч / 2 ч = 12.
Расход в день: 12 × 2 мА·ч = ~24 мА·ч/день.

Потребление в «выключенном» состоянии:

Итого суточное потребление: ~24 мА·ч + (0.035 мА × 24 ч) ≈ 25 мА·ч/день.

Ёмкость двух 18650: 2 × 3000 мА·ч = 6000 мА·ч.
Теоретическое время работы: 6000 / 25 ≈ 240 дней (~8 месяцев).

Но! Реальность вносит поправки:

Поэтому реалистичная оценка — 3–6 месяцев автономной работы от двух 18650 при цикле раз в 2 часа.

А если уменьшить частоту до раза в 6 часов — легко выйти за год.

Вывод: да, с TPL5110 и полным отключением питания такая метеостанция может работать месяцами без подзарядки. Это не фантастика — это реальность современной IoT-электроники.

Как сделать корпус для метеостанции: пошагово

Корпус — не просто «коробка», а важная часть системы. От него зависит точность датчиков, срок службы и внешний вид. Вот как сделать его правильно.

  1. Выбери материал
    Используй пластик (ABS, PLA, поликарбонат). Металл экранирует Wi-Fi, дерево впитывает влагу. PLA подойдёт для прототипа, но на кухне/в ванной — лучше ABS или промышленный корпус.
  2. Сделай вертикальную компоновку
    Корпус должен быть выше, чем шире — это создаёт естественную тягу: тёплый воздух от ESP32 поднимается вверх, засасывая свежий снизу.
  3. Размести компоненты по зонам
    • Низ (нижняя треть) — датчики качества воздуха: пыль (GP2Y1010AU0F), CO₂ (MH-Z19B), формальдегид (ZE08), газы (CJMCU-6814).
    • Середина — плата ESP32 и модуль питания.
    • Верх — E-Ink экран (выведен наружу), вентиляционные отверстия.
  4. Сделай вентиляцию
    Снизу: отверстия или сетка для притока воздуха.
    Сверху: щели или решётка для вытяжки.
    — Расстояние между входом и выходом — минимум 3–5 см по высоте.
  5. Защити от пыли, но не заглуши
    На входные отверстия поставь мелкую сетку или нетканый фильтр (например, кусок медицинской маски или чулка). Это задержит крупную пыль, но не остановит поток воздуха.
  6. Выведи свет наружу
    Датчик освещённости (BH1750) должен «видеть» комнату. Сделай в корпусе прозрачное окно из матового пластика или светопроводящего канала.
  7. Оставь доступ к кнопкам и разъёмам
    Предусмотри отсек или съёмную крышку для:
    • зарядки аккумуляторов,
    • кнопки перезагрузки,
    • USB-порта (если нужна прошивка).
  8. Изолируй ESP32 от датчиков
    Не ставь BMP280/BME280 вплотную к ESP32 — его нагрев исказит температуру. Лучше — на 2–3 см выше или сбоку, в зоне воздушного потока.
  9. Продумай место для микро-кулера
    Если используешь вентилятор — направь его поток **вдоль датчиков**, но не прямо в сенсорные окна. Включай только на время измерения.
  10. Тестируй до финальной сборки
    Сначала собери всё «на столе» с временным корпусом (картон, LEGO, 3D-прототип). Проверь:
    • стабильность Wi-Fi,
    • реакцию датчиков на проветривание,
    • нагрев компонентов.

Правильный корпус — это когда станция точно измеряет, долго работает и не привлекает внимания. Удачи в сборке!

Комментарии

Джон конор 28.09.2025 15:41
TPL5110 вроде вырубается сигналом. т.е. надо свободный пин, чтобы дать команду на сон

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион