11270

Мой открытый проект метеостанции с монохромным дисплеем

Дописал документацию к своей железке. Хотел бы показать чего получилось

Метеостанция Волна 2BW42

Метеостанция Волна 2BW42

Если вкратце про сам проект - метеостанция рассчитана на интеграцию в систему умного дома - данные о внешнем датчике устройство получает через Home Assistant или Domoticz, и так же может отправлять свои данные по MQTT (в HA девайс подхватывается через Auto Discovery, в Domoticz через виртуальные датчики)

Прошивка совместима с ESP8266 и ESP32 (Arduino Framework, C++, PlatformIO); внутренний датчик температуры \ влажности BME280. Прошивка работает с дисплеями на электронных чернилах 4.2' и 1.54' дюйма (таблицы совместимости с теми производителями с которыми тестил можно найти на сайте с документацией). Сами E-Ink дисплеи своеобразны в работе и значительно медленней отрисовывают всю область экрана в сравнении с обычными жк, но не требуют постоянного питания для отображения картинки и для автономного девайса подходят хорошо, позволяя очень существенно экономить расход батареи. В живую картинка на таком экране читается приятно, как с обычного листа бумаги.

В режиме работы от аккума устройство просыпается раз минуту для обновления области часов на экране и раз в 10 минут для полного обновления (датчики температуры и другая статистика), WiFi-соединение (синхронизация данных по внешнему датчику, отправка своих данных по MQTT) раз в час в целях экономии заряда; аккума 18650 2000 мА*ч хватает на ~несколько месяцев. Все таймауты при желании можно перенастроить.

Оформление интерфейса изначально делал под дисплеи 4.2' (400х300), с котиком-индикатором который меняется от погодных условий \ времени.

интерфейс по умолчанию

интерфейс по умолчанию

Некоторые зарисовки иконок которые делал для проекта, часть задействованы для индикатора :

В актуальных обновлениях прошивки добавлен конструктор интерфейсов без строгой привязки к разрешению экрана и необходимости лезть непосредственно в код \ перепрошивки чтобы можно было залить свою картинку в качестве фона и расположить "виджеты" просто через веб-интерфейс устройства.

Пример настройки кастомного оформления (фоновая картинка может быть и на весь экран) :

редактор интерфейсов

редактор интерфейсов

интерфейс для мелких дисплеев 1.54'

интерфейс для мелких дисплеев 1.54'

Еще некоторые фотографии с процесса сборки под разные варианты корпуса

Основание корпуса-подставки

Основание корпуса-подставки

вариант полностью закрытого корпуса (чуть промахнулся с размерами, в исходниках модельки 3д принта уже поправил)

вариант полностью закрытого корпуса (чуть промахнулся с размерами, в исходниках модельки 3д принта уже поправил)

Опционально в прошивке реализована возможность вывода картинок c 4 цветном режиме (2-bit). Если сам e-ink экран поддерживает такой режим работы, то можно загрузить картинку фона в таком режиме.

Пример отрисовки фона в градациях серого :

Тестовый "толстый" корпус с доступом к внутренностям. Использовался экран с двойным слоем чернил (красный \ черный), к сожалению они значительно медленней в плане отрисовки

Тестовый "толстый" корпус с доступом к внутренностям. Использовался экран с двойным слоем чернил (красный \ черный), к сожалению они значительно медленней в плане отрисовки

Такой проект получился. Более детально по каждому аспекту, касательно сборки, скорости отрисовки, совместимости с конкретными модулями экранов, процессу прошивки и первичной настройки, примерам моделек корпусов и т.п. постарался подробно описать на сайте проекта.

Проект полностью открытый, можно использовать как для коммерческих так и для личных целей. Если вдруг есть идеи с какими открытыми сервисами погоды можно было бы еще добавить интеграцию (например если кому то захочется использовать вне системы "умного дома"), можно так же написать или мб еще есть какие идеи; поизучаю апишки, мб что-нибудь выберу для дальнейших доработок.


Сайт с документацией (Метеостанция Волна 2BW42)
GitHub страница с прошивкой

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий

Потрясающе!

Крутой проект, отличная реализация)

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

Кстати, хотел узнать: каким алгоритмом преобразования картинок в двухцветный растер ты использовал? И ещё вопрос: при перегонке растра в bytearray сколько места занимает сам массив данных каждой картинки и какие размеры в пикселах каждой картинки с котиками?

раскрыть ветку (4)
1
Автор поста оценил этот комментарий

спасибо!

> при перегонке растра в bytearray сколько места занимает сам массив данных
Если в целом для одноцветных 1 пиксель 1 бит
Если с полутонами 1 пиксель 2 бита

соответственно весь канвас 400х300 \ 8 = 15кб для однобитных и х2 для 2х

Отдельные тайлы-иконки в среднем до 1.5кб размеры плавающие чтобы пустоту срезать, просто отрисовываю по оффсетам - картинки в среднем 120х120
https://github.com/NC22/Volna42BW/tree/main/Volna42/src/tile...
всякая мелочевка уже в байтах.

> каким алгоритмом преобразования картинок в двухцветный растер ты использовал
Алгоритм на основе примеров по дизерингу Аткенсона https://beyondloom.com/blog/dither.html

для двухбитного режима смесь поиска ближайших соответствий и этого же алгоритма, мб есть какие-то готовые алгоритмы именно под 4 цвета, но сильно не искал на эту тему

можно поковырять код или запустить офлайн для тестов просто из папки тк все предварительные преобразования делаю в вебчасти https://github.com/NC22/Volna42BW/tree/main/_uiTools
через файл PREVIEW___client_eink_uploader.html

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Благодарю за развёрнутый ответ)

И моё почтение за использование дизеринга Аткенсона!) Я восхищаюсь этим алгоритмом, потому что он творит невероятные вещи: обманывает глаза и мозг таким образом, что мы воспринимаем кучу оттенков серого на дисплее, который из-за аппаратных ограничений в теории такого делать не способен. Ну ты только подумай - монохромный дисплей в своей реализации способен рендерить только два состояния каждого пиксела: 0, когда низкий уровень сигнала и пиксель не закрашивается, и 1, соответственно, наоборот. А при помощи этого алгоритма можно выводить на такую матрицу любой оттенок серого. У меня вот это вот вызывает неподдельный восторг из-за гениальности подхода, такой же восторг у меня когда-то давно вызывал подход с управлением мощностью при помощи широтно-импульсной модуляции)))

Те, кто это придумал, явно умеют мыслить в 4-х измерениях.


А можно ещё вопрос: как ты добавил вот те красивые шрифты в память микроконтроллера и как их потом выводил на экран?

Я, например, застопорился, когда пытался вывести на oled дисплей ssd1306 кастомные шрифты. Мой Raspberry Pi Pico упрямо работал исключительно с заводским шрифтом, который лежит в ПЗУ контроллера дисплея(((


//P.S. откуда та прекрасная тянка, которая отрендерена на дисплее E-Ink? :3

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Я все думал поискать еще алгоритмы дизеринга, но так и не добрался до дальнейшых экспериментов. Этот вроде самый распространенный, а так еще интересные есть помимо Аткинсона, сами принципы оч интересные как и результат

> как ты добавил вот те красивые шрифты в память микроконтроллера и как их потом выводил на экран?

Именно для рендера шрифтов можно использовать какую-нибудь готовую библиотеку для отрисовки. Обычно все везде встраивают шрифты \ либы от adafruit. Я делал свой велосипед - шрифты конвертятся из типовых \ векторных форматов через интструмент написаный на JS - он так же доступен в браузере - https://volna42.com/tools/fontconverter в растровые глифы-иконки которые помещаются в бинарный массив C++ и структуру с информацией где какой символ расположен. Далее уже этот массив используем при отрисовке через сввою либу-рисовалку. так можно сконвертить любой готовый шрифт при желании и все популярные библиотеки работают похожим образом.

на ssd1306 должно быть возможно выводить конкретные пиксели \ обновлять весь буфер пикселей, так что и шрифты при желании тоже можно найти способ отрисовать, либо использовать готовые либы и под них конвертить нужный шрифт

на счет рисунков не знаю про какой ты конкретно, но эт всякое из того что когда то рисовал

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Огромное тебе человеческое спасибо за ответы :3

Благодаря твоей помощи я понял, в каком месте у меня затуп был, и теперь у меня получится доделать газоанализатор, термостат и метеостанцию))


Дружище, у тебя руки и мозги золотые, ещё и растут с нужного места. Ты умеешь находить правильный подход к задаче в целом и к микроконтроллерам в частности, ты крут, так держать!


А ещё после того, как ты сказал что та девчёнка на дисплее из твоих рисунков, я зашёл к тебе на страницу и впал в экстаз. Оказывается, ты ещё и рисуешь как боженька! =^_^=

Особенно понравилась серия с автомобилями. Ууухх, обожаю смотреть на нарисованные автомобили <3


Вы, сударь, не обычный человек, вы - тот самый сын маминой подруги, гигачад во плоти :)

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку