Привет, коллеги! Решил поделиться ходом сборки своей умной метеостанции на базе ESP32. Цель — не просто показывать погоду, а собирать данные в облако (точнее, в локальный сервер на Raspberry Pi), строить графики, сохранять историю и в будущем запускать сценарии: «если CO₂ > 1000 ppm — включи вентиляцию», «если влажность упала ниже 30% — напомни полить цветы» и т.п.
Система будет полностью автономной, с питанием от аккумуляторов, и работать в режиме глубокого сна большую часть времени — чтобы экономить заряд. Рассказываю, как это делаю и какие решения принял.
home/weather/temperature home/weather/humidity home/weather/pressure home/weather/illuminance home/weather/pm
Важно: датчики вроде GP2Y1010AU0F и газовые модули (если добавлю) требуют прогрева — 30 секунд минимум. Но это раз в 2 часа — допустимо.
Всё пишется в Arduino IDE с установленными платами ESP32.
Необходимые библиотеки (через Library Manager):
Adafruit BMP280 Library
(или SparkFun BMP280
)BH1750
от Christopher LawsPubSubClient
— для MQTTWiFiClientSecure
(если MQTT с TLS)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). Он отлично подходит:
В коде после отправки MQTT я буду:
Для E-Ink использую библиотеку GxEPD2 — она поддерживает десятки моделей и умеет "частичное обновление", что ускоряет отрисовку.
php mqtt client
или shell_exec + mosquitto_sub
) ловит топикиweather_logs
с полями timestamp
, sensor
, value
Это не просто «погодная станция из коробки». Это гибкая, расширяемая 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, который физически разрывает цепь питания после завершения цикла.
Цикл работы:
Потребление в активной фазе:
Итого: активная фаза длится ~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-электроники.
Корпус — не просто «коробка», а важная часть системы. От него зависит точность датчиков, срок службы и внешний вид. Вот как сделать его правильно.
Правильный корпус — это когда станция точно измеряет, долго работает и не привлекает внимания. Удачи в сборке!
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии