![]() |
![]() |
|||||||||||||||
Анимированная индикация на stm32 + ili9341
Автор: gcc, artem.lab@gmail.com Здравствуйте, коты! Сперва мне хотелось сделать необычные часы на основе TFT на контроллере ILI9341. Часы так и не доделались, но вылилось из них нечто гораздо большее, о чём и пойдёт речь ниже. А что может быть необычного в простых часах? Правильно - отображение! В сети очень много часов на самых разных экранах, с имитацией часовой стрелки и прочими фичами. Чего действительно мало - это анимации. Вот и решил я остановиться на этом - сделать анимирование смены значений на экране. Итак, с конечной целью теперь есть определённость, а как насчёт конкретики, что и как анимировать? Загружать изображения и делать нечто подобное GIF? У stm32f103 нет столько FLASH-памяти, чтобы это переварить, плюс хотелось что-то более гибкое и сколько-нибудь настраиваемое. Что если разбить весь экран или его область на условные блоки N*M пикселей, которые двигать при переходе от одного отображения к другому!? Это позволит оперировать битмапами, которые уже можно сохранять во FLASH, а сами переходы можно сделать какими угодна и относительно неплохо их параметризировать! Решено! От теории к практике. Благо на тот момент у меня уже была реализация необходимых библиотек для вывода на выбранный экран и простенькая библиотека графического интерфейса, посему было решено за единицу анимации выбрать "потомка" виджета - встречайте gui_anim_bitmap! typedef struct _Gui_Anim_Bitmap gui_anim_bitmap_t; Подробнее с интерфейсом виджета можно ознакомиться в хедере (Doxygen - комментарии). Остановимся на самом важном. gui_anim_bitmap_item_t - тип (структура) анимируемого элемента, в этой структуре хранятся данные и стостояние анимации каждого анимируемого пиксела битмапа. Анимируемому виджету требуется массив этих элементов по количеству анимируемых пикселей в битмапе (если разница между битмапами небольшая - достаточно небольшого количества элементов). gui_anim_bitmap_effect_t - тип (перечисление) анимации:
Например, функция инициализации виджета может выглядеть так: /** Чтобы запустить анимацию, где-нибудь в главном цикле анимируем наши часики: if(system_counter_diff(&anim_counter) >= system_counter_ticks_per_sec() / 35){ 35 - экспериментально подобранное оптимальное для данного случая число итераций анимации в секунду. От программы к железу. Схема подключения контроллера к экрану тривиальна, для взаимодействия с экраном, кроме SPI, используем такие пины: PB10 - RST, PB11 - CE, PB12 - DC. А теперь собираем всё и заливаем прошивку! Все три типа анимации последовательно переключаются, но чтобы успевать за одну секунду - пришлось анимировать с малой задержкой между кадрами, из-за чего анимации перемещения и гравитации не до конца раскрывают себя, но всё равно неплохо заметны. Итог. Часы, конечно, пока не доделаны, хотя и интерфейс часов имеет все необходимые для работы интерфейсы (установка времени, даты, двух температур и прочее. См. прикреплённые исходники), но это и не столь важно, так как в результате их реализации получился неплохой инструмент анимирования переходов из одного битмапа в другой, которым, возможно, так же заинтересуются читающие эту статью. Спасибо за внимание! GitHub с библиотеками, использующимися в проекте, здесь. Исходники прикреплены ниже (arm-none-eabi-gcc).
Файлы: Все вопросы в Форум.
|
|
|||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |