В топике будет описан погодный информер на основе трехцветного дисплея e-paper.
Особенность информера — изображение готовится на внешнем компьютере.
Погодный информер на цветном e-paper дисплее
Года три назад я купил на Ali цветной e- paper дисплей «Waveshare 4.2 inch e-paper module», руководствуясь в основном желанием попробовать новую технологию своими руками.
Дисплей может отображать 3 цвета (белый, черный, красный) с разрешением 400 на 300 точек. Интерфейс подключения – SPI. Всего требуется подключить пять информационных сигналов: DIN, CLK, CS, BUSY, RESET.
Плюс естественно GND и питание.
Принцип действия такого дисплея: в жидкости находятся сферы, окрашенные в три цвета. Они могут поворачиваться под действием электрического поля и оставаться в таком состоянии неопределенно долгое время.
Основное достоинство такого дисплея в том, что энергия для его работы требуется только на этапе вывода новой информации. В статике энергия не требуется совсем.
Поэтому такой дисплей идеален в системах с автономным питанием с нечастым обновлением данных.
Поставленная задача была такой: сделать автономный беспроводной блок с e-paper дисплеем, на котором можно будет отображать информацию о текущей погоде и прогноз на ближайшее время.
Размещаться такой блок предполагалось в прихожей, чтобы погодную информацию можно было посмотреть в момент выхода и решить, например, надо брать зонт с собой.
Конечно я знаю, что можно ровно то же самое посмотреть на экране смартфона :))
Дисплей был куплен, присоединен к ESP8266 и опробован в работе с помощью программы Loader.ino, которую предлагает Waveshare. При запуске esp8266 создает сайт, зайдя на который можно вывести изображение на дисплей.
Оказалось, что картинки выводятся весьма убого… Т.е. дисплей пригоден для вывода текстовой информации, но и не более того.
К сожалению, этот проект был заморожен до текущего времени. Когда я попытался реанимировать проект, оказалось, что дисплей на управляющие команды реагирует (видно характерное моргание), но новое изображение не появляется. На экране появляется просто цветной шум.
Обдумав ситуацию и почитав мануалы на сайте производителя дисплеев, я понял, что есть вероятность необратимого повреждения дисплея…
На следующее утро я все же решил попробовать восстановить нормальную работу достаточно дорогого прибора. Для этого я сделал битмап файлы типа «белое поле», «черное поле», «красное поле» и половинки в разных комбинациях (черно-белое, черно красное и т.д.)
Повыводив эти картинки, я обнаружил, что дисплей восстановился и нормально работает. Механизм мне непонятен, но факт имеет место.
Возможно, свою роль сыграло длительное хранение дисплея не в рекомендованном положении, а случайном. Шарики опустились к одной из поверхностей и прилипли к ней, а вывод монотонных изображений сдвинул из с места. Но это исключительно мои предположения, я не специалист в этих устройствах.
Итак, можно делать прибор.
Аппаратное решение
Требования: питаться от аккумулятора, по Wi-Fi соединяться c сервером, на котором работает IIS. IIS будет отдавать графический файл для отображения и принимать данные с информера. Требуется минимальное потребление энергии, аккумулятора должно хватать на 1 год или более. Процессор для управления будет ESP8266.
Дисплей достаточно большой по размеру, корпус тоже достаточно большой, можно использовать большую батарею. Для питания системы оптимален аккумулятор типа LiFePO4. Его напряжение полностью укладывается в рамки допустимого напряжения для питания ESP8266. Никаких промежуточных преобразователей не требуется, что дополнительно экономит энергию батареи.
Поскольку я склонен к брутальным решениям, я выбрал плоскую LiFePo4 батарею емкостью 4 ампер-часа. Мне повезло – я нашел на Али производителя батарей, у которого можно было купить одну батарею. Она обошлась мне в 800 р. На сегодня этот производитель продает такие батареи только по 4 штуки. Впрочем, именно такая плоская батарея не обязательна, можно использовать LiFePo4 элементы в корпусе 18650 или 26650. Два элемента 18650 дадут примерно ту же емкость, которой хватит на год работы.
Батарея точно встала в корпус.
Зарядка батареи
Для зарядки LiFePO4 нужен зарядник с напряжением 3.6 вольта. Поиск на Али дал мне зарядник импульсного типа пригодный для LiFePO4. Название платы TP5000.
Режим сна ESP8266
Тест платы на засыпание и просыпание показал, что, во-первых, ток потребления составляет примерно 1.5 мА в состоянии сна, а во-вторых плата просыпается, но по Wi-Fi не соединяется. Ток потребления в этом режиме составил около 40 мА, что говорит об отключенном Wi-Fi.
Разбираться не стал, к этому моменту я уже располагал информацией о возможности питания ESP8266 через TPL5110. Микросхема TPL5110 представляет собой микропотребляющий коммутатор питания. TPL5110 вырабатывает сигнал включения для силового P-MOSFET ключа по истечении запрограммированного интервала. Выключается TPL5110 по сигналу от микропроцессора. Это перепад из 0 в 1. Отсюда вытекают требования к выводу процессора: этот вывод должен чисто и гладко, без ненужных сигналов вести себя при старте системы. О выборе правильной ножки ниже.
Временной интервал задается резистором. В мануале приведены значения резисторов для типовых интервалов. Я выбрал интервал 1 час.
Предварительно я проверил, сколько времени проживет информер при непрерывном обращении за информацией на сервер с IIS. Информер проработал примерно 2.5 суток до отключения по разряду батареи. Прикидочный расчет показал, что если я хочу время жизни информера 1 год, то надо его включать примерно раз в час.
В реальности интервал получился 1 час 8 минут. Подгонять я ничего не стал.
Если требуется задать интервал точнее – можно подогнать задающее сопротивление, используя либо параллельное включение доступных номиналов, либо последовательное, либо и то и другое. Я, впрочем, смысла в этом не вижу, все равно задание интервала осуществляется аналоговым способом.
TPL5110 включена по типовой схеме, применено 2 кнопки для включения и выключения в тестовых целях. Параллельно кнопке включения внутри на плате установлена плоская кнопка. Она приклеена на правом боку корпуса и может использоваться для запуска цикла обмена принудительно.
Выбор вывода ESP8266 для выключения TPL5110
ESP8266 имеет особенности при подаче питания. Особенность его в том, что выводы микросхемы при старте системы могут на какое-то время становится активными выходами и что-то выводить. На одних ногах идет отладочная информация в режиме уарт на скорости 76 кбит, на других – появляется сигнал с частотой 50 МГц.
Плюс надо учесть, что для правильного старта несколько выводов должны иметь правильную комбинацию нулей и единиц.
К счастью, я далеко не первый озаботился этим вопросом. На
сайте представлено исчерпывающее исследование, что происходит с выводами ESP8266 при старте и какие выводы можно безопасно использовать для управления внешними устройствами без опасения вывода на них чего-то ненужного при старте.
В моем случае такой безопасный вывод – это D1 (GPIO5). Он стартует в режиме чистого ввода. В программе достаточно включить его в режим вывода и подать нужный сигнал TPL5110. TPL5110 выключается подачей положительного перепада, о чём я уже упоминал ранее.
Важно:
1. Вход “DONE” TPL5110 обязательно следует притянуть к земле резистором. Я использовал резистор номиналом 570 КОм.
2. В программе надо сначала задать низкий уровень для GPIO5 и только потом включить его в режим выхода.
При выполнении этих условий питание на ESP8266 будет включаться и выключаться как часы :)
Казалось бы – все элементарно, но поиск дал массу публикаций с просьбами помочь со странным поведением TPL5110. Полагаю, что проблемы были связаны с отсутствием притягивающего к земле резистора вывода DONE. Он высокоомный, вывод микропроцессора находятся в режиме ввода при старте, тоже высокомном, т.е. цепь выключения без подтягивающего резистора висит в воздухе и реагирует на все паразитные помехи.
Выключение системы при разряде батареи
Сначала я хотел применить для мониторинга состояния батареи контроллер от батареи Iphone 4S. Задействованный там Gas Gauge bq27541 может общаться по протоколу HDQ с микропроцессором и отдавать обширную информацию о состоянии батареи (текущее напряжение, ток, прогноз по времени заряда и разряда и т.д.) Его также можно перепрограммировать для работы с LiFePo4. К сожалению, перепрограммирование не удалось в полной мере, готовый набор данных для похожей батареи с сайта TI был успешно записан и параметры были скорректированы, но полноценной работы bq27541 добиться не удалось. Сказался недостаток знаний по этой проблеме. Эту идею пришлось оставить. Замечу, что несколько моих самоделок вполне успешно используют для питания разнообразные батареи от айфонов, с выводом на экран напряжения, тока и процента заряда. Это удобно.
Неудача с использованием bq27541 привела меня к паллиативным решениям. Я решил измерять напряжение батареи при старте ESP8266 и, если напряжение недопустимо низкое – выводить на экран предупреждение о разряженной батарее (1 раз) фиксировать факт в EEPROM и в дальнейшем до заряда батареи ничего не делать и уходить в сон сразу после включения. Это решение не оптимально, кривая разряда LiFePo4 аккумулятора практически линейная и только в самом конце напряжение начинает заметно снижаться. Но учитывая огромную емкость батареи я решил, что такого решения достаточно для безопасной эксплуатации аккумулятора.
ESP8266 умеет измерять напряжение своего питания.
При экспериментальной проверке оказалось, что измеренное напряжение заметно ниже реального. Изучение документации дало ответ: «при измерении напряжения питания к цепи А0 не должно быть ничего подключено!»
На плате имеется входной делитель, соответственно нижний резистор этого делителя подключен к А0 всегда и мешает точному измерению напряжения питания.
В-принципе можно было бы ничего не делать, а просто программно скорректировать значения, выдаваемые АЦП.
Но я пошел трудным путем. Отпаял нижний резистор входного делителя.
Проверка после этого показала, что теперь показания АЦП завышены :)
Тогда я подобрал резистор, подключенный ко входу А0 до получения результатов, совпадающих с измеренным мультиметром значением.
Предположительно, инженеры Espressif Systems полагали, что входной делитель будет подключен все равно и скорректировали показания АЦП с учетом оптимального делителя. Но производящие эту конкретную плату китайские инженеры проигнорировали эту задумку и поставили резисторы входного делителя «какие были».
Изучив разрядные характеристики LiFeP04 элементов я решил, что порог отключения надо задать 2700 милливольт, а порог обратного включения в 3000 мВ. Это называется гистерезис :).
Принципиальная электрическая схема информера показана на рис.1. В разрыв провода от батареи включен предохранитель на 4А, в держателе типа ДПБ. Однажды он сработал, защитив систему от неприятностей. Причиной было короткое замыкание между плюсом и корпусом экрана ESP8266 при неверном закрывании крышки. Также им удобно включать-выключать питание при отладке.
Рис 1. Принципиальная электрическая схема Informer
При отладке информера был использован Bluetooth модуль, присоединенный к выводам TX и земля. Питание модуля осуществлялось автономно от лабораторного источника питания. Такое включение было сделано, чтобы установить соединение с модулем Bluetooth до подачи питания на ESP8266 и видеть на экране планшета всю отладочную информацию при автономном режиме информера. Фотография этой конфигурации оборудования представлена на рис. 2.
Рис 2 Отладочный режим информера
На рис 3 показан экран планшета, принимающий отладочную информацию по каналу Bluetooth.
Рис 3. Отладочная информация информера на экране планшета
На рис 4 показан информер в режиме отладки с большим красным светодиодом и модулем Bluetooth.
Рис. 4. Информер в режиме отладки с Bluetooth модулем и большим красным светодиодом.
Программное обеспечение
Код программы информера основан на программе GxEPD_WiFi_Example написанной Jean-Marc Zingg.
Код моей программы
тут.
Алгоритм программы – соединится с сервером, забрать свежий битмап файл, на сервер отправить диагностический файл. В файле содержится напряжение батареи, а также служебная информация, такая как название исходного файла, время и дата его компиляции, серийный номер чипа, версия Core, текущая частота процессора, объем свободной памяти и HEAP.
Я решил, что оптимально будет готовить файл для отображения на погодном информере на сервере. Сервер – это машина на безвентилярной плате, обслуживающая всю домашнюю автоматизацию под управлением Windows.
На сервере работает IIS. Он обслуживает запросы погодного информера, выдавая заранее приготовленный графический файл и принимая данные от информера.
Сделать запрос к яндекс-погоде, разобрать полученный JSON и сформировать битмап файл существенно проще на такой машине, чем на esp8266. Для подготовки битмап файлов можно использовать любые шрифты, графические заготовки и т.п. Немаловажно также отметить полное отсутствие проблем с кириллицей.
Программа обращения к погодному API Яндекса и формирования битмапов написана на питоне. Текст программы
тут.
Готовится два файла – один с погодной информацией, второй с предупреждением о низком напряжении батареи. Информер запрашивает один из них в зависимости от текущего состояния при старте. Если напряжение батареи в норме, то запрашивается файл с погодной информацией (рис. 5), если нет – то с предупреждением (рис. 6).
Рис 5. Изображение при нормальном напряжении батареи
Рис 6. Изображение при низком напряжении батареи
Оба изображения повернуты на -90 градусов, чтобы соответствовать физической ориентации дисплея.
Готовые битмапы копируются в директорию IIS
Принятый от погодного информера файл анализируется еще одной программой на питоне. Программа
тут . Программа обрабатывает полученный файл, дописывает лог-файл и готовит командные файлы для коррекции времени последующего запуска программ до и после общения информера с IIS.
Для синхронизации подготовки битмап файлов используется следующий алгоритм:
Дата и время принятого из погодного информера файла используются для определения даты и времени следующего запуска программ подготовки картинок и анализа принятого файла.
Я измерил интервалы обращения погодного информера к серверу, завел данные в эксель и определил мат ожидание и разброс. На основе этих данных я задал интервал времени для следующего запуска программы подготовки картинок в 67 минут, а анализа принятого файла в 72 минуты. Получилась своеобразная вилка, которая автоматически подстраивается под активность погодного информера. Т.е. информация на экране информера запаздывает не более чем на один интервал включения.
Для запуска питон-программ используется стандартный «Планировщик заданий». Из особенностей: задачу, созданную пользователем вручную, невозможно изменить командным файлом. Не хватает каких-то прав.
Потратил пару дней на поиски решения, не нашел.
Но если создать задание из командного файла, то это задание можно редактировать в дальнейшем тоже из командного файла.
Есть тонкость: требуется ввод пароля при работе командного файла. Это легко сделать, направив файлик с паролем на вход команды вот так:
schtasks /change /tn !epaper2 /st 21:20:15 /sd 08.03.2021 < enter.txt
файл enter.txt содержит пароль и перевод строки (нажатие клавиши Enter)
Прием очень старый, но вполне рабочий.
Результаты:
Рис 7. Информер на стене в прихожей.
Информер успешно работает 3 месяца, текущее напряжение батареи:
Рис 8. Напряжение батареи информера в милливольтах.
И по расчетам, заряда батареи должно хватить на 478 дней.
А то выйдешь с зонтиком, но без ключей (мобилы и т.п.).
сам пилю часы на активных светодиодных матрицах — MatrixClock.
пы.сы. у вас линки на Github битые.
Я просто использовал уже работающее решение.
Не вижу смысла спрашивать погоду в Москве на сайте хрен знает где размещенном.
Ссылку поправил. Там была лишняя закрывающая скобка.
Про часы почитал, я так понимаю — исходники Вы не выкладываете?
Позже открою только сам драйвер MAX7219. А уж на его основе можно свои часы написать.
Вот тут мои часы и с полными исходниками.
www.youtube.com/watch?v=5HrUQOGKziY&t=183s
Тоже потихоньку пилю когда время появляется.
Для микроконтроллеров в большинстве своем используется опенсорс. enjoyneering, по сути, вы чужие наработки украли и выдаете за свое. Не на асме же вы все написали.
А где ваши исходники посмотреть?
Вы почему-то обращаете внимание на тех, кто взял и не вернул. Да и хрен с ними, если на 100 этих людей найдется 1, который поможет — это уже плюс. Зачем им уподобляться?
ЗЫ Я и не говорил, что я внес какой-либо серьезный вклад. Что-то взял, сколько смог — отдал. Зато мой код невозможно украсть :)
ЗЫЫ По моему опыту в промавтоматике обычно те, кто не открывает код и говорит о своих ноухау или воровстве конкурентов обычно в своем коде скрывают бекдор, откровенный говнокод или хотят потом иметь заказчика на техподдержке.
Цикл не использую, вместо него Ticker. Зачем гонять биты без надобности (у MAX7219 есть sram. Один раз записал и он запомнил. Когда надо поменял. У меня щас в loop всего 4 строчки).
Кстати, часто делаю на ногодрыге, 5 матриц тянет на ура даже AVR 16 МГц — при 30 Гц обновлении занимает порядка 1% процессорного времени.
Согласитесь не укаждого дома 24/7 крутится сервер на IIS с питоном. А вот роутер с wifi есть у всех. Пока ваш DIY больше похож на адский велосипед из костылей.
Где, говорите, датчики у OpenWeatherMap?
Сервер на ИИС нужен для множества других задач домашней автоматизации. Если бы его не было — я пошел бы другим путем. Но сервер есть и работает 24*7 лет 10+.
Решать задачи с распарсиванием JSON, кириллицей, дальнейшими хотелками на ESP? Резать рубероид маникюрными ножницами? Нет, увольте :)
Возможно будет V2.0. РОдственники хотят такую же штуку :)))
Пв.сы. Любой желающий может подключить свою погодную станцию к OpenWeatherMap (по типу как в народном мониторинге). Сколько таких станций и как потом OpenWeatherMap считает погоду, отбрасывает кривые данные по Москве затрудняюсь сказать.
Шрифты положить можно. Но ИДЕ Ардуино не понимает кириллицы в лоб. Можно обойти — но зачем? Я решал такие задачи в других проектах, не понравилось. Гимор.
С моей точки зрения эта задача хотя и может быть реализована на ESP8266, но выходит за область оптимальных задач для этой платформы.
Не говоря уже об изменениях :)))
Причем здесь IDE и кирилица? Делаете массив из точек (например каждые 8 пикселе/бит это одна буква. Русской «А» соответствует число 192. Пишетр траслятор который на входе смотрит 192 а на выходе отправляет на экран 8 пикселей соответствующих этой букве в массиве шрифта.
Кому-то не нравится творить и они повторяют готовое или покупают.
Каждому — свое.
Если же я что-то делаю не то — администрация мне укажет и я учту.
Лол. Вы хотели сказать за область ваших знаний? Я правильно понял?
Где в моих словах есть что-то про область моих знаний?
Я говорил о трудоемкости реализации задачи на платформе. У каждой платформы есть диапазон сложности задач, которые оптимально решать на этой платформе. Соответственно, есть и пограничные задачи, решение которых на платформе возможно, но требует повышенных трудозатрат по сравнению с другой платформой.
Я не слишком сложно для Вас говорю? Вы же вроде инженер? Должны понимать базовые вещи?
Как по мне, автономный дисплей, выводящий просто картинку — годное законченное решение, которое может без проблем выводить и кириллицу и любые другие иероглифы.
Если последняя строчка выглядит непонятно, это Subject самого свежего письма в почте, сокращённый вырезанием посередине. Уже не помню про что там было, и куда Welcome.)
Делалось только под себя, поэтому конечно же в курсе что значит каждая буковка, конкретно CWR — выводилось если три определённых IP-адреса в сети и интернете отвечают на пинг. Если один не отвечал, вместо его буквы был бы прочерк. Ну это так, в качестве идей, что ещё можно добавить на такой экранчик. Впрочем с тех пор переделал, и наличие подобных «проблем» теперь выводится внизу, в строке перед почтовым текстом. А наверх в освободившееся место добавил текущее время.
Обратно не надо было. Только смотреть отладку.
ссылка
Подгонял я резистор R3 (см. принципиальную схему выше).
Подгонка заключалась в подборе такого резистора, чтобы показания мультиметра и данные АЦП, измеряющего напряжение питания, совпадали. Без этого резистора АЦП выдает откровенно завышенные данные. Например, мультиметр показывает 3.3 вольта, а с АЦП приходят 3,5 вольта.
Строго говоря — можно этим не парится вовсе. Можно просто присоединить вывод А0 к питанию — и все будет ОК. Но мне было интересно использовать команду «измерить питание».
Там в разделе про ацп хитрое измерение питания, нужно оставить вход АЦП висящим как я понял и регистр нужный заинитить единичками.
ADC_MODE(ADC_VCC); //включить измерение напряжения питания
а в теле программы использовать
upit = ESP.getVcc();
В переменной upit будет напряжение питания в милливольтах.
И да, вход А0 должен висеть в воздухе.
Дальше я обнаружил, что показания с АЦП завышены.
Т.е. внутри esp8266 есть еще один делитель, который напряжение питания приводит в диапазон, допустимый для АЦП.
Тогда я подобрал внешний резистор чтобы показания АЦП и вольтметра совпадали. Т.е. подкорректировал резистор нижнего плеча в делителе внутри esp8266. Мой внешний резистор и внутренний резистор в делителе включены параллельно.
Видимо ключ для подключения внутреннего делителя есть, а ключа для отключения внешних цепей нет, поэтому и возникают эти проблемы.
Вы посмотрите — возможно ваш экран поддерживает частичное обновление. Это существенно быстрее, чем обновлять весь экран.
Если Вы хотите раз в минуту обновлять экран и время обновления — 17 секунд, то ваше устройство кушает много (скважность включения — около 3) и батарейного питания надолго не хватит.
Следовательно, придется питать устройство от сети. И тогда встает вопрос — а зачем e-paper?
Т.е. тут надо решить вопрос: что Вы хотите? Или быстро и питание от сети и не обязательно e-paper или автономное устройство с e-paper и тогда обновление — сравнительно редкое. ну никак не раз в минуту.