Рубрики
Проекты на ESP32

Настольная метеостанция ​​с использованием ESP32 и дисплея E-ink

В современном быстро меняющемся мире многие из нас проводят долгие часы в помещении — работая из дома, учась или просто управляя своими повседневными делами. Естественные сигналы, такие как изменение неба, температура на улице или ощущение влажности, часто теряются за четырьмя стенами и закрытыми окнами. Это может мешать оставаться в курсе того, что происходит снаружи, особенно когда наше внимание привязано к цифровым устройствам. Наличие специального, всегда видимого дисплея погоды на вашем столе добавляет тонкую, но значимую связь с внешним миром. Это небольшой штрих, который может помочь спланировать свой день, узнать, когда следует взять куртку перед выходом на улицу, или просто насладиться мягким напоминанием о том, что время и погода продолжают меняться за пределами экрана.

Этот проект предлагает практичный способ построить чистую и минималистичную метеостанцию ​​своими руками с использованием микроконтроллера ESP32 и дисплея E-Ink. Использование E-Ink гарантирует, что дисплей остается читаемым даже без постоянного питания, что делает его идеальным для настольного использования с питанием от батареи. После подключения к Wi-Fi станция получает данные о погоде в режиме реального времени, такие как температура, влажность и текущие условия, с помощью API OpenWeatherMap. Она также контролирует температуру и влажность в помещении с помощью встроенного датчика и дополняет данные, отображаемые на экране. Устройство автоматически обновляется через фиксированные интервалы и переходит в режим глубокого сна для экономии энергии. После сборки оно становится тихим и элегантным компаньоном на вашем столе, держа вас в курсе событий, без отвлекающих факторов смартфона или экрана компьютера.

Также на нашем сайте вы можете посмотреть и другие проекты метеостанций:

Необходимые компоненты

  1. ESP32-S3-WROOM-1-N16R8 (купить на AliExpress).
  2. 4,2-дюймовый дисплей EPD (купить на AliExpress).
  3. Датчик температуры и влажности HPP845E031R4.
  4. ADP124ACPZ 3,3 В LDO (купить на AliExpress).
  5. Микросхема зарядного устройства для аккумуляторов MAX1898 (купить на AliExpress).
  6. МОП-транзисторы, диоды и светодиоды.
  7. Другие пассивные компоненты.
  8. Переключатели и разъемы.
  9. Индивидуальная печатная плата.
  10. Детали, напечатанные на 3D-принтере.
  11. Другие инструменты и расходные материалы.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

Функции настольной метеостанции

  • Многоцветный дисплей E-Ink: 4,2-дюймовый многоцветный дисплей E-Ink, сохраняющий контент видимым без постоянного потребления энергии.
  • ESP32-S3 SoC: микроконтроллер ESP32-S3 управляет связью по Wi-Fi, сбором данных и обновлением дисплея.
  • Поддержка API погоды: использует API OpenWeatherMap для получения данных о погоде, таких как температура наружного воздуха, состояние и местоположение.
  • Мониторинг в помещении: специальный маломощный датчик для мониторинга температуры и влажности в помещении.
  • Низкое энергопотребление: одной зарядки хватает на несколько дней.
  • Автоматический спящий режим: переходит в режим глубокого сна после каждого обновления для экономии заряда батареи.
  • Индивидуальная разработка печатной платы: все компоненты аккуратно размещены на индивидуальной печатной плате, разработанной с помощью KiCad.

Принципиальная схема настольной метеостанции

Полная принципиальная схема настольной метеостанции представлена ​​ниже. Её также можно скачать в формате PDF из репозитория GitHub, ссылка на который приведена в конце статьи.

Мы разделили схемы на несколько разделов в зависимости от функциональности. Это значительно упростит понимание каждого раздела. Давайте рассмотрим каждый раздел отдельно.

В первой секции у нас есть вход USB вместе со схемой управления питанием. Вход USB типа C используется для зарядки внутренней батареи, а также для программирования и отладки встроенной ESP32-S3 SoC. Два подтягивающих резистора добавлены к входу CCx, так что плата будет работать без проблем с хостом типа C. Линии данных USB напрямую подключены к собственному выводу USB ESP32-S3. Далее у нас есть схема управления трактом питания, построенная на P-канальном MOSFET AO3401 и диоде Шоттки SS14. Эта секция гарантирует, что остальная часть платы может без проблем питаться как от батареи, так и от входа USB. Далее следует сверхмалошумящий стабилизатор напряжения с малым падением напряжения ADP124ACPZ от Analog Devices. Этот LDO отвечает за создание линии 3,3 В, необходимой остальной части схемы.

В следующем разделе мы видим, что выключатель питания подключен к выводу разрешения LDO-стабилизатора APD124. Для зарядки аккумулятора мы использовали микросхему зарядки одноэлементных литиевых аккумуляторов MAX1898 от Analog Devices. Она может заряжать встроенный аккумулятор максимальным током до 500 мА. В зависимости от используемого аккумулятора необходимо изменить значение резистора программирования тока заряда для установки оптимального тока. Как видите, для аккумулятора мы предусмотрели два варианта: пользователь может использовать LIR2450, который устанавливается во встроенный держатель, или подключить LiPo-аккумулятор через разъём JST. Для измерения напряжения аккумулятора используется делитель напряжения, который отображается на дисплее E-Ink/EPD.

Как уже упоминалось, мозг настольной метеостанции — это микросхема на кристалле ESP32-S3. Мы использовали модуль ESP32-S3-Wroom-1, чтобы упростить процесс сборки и не беспокоиться о радиочастотной составляющей, которая была бы проблематичной при использовании простого чипа ESP32-S3. Микросхема супервизора напряжения ADM803 используется для контроля питания и обеспечения корректного запуска ESP32-S3. Разъёмы USC подключены к выводам GPIO19 и GPIO20, которые являются собственными выводами USB ESP32-S3. На схеме есть две кнопки: одна для выбора загрузки, а другая для ручного сброса. Эти кнопки будут полезны при перепрограммировании ESP32-S3, если автоматическая прошивка через USB не работает.

Раздел дисплея E-Ink довольно прост и соответствует инструкциям производителя. Мы использовали дисплейный модуль E2417JS0D6 от Pervasive Displays — это 4,2-дюймовый трёхцветный дисплей E-Ink с разрешением 400 x 300 пикселей. Схема драйвера взята непосредственно из технического описания модуля дисплея, а некоторые компоненты заменены на аналогичные из-за отсутствия рекомендуемых компонентов.

И наконец, у нас есть HPP845E — высокоточный датчик относительной влажности и температуры от TE Connectivity. HPP845E относится к серии HTU21D и совместим с другими датчиками HTU21D. Он может измерять температуру в широком диапазоне от -40 до 125 °C и относительную влажность от 0 до 100%. Он подключен к ESP32-S3 через интерфейс I2C. Этот датчик отвечает за мониторинг окружающей среды в помещении в нашей настольной метеостанции.

Печатная плата настольной метеостанции

Для этого проекта мы решили изготовить индивидуальную многоцветную печатную плату. Это обеспечит максимальную компактность конечного продукта, а также простоту сборки и использования. Печатная плата разработана в KiCad. Все файлы проекта доступны для скачивания из репозитория GitHub, ссылка на который приведена в конце каждой статьи. Размер каждой грани печатной платы составляет приблизительно 105 x 90 мм.

Вот верхний и нижний слои печатной платы.

После того, как печатная плата готова и полностью проверена, мы отправляем её на производство. Вот готовые печатные платы от производителя.

Сборка печатной платы настольной метеостанции

Первым шагом при сборке печатных плат стала сортировка всех необходимых компонентов в соответствии с спецификацией. После этого мы разместили их на плате и припаяли один за другим. Для упрощения процесса можно использовать трафарет для SMD-монтажа, чтобы нанести паяльную пасту, а затем разместить на нём компоненты перед оплавлением платы в паяльной станции SMD или печи для оплавления. Ниже представлены изображения полностью собранной печатной платы метеостанции.

А вот полностью собранная печатная плата вместе с дисплейным модулем.

Детали метеостанции, напечатанные на 3D-принтере

Мы разработали корпус для метеостанции, напечатанный на 3D-принтере, чтобы он стал стильным гаджетом для вашего рабочего стола. Файлы всех деталей, напечатанных на 3D-принтере, можно скачать по ссылке на GitHub, приведённой в конце статьи, вместе с эскизом и растровым изображением для Arduino. Узнайте больше о 3D-печати и о том, как начать работать с ней, перейдя по ссылке. Вы можете скачать 3D-файлы из репозитория проекта на GitHub.

А вот обратная сторона, на которой видна подставка и монтажные отверстия.

А вот и распечатанные детали. Как видите, мы также использовали резьбовую вставку для винтов. Используемые винты — это винты М2,5 длиной 6 мм.

Сборка настольной метеостанции 

Когда все детали готовы, можно приступать к сборке настольной метеостанции. Вот всё, что нужно сделать перед окончательной сборкой.

Чтобы собрать настольную метеостанцию, сначала вставьте дисплейный модуль в распечатанную на 3D-принтере рамку, а затем полностью собранную печатную плату. Аккуратно вставьте гибкий кабель дисплея в разъём дисплея и закрепите его. Затем подключите аккумулятор.

Затем закройте заднюю панель и закрепите её на передней раме винтами M2.5 длиной 6 мм. После этого можно прикрепить подставку к задней панели винтами M2.5. Вот конечный результат.

Код Arduino для настольной метеостанции

Теперь, когда мы разобрались, как устроена схема, давайте взглянем на код, который всё это работает. Несмотря на то, что в коде есть несколько файлов, мы обсудим только два самых важных: файл config.h, содержащий пользовательские конфигурации, и основной скетч Arduino, содержащий основные функции и переменные. Прошивка этого проекта основана на превосходной работе Дэвида Бёрда. Код был адаптирован из его оригинальной реализации, которую вы можете найти здесь: ESP32 Weather Paper Display . Прежде чем погрузиться в код, убедитесь, что ваша среда разработки Arduino IDE правильно настроена для проекта. Установите менеджер плат ESP32, если он ещё не установлен, и выберите ESP32-S3 в качестве платы. Вам также потребуется установить несколько библиотек, включая GxEPD2 для дисплея E-Ink, U8g2_for_Adafruit_GFX для дополнительной графической поддержки и ArduinoJson для обработки данных JSON. После установки платы и библиотек можно приступать к внесению изменений или компиляции кода.

Для начала рассмотрим файл config.h. Как следует из названия, этот файл содержит пользовательские настройки Wi-Fi и API карт OpenWeather.

В этом разделе кода вам необходимо ввести свои учётные данные Wi-Fi, заменив значения ssid и password на имя и пароль вашей сети Wi-Fi, чтобы ESP32 мог подключиться к Интернету. Проект получает данные о погоде в режиме реального времени из OpenWeatherMap, поэтому вам необходимо зарегистрироваться на сайте openweathermap.org, чтобы получить бесплатный ключ API, и заменить значение apikey на своё собственное. Домен сервера api.openweathermap.org предназначен для выполнения HTTP-запросов на получение данных о погоде. Кроме того, укажите своё точное географическое местоположение, обновив переменные LAT и LON своими координатами широты и долготы. Для наглядности отображения погоды укажите город и страну с помощью переменных City и Country, выберите предпочитаемый язык описания погоды в поле Language и укажите полушарие (северное или южное). 

Переменная Units позволяет выбрать метрические (M) или имперские (I) единицы измерения для температуры и скорости ветра. Здесь также настраиваются параметры времени: установите часовой пояс с помощью строки Timezone (например, «IST-5:30» для индийского стандартного времени), укажите NTP-сервер (ntpServer) для синхронизации часов реального времени с интернет-временем и задайте значения gmtOffset_sec и daylightOffset_sec для корректировки времени в соответствии с вашим местным смещением по Гринвичу и настройками перехода на летнее время. Все эти параметры гарантируют успешное подключение ESP32, получение точных данных о погоде для вашего местоположения и их отображение в выбранном вами формате и на выбранном языке (в настоящее время код поддерживает только английский).

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

Код начинается с подключения всех необходимых библиотек, файлов конфигурации, настроек отображения, определений датчиков и глобальных переменных, необходимых для запуска проекта метеостанции. Он начинается с включения файла config.h, в котором пользователь должен ввести свой ключ API OpenWeatherMap, а также учётные данные Wi-Fi и другие параметры конфигурации. Для управления подключением к Интернету, синхронизации времени и обмена данными включены такие основные библиотеки, как ArduinoJson, WiFi, time и SPI. Библиотека GxEPD2 используется для управления дисплеем на электронной бумаге, а библиотека U8g2_for_Adafruit_GFX обеспечивает высококачественную визуализацию шрифтов. Для управления шрифтами, структурами данных о погоде и языковыми настройками включены несколько пользовательских заголовочных файлов, таких как epaper_fonts.h, forecast_record.h и lang.h.

Датчик температуры и влажности HPP845E031R4 (серия HTU21D) инициализируется по интерфейсу I2C стандартным адресом и командными константами. Размеры дисплея определены для альбомной ориентации, а контакты подключения сопоставлены для взаимодействия ESP32 с дисплеем на основе электронной бумаги. Инициализируется трёхцветный объект отображения на основе электронной бумаги, а также настраиваются объекты шрифтов для отображения текста. Для гибкости проектирования дисплея перечислено несколько вариантов шрифтов. Объявлены флаги и значения для управления размерами значков дисплея, временем удержания и строками данных о погоде, а также для управления временными переменными. Определены массивы для хранения показаний давления, температуры, влажности, дождя и снега, которые полезны для построения трендов и прогнозов. Массивы Forecast_record_type хранят текущие и прогнозируемые данные о погоде. Также определена переменная для установки продолжительности глубокого сна, что позволяет устройству просыпаться через регулярные интервалы (например, каждые 15 минут) для получения и отображения новых данных о погоде. Если вы хотите настроить частоту обновления дисплея, измените эту переменную соответствующим образом.

В функции setup() ESP32 инициализирует основные компоненты и выполняет начальную выборку данных о погоде. GPIO 16 настроен как выход для управления питанием E-Ink дисплея и устанавливается в состояние LOW для включения питания. GPIO 42 подключен к светодиоду, который включается установкой в ​​состояние HIGH. После этого запускается последовательная связь для отладки, и инициализируется шина I2C для датчика температуры и влажности. На датчике выполняется мягкий сброс, а его внутренний нагреватель отключается для обеспечения точности показаний. Затем код пытается подключиться к Wi-Fi и синхронизировать системное время. Если обе операции успешны, E-Ink дисплей инициализируется, и данные о погоде запрашиваются с помощью объекта клиента Wi-Fi. Он пытается получить до двух раз как текущие данные о погоде, так и прогнозируемые данные. В случае успеха Wi-Fi отключается для экономии энергии, отображаются данные о погоде и запускается полноэкранное обновление на дисплее. Наконец, система переходит в режим глубокого сна с помощью функции BeginSleep для экономии энергии между обновлениями. Функция цикла (loop) не содержит много кода, поскольку все операции выполняются внутри функции setup().

Функция BeginSleep отвечает за перевод ESP32 в режим глубокого сна для экономии энергии. Она отключает дисплей E-Ink, отключает GPIO, подключенные к дисплею и светодиоду, рассчитывает точную продолжительность сна в соответствии с предполагаемым интервалом пробуждения и инициирует глубокий сон с помощью функции esp_deep_sleep_start. Это помогает периодически обновлять прогноз погоды, поддерживая низкое энергопотребление.

Функция DisplayWeather управляет всей компоновкой E-Ink-дисплея, вызывая различные функции отрисовки. Она включает в себя заголовок, основной раздел погоды, прогноз погоды, осадки, видимость, облачность и астрономические данные, каждый из которых стратегически расположен на экране для наглядности.

Раздел DrawHeadingSection рисует верхнюю часть экрана, включая название города, текущую дату, время, уровень заряда батареи и горизонтальную разделительную линию. Раздел DrawMainWeatherSection создаёт центральную область, отображающую значок погоды, температуру, влажность и краткое описание прогноза. Он также рисует рамку вокруг этой информации.

Раздел DrawForecastSection отображает данные краткосрочного прогноза погоды в трёх отдельных блоках и соответствующих графиках давления, температуры и количества осадков.

Функция DrawForecastWeather используется для создания каждого из этих блоков прогноза с указанием времени, значка и диапазона температур.

Функция DrawMainWx выводит текущую температуру, влажность и максимальные/минимальные значения. DisplayDisplayWindSection отображает индикатор направления ветра, похожий на компас, а также скорость ветра и стороны света. Функция WindDegToDirection преобразует угол ветра в текстовое значение направления ветра.

Функция Display_HPP845E_Data используется для отображения температуры и влажности с датчика HTU21D на небольшой панели дисплея. DisplayPrecipitationSection отображает количество осадков и снега с помощью простых значков, если значения превышают пороговое значение.

Раздел DrawAstronomySection отображает текст о восходе, закате и фазах Луны и вызывает функцию DrawMoon для отображения её визуального представления. Фаза Луны рассчитывается с помощью функции MoonPhase , которая использует математические вычисления на основе даты для определения текущей фазы и возвращает соответствующую метку.

Функция DisplayWXicon выбирает подходящую процедуру отрисовки на основе кода значка погоды из OpenWeatherMap. Она сопоставляет строки значка, например, «01d» или «09n», с соответствующими функциями отрисовки символов, такими как «Солнечно», «Дождь», «Туман» и другими, упомянутыми выше. Эти функции используются для отрисовки различных значков с использованием простых графических примитивов в зависимости от погодных данных. Функция drawBattery отображает состояние батареи, а функция drawGrapgh отвечает за графики прогноза погоды. 

Функция StartWiFi подключает ESP32 к настроенной сети Wi-Fi и проверяет её состояние в течение 15-секундного тайм-аута. В случае успешного подключения она регистрирует уровень сигнала. Функция StopWiFi отключает и выключает Wi-Fi-модуль для экономии энергии. Функция SetupTime настраивает ESP32 на получение корректного местного времени с помощью NTP-серверов. Она устанавливает часовой пояс и вызывает функцию UpdateLocalTime для получения и форматирования текущего времени и даты, сохраняя их в глобальных переменных для отображения.

InitialiseDisplay настраивает E-Ink-дисплей с необходимой конфигурацией SPI и инициализирует механизм рендеринга шрифтов. Он очищает экран и переводит дисплей в полнооконный режим для обновления. Функции drawString и drawStringMaxWidth обрабатывают различные текстовые элементы в пользовательском интерфейсе.

Остальные функции отвечают за управление датчиками температуры и влажности в помещении. Функция softReset отправляет команду мягкого сброса датчику HTU21D, чтобы убедиться в его готовности к использованию. Функция disableHeater считывает и изменяет регистр конфигурации датчика, чтобы убедиться, что внутренний нагреватель выключен, что повышает точность измерений. Функции readTemperature и readHumidity взаимодействуют с датчиком HTU21D по интерфейсу I2C для получения необработанных значений температуры и влажности, преобразования их в понятный человеку формат и отображения.

Репозиторий GitHub с кодом и схемой

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *