Вместо введения: зачем мне это понадобилось
Всё началось с того, что я устал каждое утро лезть в телефон, чтобы узнать погоду. Хотелось, чтобы прямо на столе, первым делом после пробуждения, я видел температуру, влажность и давление. Готовые метеостанции стоят дорого, а самоделка — это и дешевле, и интереснее. Плюс можно добавить функцию, которой нет в магазинных: например, управление через веб-интерфейс или передачу данных на свой сервер.
В этой статье я расскажу, как собрал свою метеостанцию на базе ESP8266 (Wemos D1 mini), датчиках DHT11 и BMP180, монохромном дисплее Nokia 5110. Спойлер: всё получилось, и она работает до сих пор.
Что умеет наша метеостанция
Характеристики готового устройства:
- Температура — от 0 до +50°C с точностью ±2°C (датчик DHT11, не нужно путать с лабораторным)
- Влажность — от 20 до 80% с точностью ±5%
- Атмосферное давление — от 300 до 1100 гПа (BMP180 выдаёт абсолютное давление, на практике важно отслеживать тренд)
- Дисплей — Nokia 5110 (84×48 точек, монохромный, отлично читается при ярком свете)
- Питание — от USB-порта (5В) либо от преобразователя напряжения AC-DC c выходом 5 в.
- Веб-интерфейс — настройка Wi-Fi через браузер телефона или компьютера
Дисплей циклически каждые 2 секунды показывает крупные значения температуры, влажности и давления. Внизу экрана — статус подключения к домашней сети и маленькие точки-индикаторы текущего режима.
Выбор компонентов: почему именно эти
ESP8266 (Wemos D1 mini)
Главный мозг. У него есть Wi-Fi (нужно для веб-интерфейса), он дешёвый и потребляет мало тока. Wemos D1 mini — самая удобная плата: пины подписаны, USB-порт прямо на плате, не нужен программатор.
Датчик DHT11
Самый дешёвый датчик температуры и влажности. Недостаток — низкая точность и медленный опрос (раз в секунду). Но для бытовой метеостанции этого за глаза. Можно поставить DHT22 — он точнее, но дороже. Я выбрал DHT11 из экономии.
Датчик BMP180
Измеряет давление и температуру (но температуру беру с DHT11, она точнее для комнатных условий). BMP180 работает по I2C, подключается всего двумя проводами. Давление выдаёт в гектопаскалях, перевожу в миллиметры ртутного столба (умножением на 0,750062). Для предсказания погоды важна динамика, а не абсолютная цифра.
Дисплей Nokia 5110
Легендарный экран от старых телефонов. Монохромный, 84×48 пикселей. Читается на солнце отлично (в отличие от цветных TFT). Контраст регулируется программно. Управляется по SPI — нужно всего 4 пина данных. Библиотека Adafruit_PCD8544 делает работу с ним очень простой.
Зачем вообще все эти детали?
· Если убрать дисплей — получится «голый» датчик, но данные придётся смотреть только через веб-интерфейс, что неудобно.
· Без веб-интерфейса нельзя будет сменить сеть Wi-Fi — пришлось бы перепрошивать ESP.
· Оба датчика вместе дают полноценную картину: температура + влажность + давление.
Важные замечания по монтажу:
· Все датчики питаются от 3.3V, не от 5V. Подача 5V на BMP180 убьёт его мгновенно. DHT11 и дисплей могут работать от 5V, но я подключил всё к 3.3V для единообразия.
· Резисторы НЕ нужны. Я читал старые статьи, где советуют резисторы 2 кОм на линиях данных, но в моём случае и без них всё работает стабильно.
· Пин D3 (GPIO0) при старте ESP должен быть подтянут к питанию. У дисплея Nokia 5110 на пине RST (который как раз на D3) внутренняя подтяжка есть — проблем не возникает.
· Длина проводов — не более 30 см, иначе возможны сбои по SPI и I2C.
Как всё это работает: алгоритм и логика
Старт системы (setup)
1. Инициализируется дисплей Nokia 5110 — настраивается контраст и ориентация.
2. Запускается I2C на пинах D2 (SDA) и D1 (SCL) для BMP180.
3. Инициализируется DHT11.
4. Если BMP180 не отвечает — выводим ошибку на дисплей и зависаем.
5. Открываем файловую систему LittleFS (на флеш-памяти ESP хранится конфиг с паролем).
6. Загружаем конфиг: SSID, пароль, статический IP, шлюз, маску. Если конфига нет — переходим в режим точки доступа.
7. Пытаемся подключиться к домашнему роутеру с этими параметрами. Есть 10 секунд таймаут.
8. Если не удалось — удаляем конфиг (чтобы не пытаться вечно) и запускаем ESP как точку доступа METEO_WIFI с паролем 12345678.
Основной цикл (loop)
1. Каждые 2 секунды опрашиваем датчики и сохраняем значения в глобальные переменные.
2. Каждые 2 секунды переключаем режим дисплея: температура → влажность → давление → и по кругу.
3. Постоянно обрабатываем входящие веб-запросы.
Почему 2 секунды?
· DHT11 не может обновляться чаще раза в секунду — физическое ограничение датчика.
· Человеческий глаз успевает прочитать крупные цифры за 2 секунды и не устаёт.
· Переключение режимов не слишком частое, но и не слишком медленное.
Как работает веб-интерфейс
ESP создаёт веб-сервер на порту 80. Когда вы заходите в браузере на IP-адрес ESP, она отдаёт HTML-страницу со стилями и текущими показаниями датчиков. Если ESP в режиме точки доступа — страница также содержит форму для ввода параметров домашней сети.
Форма отправляет GET-запрос на адрес /save с параметрами:
text
/save?ssid=MyWiFi&pass=MyPassword&ip=192.168.1.150&gw=192.168.1.1&sub=255.255.255.0
ESP парсит эти параметры, декодирует спецсимволы (в том числе знаки вроде !@#$% в пароле), пытается подключиться к роутеру. Если подключение успешно — сохраняет конфиг во флеш-память. Если нет — не сохраняет и возвращается в режим точки доступа.
Почему статический IP? Чтобы всегда знать, по какому адресу открывать страницу после подключения к домашней сети. Можно было бы использовать mDNS (esp-meteo.local), но это усложняет код.
Программа: общая структура
Код написан в Arduino IDE. Основные блоки:
Подключение библиотек
cpp
#include <ESP8266WiFi.h> // Wi-Fi для ESP8266
#include <Wire.h> // I2C для BMP180
#include <Adafruit_BMP085.h> // Давление
#include <DHT.h> // Влажность
#include <LittleFS.h> // Файловая система для хранения конфига
#include <ArduinoJson.h> // Сериализация JSON
#include <Adafruit_GFX.h> // Графика для дисплея
#include <Adafruit_PCD8544.h> // Драйвер Nokia 5110
Объявление пинов и объектов
cpp
#define DHTPIN D6
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
Adafruit_PCD8544 display = Adafruit_PCD8544(D5, D7, D8, D4, D3);
Переменные для хранения данных
· lastTemperature, lastHumidity, lastPressure — последние значения с датчиков.
· displayMode — текущий режим (0 — температура, 1 — влажность, 2 — давление).
· lastSwitch и lastSensorRead — таймеры для Millis() (не используем delay, чтобы не блокировать веб-сервер).
· is_connected_to_router — флаг, который определяет, в каком режиме находится ESP.
Основные функции
· displaySplash() — заставка при запуске.
· updateDisplay() — рисует текущий режим крупными цифрами.
· displayLargeNumber() — выводит крупный шрифт для значений.
· parseParam() — декодирует спецсимволы в URL.
· saveConfig() и loadConfig() — работа с конфигом в LittleFS.
· handleSaveConfig() — обработка отправки формы настроек Wi-Fi.
· sendMainPage() — генерация HTML-страницы.
Подводные камни
Питание
ESP8266 при подключении к Wi-Fi потребляет пиковый ток до 300–400 мА. Лучше использовать качественный преобразователь напряжения AC-DCи конденсатор на емкость не менее 1000 мкФ (10 и более вольт а так что окажется ближе под рукой) и параллельно добавить 0,1 мкФ.
GPIO0 и GPIO2
На Wemos D1 mini пины D3 (GPIO0) и D4 (GPIO2) имеют особую роль при старте — они должны быть подтянуты к питанию, иначе ESP уходит в режим прошивки. Nokia 5110 на этих пинах висит с внутренними подтяжками, но если вы используете другие датчики — проверьте.
Длина проводов
Датчик DHT11 на проводе длиннее 50 см начинает врать (показания прыгают). BMP180 по I2C тоже чувствителен к длине. Я разместил оба датчика рядом с платой, на расстоянии не более 15 см.
Контраст дисплея
У Nokia 5110 регулировка контраста программная, но у каждого экземпляра оптимальное значение своё (от 45 до 65). Я вывел регулировку в отдельную константу в коде.
Что можно улучшить
· Добавить датчик освещённости — чтобы регулировать подсветку дисплея.
· Передавать данные на сервер (ThingSpeak, Blynk, свой сайт) — для сбора статистики.
· Добавить второй дисплей или экран большего размера.
· Перевести ESP в режим глубокого сна — если питать от батарейки, потребление можно снизить до микроампер.
Заключение
Эта метеостанция — пример того, как из доступных компонентов собрать действительно полезное устройство. Да, DHT11 не даст лабораторной точности, но для отслеживания динамики и просто для удовольствия от процесса — он идеален.
Самое приятное — увидеть первые цифры на экране после того, как сам всё спаял и залил код.
P.S. Полный код и схему выкладываю в открытый доступ.
P.P.S. Не бойтесь экспериментировать с пинами и датчиками. ESP8266 довольно живучая, главное — не подавайте 5V на 3.3V входы, остальное прощается.
Прошивка прилагается: https://disk.yandex.ru/d/RekilVnH6StB_A