Погодный информер на цветном 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 имеет особенности при подаче питания. Особенность его в том, что выводы микросхемы при старте системы могут на какое-то время становится активными выходами и что-то выводить. На одних ногах идет отладочная информация в режиме UART на скорости 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 дней.