Добавить в корзинуПозвонить
Найти в Дзене

Метеостанция на ESP8266 с дисплеем Nokia 5110

Вместо введения: зачем мне это понадобилось Всё началось с того, что я устал каждое утро лезть в телефон, чтобы узнать погоду. Хотелось, чтобы прямо на столе, первым делом после пробуждения, я видел температуру, влажность и давление. Готовые метеостанции стоят дорого, а самоделка — это и дешевле, и интереснее. Плюс можно добавить функцию, которой нет в магазинных: например, управление через веб-интерфейс или передачу данных на свой сервер. В этой статье я расскажу, как собрал свою метеостанцию на базе ESP8266 (Wemos D1 mini), датчиках DHT11 и BMP180, монохромном дисплее Nokia 5110. Спойлер: всё получилось, и она работает до сих пор. Что умеет наша метеостанция Характеристики готового устройства: Дисплей циклически каждые 2 секунды показывает крупные значения температуры, влажности и давления. Внизу экрана — статус подключения к домашней сети и маленькие точки-индикаторы текущего режима. Главный мозг. У него есть Wi-Fi (нужно для веб-интерфейса), он дешёвый и потребляет мало тока. Wemos
Оглавление

Вместо введения: зачем мне это понадобилось

Всё началось с того, что я устал каждое утро лезть в телефон, чтобы узнать погоду. Хотелось, чтобы прямо на столе, первым делом после пробуждения, я видел температуру, влажность и давление. Готовые метеостанции стоят дорого, а самоделка — это и дешевле, и интереснее. Плюс можно добавить функцию, которой нет в магазинных: например, управление через веб-интерфейс или передачу данных на свой сервер.

В этой статье я расскажу, как собрал свою метеостанцию на базе 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-порт прямо на плате, не нужен программатор.

Рис 1. Модуль WEMOS D1 Mini
Рис 1. Модуль WEMOS D1 Mini

Датчик DHT11

Самый дешёвый датчик температуры и влажности. Недостаток — низкая точность и медленный опрос (раз в секунду). Но для бытовой метеостанции этого за глаза. Можно поставить DHT22 — он точнее, но дороже. Я выбрал DHT11 из экономии.

Датчик BMP180

Измеряет давление и температуру (но температуру беру с DHT11, она точнее для комнатных условий). BMP180 работает по I2C, подключается всего двумя проводами. Давление выдаёт в гектопаскалях, перевожу в миллиметры ртутного столба (умножением на 0,750062). Для предсказания погоды важна динамика, а не абсолютная цифра.

Рис2. Компоненты для сборки метеостанции без дисплея
Рис2. Компоненты для сборки метеостанции без дисплея

Дисплей Nokia 5110

Легендарный экран от старых телефонов. Монохромный, 84×48 пикселей. Читается на солнце отлично (в отличие от цветных TFT). Контраст регулируется программно. Управляется по SPI — нужно всего 4 пина данных. Библиотека Adafruit_PCD8544 делает работу с ним очень простой.

Рис3. Схема соединения деталей
Рис3. Схема соединения деталей

Зачем вообще все эти детали?

· Если убрать дисплей — получится «голый» датчик, но данные придётся смотреть только через веб-интерфейс, что неудобно.

· Без веб-интерфейса нельзя будет сменить сеть 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 в режим глубокого сна — если питать от батарейки, потребление можно снизить до микроампер.

Рис4. Собранная электронная часть на макетной плате
Рис4. Собранная электронная часть на макетной плате
Рис5. Внешний вид собранного устройства в распечатаном на 3D принтере корпусе
Рис5. Внешний вид собранного устройства в распечатаном на 3D принтере корпусе
Рис6. Так выглядит интерфейс отображения параметров на телефоне
Рис6. Так выглядит интерфейс отображения параметров на телефоне

Заключение

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

Самое приятное — увидеть первые цифры на экране после того, как сам всё спаял и залил код.

P.S. Полный код и схему выкладываю в открытый доступ.

P.P.S. Не бойтесь экспериментировать с пинами и датчиками. ESP8266 довольно живучая, главное — не подавайте 5V на 3.3V входы, остальное прощается.

Прошивка прилагается: https://disk.yandex.ru/d/RekilVnH6StB_A