Алексей Надёжин (ammo1) wrote,
Для того, чтобы сделать экран-информер (https://ammo1.livejournal.com/1114988.html) я заказал на Aliexpress плату Arduino Wi-Fi за $5 и 3.95″ экран за $12, который просто ставится вторым этажом на плату Arduino и не требует соединения проводами.
Продавец Ардуины написал, что на ней есть dip-переключатели, выбирающие режимы работы двух процессоров (ATmega328 и ESP8266), но описать назначение переключателей забыл.
Продавец экрана предлагал скачать с LCDWiki комплект библиотек и программ для этого экрана. Скачал, запустил, и начал биться сначала чтобы просто текст выводился не в вертикальном положении экрана, а в горизонтальном. Потом пытался разобраться, как сделать свой шрифт. В комплекте была программа PCtoLCD200 с полностью китайским интерфейсом. Наугад разобрался, как ей делать шрифт, вот только что с ним делать дальше неизвестно. Никаких инструкций нет. Точнее, есть множество инструкций, но все они не про то. А если выводить крупный текст шрифтом по умолчанию, получается вот такой ужас.
В попытках найти инструкцию, на сайте iarduino.ru нашлась информация о библиотеке UTFT, поддерживающей множество экранов, в том числе этот. На сайте автора бибилотеки Rinky-Dink Electronics есть и сама библиотека и онлайн-инструмент для создания любых шрифтов.
А дальше всё просто: в любом редакторе создаём картинку со всеми символами шрифта (есть два типа шрифтов — алфавитный с 95 символами и цифровой с 10 символами).
Дальше с помощью онлайн-инструмента делаем из этой картинки шрифт. Получается файл с расширением «.c», который нужно положить в папку библиотеки UTFT.
И наконец подключаем свой шрифт и пишем им всё, что угодно.
Главное теперь, чтобы эти большие шрифты не заняли всю память Arduino и хватило места на всё остальное. 🙂
P.S. Не понимаю, как люди делают на Arduino хоть что-то нестандартное. Как только пытаешься сделать хоть что-то, не как все, тут же выясняется, что всё нужно искать наугад и методом тыка.
© 2020, Алексей Надёжин
Второй мой проект — lamptest.ru. Я тестирую светодиодные лампы и помогаю разобраться, какие из них хорошие, а какие не очень.
Tags: arduino
Subscribe
Во вчерашнем вполне безобидном посте о рынке в Хургаде мне пришлось удалить более половины комментариев. В связи с этим объявляю простые правила…
Добавил к названию блога своё имя и фамилию и на это есть две причины. Мой блог в ЖЖ и каналы на Дзене и Youtube теперь называются «Алексей…
Теперь большинство моих публикаций сначала будут выходить на платформе технических блогов iXBT Live, а позже или на следующий день в ЖЖ, Дзене,…
Расскажу, что у меня происходит и почему я снова начал делать публикации в блоге. Когда начался весь тот ужас, который продолжает происходить…
Сегодня у меня день рождения и по многолетней традиции в этот день я запускаю небольшой новый проект. Группа @AmmoChat в Телеграме существует…
Вчера я получил несколько обвинений в том, что не пометил рекламу. Давайте обсудим. Я написал пост об акции по кредитной карте Tinkoff (…
Ровно одиннадцать лет назад произошло событие, радикально изменившее мою жизнь. 13 марта 2010 года я разместил в блоге рассказ о фестивале и начал…
В последнее время у меня часто не остаётся времени и сил для написания нового поста каждый день. И тогда я повторяю публикации, которые уже выходили…
Сегодня аудитория моего блога в LiveJournal достигла 30 тысяч человек. Точнее, сейчас уже 30007. Это число складывается из 22523 друзей и 7484…
Photo
Hint http://pics.livejournal.com/igrick/pic/000r1edq
Во вчерашнем вполне безобидном посте о рынке в Хургаде мне пришлось удалить более половины комментариев. В связи с этим объявляю простые правила…
Добавил к названию блога своё имя и фамилию и на это есть две причины. Мой блог в ЖЖ и каналы на Дзене и Youtube теперь называются «Алексей…
Теперь большинство моих публикаций сначала будут выходить на платформе технических блогов iXBT Live, а позже или на следующий день в ЖЖ, Дзене,…
Расскажу, что у меня происходит и почему я снова начал делать публикации в блоге. Когда начался весь тот ужас, который продолжает происходить…
Сегодня у меня день рождения и по многолетней традиции в этот день я запускаю небольшой новый проект. Группа @AmmoChat в Телеграме существует…
Вчера я получил несколько обвинений в том, что не пометил рекламу. Давайте обсудим. Я написал пост об акции по кредитной карте Tinkoff (…
Ровно одиннадцать лет назад произошло событие, радикально изменившее мою жизнь. 13 марта 2010 года я разместил в блоге рассказ о фестивале и начал…
В последнее время у меня часто не остаётся времени и сил для написания нового поста каждый день. И тогда я повторяю публикации, которые уже выходили…
Сегодня аудитория моего блога в LiveJournal достигла 30 тысяч человек. Точнее, сейчас уже 30007. Это число складывается из 22523 друзей и 7484…
Скажете, это же все электрические приборы? Бесспорно. Но еще у них есть дисплей. Да, холодильники чаще могут обходиться без дисплея, чем смартфоны, но это неточно. В этом вопросе время на стороне холодильников.
В огромном числе современных электронных устройств, как в узкоспециализированных приборах, так и в массовых гаджетах, применяются средства отображения информации, среди которых растровые графические дисплеи занимают доминирующее место. Дисплеи повышают на порядок (часто на несколько) информативность и способствуют созданию более лаконичного, не перегруженного механическими органами управления, корпуса устройства. Также графические дисплеи дают разработчику свободу в создании пользовательского интерфейса: от простого с несколькими строками текста до навороченного с таким количеством текстовой и графической информации, на какое только способна фантазия разработчика.
Монохромная анимацияНапример
монохромная анимацияОднако, графический интерфейс пользователя практически никогда не может быть реализован только графическими примитивами — точками, линиями, геометрическими фигурами — без использования текста. Текст точно и однозначно «рассказывает» человеку о параметрах системы, ее настройках, прошлом и текущем состояниях.
Сегодня широкое распространение получила пользовательская и специальная электронная техника, значительная часть которой построена на базе микроконтроллеров. Микроконтроллер представляет собой вычислительную платформу, которая может быть запрограммирована почти неограниченным количеством алгоритмов, реализованных на разных языках программирования. Правда, на реализацию накладывают свои ограничения небольшой размер памяти программ (в среднем от единиц килобайт до единиц мегабайт) и ещё меньший размер оперативной памяти, обычно на порядок. А вот драйверы дисплеев, графические библиотеки и сам пользовательский графический интерфейс — отнюдь не компактные алгоритмы. Именно поэтому Вы вряд ли отыщете графические библиотеки для систем на микроконтроллерах, которые бы использовали «взрослые» векторные шрифты для вывода текста. Конечно, есть и такие микроконтроллеры, которые могут дать жару многим серьезным микропроцессорам прошлых лет, но это уже отдельная «весовая категория».
Обычно для решения задачи вывода текста в памяти программ создаётся специальный массив данных, так называемая таблица знакогенератора. Не пугайтесь, что он специальный, — все очень просто. В массиве-таблице по сути хранятся растровые изображения всех необходимых приложению символов. Функция графической библиотеки, выводящая текстовые строки, по очереди считывает из таблицы изображение каждого символа и «рисует» его в нужной позиции на дисплее. Все! Идея проста, как столб.
Рассмотрим пример такой таблицы. Предположим, что нам требуется изображение символа шириной 6 и высотой 8 пикселей. Причем, вертикальный ряд пикселей — столбец высотой 8 пикселей — будем кодировать ровно одним байтом. Самый первый байт будет кодировать самый левый столбец. Самый младший бит будет кодировать самый верхний пиксель столбца. Вот пример части такой таблицы:
0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 33 <!> ... 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, // Символ 65 <A> 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, // Символ 66 <B> 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // Символ 67 <C>
А вот та же часть в двоичной записи (посмотрите внимательно на биты — каждый из них кодирует один пиксель изображения):
0b01011111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, // Символ 33 <!> ... 0b01111110, 0b00001001, 0b00001001, 0b00001001, 0b01111110, 0b00000000, // Символ 65 <A> 0b01111111, 0b01001001, 0b01001001, 0b01001001, 0b00110110, 0b00000000, // Символ 66 <B> 0b00111110, 0b01000001, 0b01000001, 0b01000001, 0b00100010, 0b00000000, // Символ 67 <C>
И, конечно же, посмотрим, как эти символы выводятся на дисплее (прямоугольники для лучшего представления знакомест символов):
Такой подход в хранении шрифта имеет свои преимущества и недостатки.
К преимуществам можно отнести небольшой размер таблицы знакогенератора в сравнении с размером файлов стандартных форматов шрифтов для «больших» систем, а также простоту программной реализации графических библиотек, основанных на этом подходе. И первое, и второе чрезвычайно важны в условиях жесткого дефицита памяти и вычислительных возможностей микроконтроллеров.
К недостаткам следует отнести проблемы с масштабированием, что является прямым следствием растровой природы такого шрифта. Приемлемый по качеству результат получается только, если увеличивать размер символов в кратное количество раз, например, в два, три или четыре раза. В таком случае нет искажений изображений символов, но чем больше кратность увеличения, тем более заметна «растровость» символов. Если в разрабатываемой системе требуется иметь несколько разных шрифтов и масштабирование одного не решает задачу удовлетворительно, тогда используют несколько шрифтов — таблиц знакогенератора.
В своё время мне пришлось разрабатывать программное обеспечение для устройства с графическим дисплеем RDX0120 на контроллере UC1601s. Использовался микроконтроллер Microchip PIC18. Тогда была найдена только одна работающая реализация драйвера, которая была жутко медленной и использовала моноширинный шрифт, внешним видом которого можно разве что отпугнуть будущего пользователя.
И вот, не впечатлившись результатом, была изучена документация на контроллер дисплея и разработана довольно быстрая библиотека. Шрифт, естественно, было решено сделать заново. Хотелось также, чтобы шрифт был не только моноширинным, но и пропорциональным, то есть чтобы символы в ширину занимали ровно столько места, сколько им требуется, с равным межсимвольным расстоянием.
Тут-то и понадобилось приложение, умеющее создать ту самую таблицу знакогенератора. Разработчики, которые хоть раз сталкивались с подобной проблемой, сразу же скажут: «Задача известная, решение тоже — утилита от MikroElektronika для создания именно таких шрифтов, и код генерирует аж на трех языках». Действительно, есть такая утилита. Я тоже пробовал ее использовать. Впечатления двоякие. Вроде бы все работает, и в то же время не хватает удобства и гибкости, сама таблица знакогенератора генерируется только по одному единственному алгоритму, который, очевидно, используется в графических библиотеках от той же MikroElektronika.
Народная мудрость гласит: «Если хочешь сделать что-то хорошо, сделай это сам». После изучения утилиты от MikroElektronika вдоль и впоперек пришло понимание, что так жить дальше нельзя. Тогда было решено начать собственный проект приложения, которое смогло бы удовлетворить самого требовательного разработчика. Хотелось видеть удобный редактор символов, предварительный просмотр образцов текста, наглядный импорт системных шрифтов, компактный формат хранения шрифтов, настраиваемый генератор кода и, конечно же, гибкость внешнего вида и функций приложения.
Как, наверное, большинство начинающих разработчиков, я был величайшим оптимистом и оценил время разработки в несколько месяцев. Как же я ошибался! Нет, действительно, за несколько месяцев был сделан рабочий прототип, но в таком виде его даже друзьям показывать было стыдно. Начался долгий процесс доведения до ума, в ходе которого приложение много раз изменилось внешне, обросло многими полезными и удобными инструментами. К сожалению, проект всегда был хоббийным, поэтому разработка была сильно неравномерной и разорванной во времени. Что в итоге сказалось на сроках выпуска готового приложения. Ведь старт проекту был дан где-то в конце 2015, а сейчас уже 2021.
«Вот он! Вот он — этот коварный тип…» (с).
Это приложение, которое умеет создавать растровые шрифты с нуля или на основе установленных системных. Имеет широкие возможности редактирования как отдельных символов, так и всего шрифта. Есть удобная навигация по символам, предпросмотр образцов текста, выбор кодировки и всяческие полезные настройки. И, конечно же, генерирует код на Си — ту самую таблицу знакогенератора. Причём этот генератор также имеет множество настроек, что позволяет интегрировать созданный шрифт в разные программные решения.
Полагаю, что дальше расписывать работу приложения будет нецелесообразно — получится длинное руководство пользователя. Которое, кстати, присутствует в репозитории проекта.
Пример реализации очень мелкого шрифта — меньше просто физически некуда.
Проект приложения имеет открытые исходные коды и является свободным программным обеспечением.
Сейчас приложение выпущено только под Windows. Может быть, в неопределённом будущем, будут выпуски и под другие ОС.
На сегодня в приложении доступно две локализации интерфейса — русская и английская. Если в сообществе появятся желающие помочь перевести приложение и справочные материалы на свой родной язык, добро пожаловать в репозиторий проекта. Там Вы найдёте всю необходимую информацию для перевода.
И, естественно, автор ждёт Ваших отзывов и комментариев — от похвалы до жёсткой критики. Всем удобной работы и хорошего настроения!
Обновление 1. Чтобы не превращать статью в сборник картинок, добавил ссылки на разделы справки, где есть иллюстрирующие скриншоты.
Мне нужно уменьшить объем памяти, требуемой библиотекой KeDei TFT, используемой с 3,5-дюймовым сенсорным TFT-дисплеем Osoyoo для Arduino Uno и ATmega 2560. Когда я пытаюсь написать простое приложение для Arduino, использующее TFT-дисплей с библиотекой KeDei, большая часть доступной памяти на Arduino занята самой библиотекой.
К сожалению, я обнаружил, что, хотя ATmega 2560 имеет необходимый объем памяти, библиотека KeDei TFT не обеспечивает правильных сенсорных координат, когда TFT-дисплей используется с этим устройством, поэтому ATmega 2560 невозможна, если не приедет поддержка клиентов Osoyoo. хоть и с раствором.
Исследуя исходный код библиотеки, я обнаружил в файле KeDei_font.cpp таблицу растровых шрифтов, используемую для генерации отображаемых символов. Эта таблица растровых шрифтов представляет собой массив unsigned char font16_B[96][16]
и, по-видимому, является основным потребителем памяти. Этот массив содержит растровые шрифты для символов ASCII от пробела 0x20
до тильды 0x7e
.
Одна вещь, которую я сделал, это уменьшил количество символов, удалив строчные буквы и преобразовав строчные буквы в прописные. В результате получается таблица 9.0007 const unsigned char font16_B[59][16]
, что чуть больше половины размера исходной таблицы.При таком подходе я также исключаю несколько других знаков пунктуации, но пока я отображаю только буквенно-цифровые символы и пробелы, это будет работать.
#если определено (SMALLER_FONT_TABLE) статическая константа без знака char font16_B[59][16] = { #еще статическая константа без знака char font16_B[95][16] = { #endif {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*", ",0*/ {0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x38,0x38,0x00,0x00},/*"!",1*/ {0x00,0xD8,0xFC,0x6C,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ {0x00,0x00,0x00,0x6C,0x6C,0x6C,0xFF,0x36,0x36,0x36,0xFF,0x36,0x36,0x36,0x00,0x00},/*"#",3*/ {0x00,0x00,0x18,0x3C,0x7E,0x7E,0x1E,0x1C,0x38,0x78,0x78,0x7E,0x7E,0x3C,0x18,0x18},/*"$",4*/ {0x00,0x00,0x00,0x66,0x6F,0x3F,0x3F,0x3F,0x7E,0xF8,0xFC,0xFC,0xFC,0x66,0x00,0x00},/*"%",5*/ {0x00,0x00,0x00,0x1C,0x36,0x36,0x36,0x1E,0xFE,0x6F,0x7B,0x33,0xB3,0xFE,0x00,0x00},/*"&",6*/ {0x00,0x0E,0x0E,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ {0x00,0xC0,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x30,0x30,0x60,0xC0,0x00},/*"(",8*/ {0x00,0x06,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x06,0x00},/*")",9*/ {0x00,0x00,0x00,0x00,0x18,0x18,0xFF,0x3C,0x3C,0xFF,0x18,0x18,0x00,0x00,0x00,0x00},/*"*",10*/ {0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18,0x00,0x00,0x00},/*"+",11*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0C,0x07},/*",",12*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00},/*",",14*/ {0x00,0x00,0x80,0xC0,0xC0,0x60,0x60,0x30,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x00},/*"/",15*/ {0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00},/*"0",16*/ {0x00,0x00,0x00,0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00},/*"1",17*/ {0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x60,0x60,0x30,0x18,0x0C,0xC6,0xFE,0x00,0x00},/*"2",18*/ {0x00,0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x60,0xC0,0xC0,0xC6,0x66,0x3C,0x00,0x00},/*"3",19*/ {0x00,0x00,0x00,0x60,0x70,0x78,0x6C,0x6C,0x66,0x66,0xFE,0x60,0x60,0xF8,0x00,0x00},/*"4",20*/ {0x00,0x00,0x00,0xFE,0x06,0x06,0x06,0x3E,0x6E,0xC0,0xC0,0xC6,0x66,0x3C,0x00,0x00},/*"5",21*/ {0x00,0x00,0x00,0x78,0x6C,0x06,0x06,0x3E,0x6E,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00},/*"6",22*/ {0x00,0x00,0x00,0xFE,0x66,0x66,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00},/*"7",23*/ {0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x6C,0x38,0x6C,0xC6,0xC6,0xC6,0x7C,0x00,0x00},/*"8",24*/ {0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xEC,0xF8,0xC0,0xC0,0x6C,0x3C,0x00,0x00},/*"9",25*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00},/*":",26*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x0C},/*";",27*/ {0x00,0x00,0x00,0xC0,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0xC0,0x00,0x00},/*"<",28*/ {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ {0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x0C,0x06,0x00,0x00},/*">",30*/ {0x00,0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xC0,0x60,0x30,0x30,0x00,0x38,0x38,0x00,0x00},/*"?",31*/ {0x00,0x00,0x00,0x3C,0x66,0xFE,0xFF,0xFF,0xFF,0xFF,0x7F,0xC6,0x66,0x3C,0x00,0x00},/*"@",32*/ {0x00,0x00,0x00,0x18,0x18,0x38,0x3C,0x3C,0x6C,0x7C,0x66,0xC6,0xC6,0xEF,0x00,0x00},/*"A",33*/ {0x00,0x00,0x00,0x3F,0x66,0x66,0x66,0x3E,0x66,0xC6,0xC6,0xC6,0x66,0x3F,0x00,0x00},/*"B",34*/ {0x00,0x00,0x00,0xFC,0xC6,0xC6,0x03,0x03,0x03,0x03,0x03,0xC6,0x66,0x3C,0x00,0x00},/*"C",35*/ {0x00,0x00,0x00,0x3F,0x66,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x66,0x3F,0x00,0x00},/*"D",36*/ {0x00,0x00,0x00,0x7F,0xC6,0x36,0x36,0x3E,0x36,0x36,0x06,0xC6,0xC6,0x7F,0x00,0x00},/*"E",37*/ {0x00,0x00,0x00,0x7F,0xC6,0x36,0x36,0x3E,0x36,0x36,0x06,0x06,0x06,0x0F,0x00,0x00},/*"F",38*/ {0x00,0x00,0x00,0x7C,0x66,0x66,0x03,0x03,0x03,0xF3,0x63,0x66,0x66,0x3C,0x00,0x00},/*"G",39*/ {0x00,0x00,0x00,0xEF,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xEF,0x00,0x00},/*"H",40*/ {0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00},/*"I",41*/ {0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x33,0x1F},/*"J",42*/ {0x00,0x00,0x00,0xFF,0x66,0x36,0x1E,0x1E,0x1E,0x36,0x36,0x66,0x66,0xFF,0x00,0x00},/*"K",43*/ {0x00,0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xC6,0xFF,0x00,0x00},/*"L",44*/ {0x00,0x00,0x00,0xFF,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0xFF,0x00,0x00},/*"M",45*/ {0x00,0x00,0x00,0xE7,0xCE,0xCE,0xDE,0xDE,0xF6,0xF6,0xF6,0xE6,0xE6,0xCF,0x00,0x00},/*"N",46*/ {0x00,0x00,0x00,0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C,0x00,0x00},/*"O",47*/ {0x00,0x00,0x00,0x7F,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x06,0x0F,0x00,0x00},/*"P",48*/ {0x00,0x00,0x00,0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0xDF,0xF7,0x76,0x3C,0xE0,0x00},/*"Q",49*/ {0x00,0x00,0x00,0x7F,0xC6,0xC6,0xC6,0x7E,0x36,0x36,0x66,0x66,0xC6,0xCF,0x00,0x00},/*"R",50*/ {0x00,0x00,0x00,0xFC,0xC6,0xC6,0x06,0x0C,0x38,0x60,0xC0,0xC6,0xC6,0x7E,0x00,0x00},/*"S",51*/ {0x00,0x00,0x00,0xFF,0xDB,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00},/*"T",52*/ {0x00,0x00,0x00,0xEF,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00},/*"U",53*/ {0x00,0x00,0x00,0xEF,0xC6,0xC6,0x66,0x6C,0x6C,0x3C,0x3C,0x38,0x18,0x18,0x00,0x00},/*"V",54*/ {0x00,0x00,0x00,0xFF,0xDB,0xDB,0xDB,0xDB,0xFF,0xFF,0x7E,0x66,0x66,0x66,0x00,0x00},/*"W",55*/ {0x00,0x00,0x00,0xEF,0xC6,0x6C,0x6C,0x38,0x38,0x38,0x6C,0x6C,0xC6,0xEF,0x00,0x00},/*"X",56*/ {0x00,0x00,0x00,0xFF,0x66,0x66,0x3C,0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00},/*"Y",57*/ {0x00,0x00,0x00,0xFE,0x63,0x60,0x30,0x30,0x18,0x0C,0x0C,0xC6,0xC6,0x7F,0x00,0x00},/*"Z",58*/ #если !определено(SMALLER_FONT_TABLE) // В целях снижения требований к памяти для библиотеки TFT мы // позволяет использовать меньшую таблицу шрифтов, которая устраняет строчные буквы // а также несколько символов. См. ниже преобразование строчных букв в прописные. // Ричард Чемберс, 25.04.2021 {0x00,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0x00},/*"[",59",62*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/ {0x00,0x0E,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xF8,0xCC,0xC6,0xC6,0xFC,0x00,0x00},/*"a",65*/ {0x00,0x00,0x00,0x07,0x06,0x06,0x06,0x3E,0x6E,0xC6,0xC6,0xC6,0x6E,0x3E,0x00,0x00},/*"b",66*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xCC,0x06,0x06,0x06,0xCC,0x78,0x00,0x00},/*"c",67*/ {0x00,0x00,0x00,0xE0,0xC0,0xC0,0xC0,0xF8,0xCC,0xC6,0xC6,0xC6,0xEC,0xF8,0x00,0x00},/*"d",68*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0x06,0x06,0xC6,0x7C,0x00,0x00},/*"e",69*/ {0x00,0x00,0x00,0xF0,0x98,0x18,0x18,0xFE,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00},/*"f",70*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x66,0x66,0x3C,0x06,0x7C,0xC6,0xC6,0x7C},/*"g",71*/ {0x00,0x00,0x00,0x07,0x06,0x06,0x06,0x7E,0xCE,0xC6,0xC6,0xC6,0xC6,0xEF,0x00,0x00},/*"h",72*/ {0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x1E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00},/*"i",73*/ {0x00,0x00,0x00,0x70,0x70,0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x66,0x3E},/*"j",74*/ {0x00,0x00,0x00,0x07,0x06,0x06,0x06,0xF6,0x36,0x1E,0x3E,0x36,0x66,0xFF,0x00,0x00},/*"k",75*/ {0x00,0x00,0x00,0x1E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00},/*"l",76*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xB6,0xB6,0xB6,0xB6,0xB6,0xFF,0x00,0x00},/*"m",77*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xCE,0xC6,0xC6,0xC6,0xC6,0xEF,0x00,0x00},/*"n",78*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00},/*"o",79*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x6E,0xC6,0xC6,0xC6,0x66,0x3E,0x06,0x0F},/*"p",80*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xCC,0xC6,0xC6,0xC6,0xCC,0xF8,0xC0,0xE0},/*"q",81*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xDC,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00},/*"r",82*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xC6,0x06,0x7C,0xC0,0xC6,0x7E,0x00,0x00},/*"s",83*/ {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x18,0x70,0x00,0x00},/*"t",84*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0xC6,0xC6,0xC6,0xC6,0xE6,0xFC,0x00,0x00},/*"u",85*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0xC6,0x6C,0x6C,0x3C,0x18,0x18,0x00,0x00},/*"v",86*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xDB,0xDB,0xFF,0xFF,0x66,0x66,0x00,0x00},/*"w",87*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x6C,0x38,0x38,0x38,0x6C,0xFE,0x00,0x00},/*"x",88*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0xC6,0x6C,0x6C,0x3C,0x38,0x18,0x18,0x0F},/*"y",89*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x66,0x30,0x18,0x18,0xCC,0xFE,0x00,0x00},/*"z",90*/ {0x00,0xC0,0x60,0x60,0x60,0x60,0x60,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x00},/*"{",91*/ {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30},/*"|",92*/ {0x00,0x0E,0x18,0x18,0x18,0x18,0x18,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x0E,0x00},/*"}",93*/ {0x1C,0x76,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ #endif };
Затем в функции, которая генерирует символы и отображает их попиксельно, у меня есть следующий фрагмент кода, который преобразует символы нижнего регистра в символы верхнего регистра, если у меня включена меньшая таблица.
#если определено (SMALLER_FONT_TABLE) // Переводим символ в один из печатных // символы в нашей таблице шрифтов. То, что мы делаем, это // перевести строчные буквы в прописные // так как для того, чтобы иметь меньшую таблицу шрифтов, занимающую // меньше памяти убираем строчные буквы. // Ричард Чемберс, 25.04.2021 если (_data < ' ' || _data > 'z') вернуть; если (_data >= 'a') _data = _data - 'a' + 'A'; #endif char_i=(int)_data - ' ';
При таком подходе, когда я компилирую скетч Arduino с определенной таблицей SMALLER_FONT_TABLE, компиляция завершается со следующим предупреждением:
Sketch использует 12844 байта (39%) пространства для хранения программы. Максимум 32256 байт. Глобальные переменные используют 1556 байт (75%) динамической памяти, оставляя 492 байта для локальных переменных. Максимум 2048 байт. Недостаточно доступной памяти, могут возникнуть проблемы со стабильностью.
Что можно сделать, чтобы еще больше уменьшить объем памяти, необходимый для отображения шрифта? Есть ли другой тип растрового шрифта, который использует меньше памяти?
AlleBilderVideosShoppingMapsNewsBücher
suchoptionen
mcufriend 3. 5″ LCD, я хотел бы иметь возможность выбирать разные шрифты
9000 2 forum.arduino.cc › Использование Arduino › Дисплеи14.02.2016 · Если вы просто хотите использовать некоторые пользовательские шрифты, взгляните на текущую библиотеку Afafruit_GFX. Имейте в виду, новые возможности шрифта — это что-то вроде кошмара.0003
Добавление пользовательских шрифтов в MCUFRIEND — Дисплеи — Форум Arduino
Библиотека и шрифты MCUFriend kvb — Дисплеи — Форум Arduino
Обновление шрифта БИБЛИОТЕКИ MCUFRIEND — Дисплеи — Форум Arduino 0038
Использование шрифтов | Графическая библиотека Adafruit GFX
Learn.adafruit.com › adafruit-gfx-graphics-library
Включенные шрифты получены из проекта GNU FreeFont. Три начертания: «Serif» (напоминает Times New Roman), «Sans» (напоминает Helvetica …
Как использовать шрифты? · Issue #29 · prenticedavid/MCUFRIEND_kbv
github.com › MCUFRIEND_kbv › Issues
12.01.2018 · Я запускаю GLUE_Demo_480x320,. он работает хорошо, но я хочу использовать FreeDefaultFonts.h. Я комментирую #undef GFXFONT_H //прокомментируйте эту строку, чтобы включить …
MCUFRIEND_kbv Библиотека для Uno 2.4, 2.8, 3.5, 3.6, 3,95 дюйма …
github.com › prenticedavid › MCUFRIEND_kbv 9 0003
# Библиотека MCUFRIEND_kbv для Uno 2.4, 2.8, 3.5, 3.6, 3.95-дюймовые щиты mcufriend. Менеджер библиотек Arduino должен найти и установить библиотеку MCUFRIEND_kbv.
Библиотека TFT-дисплеев и шрифтов Arduino: 11 шагов — инструкции
www.instructables.com › Схемы › Arduino
Эта библиотека используется вместе с библиотекой Adafruit_GFX. Попробовав несколько примеров, я был немного разочарован тем, что были доступны только масштабированные блочные шрифты.0003
Шрифты UTFT. Инструкции. Эти шрифты предназначены только для моей библиотеки UTFT. Они не будут работать ни с одной из моих других библиотек дисплеев. Нажмите на изображение, чтобы увидеть …
Как использовать драйвер ILI9486 3,5-дюймовый сенсорный TFT-экран с Arduino
www. engineersgarage.com › arduino-ili9486-driver… Шилд на Ардуино УНО. 3,5-дюймовый ЖК-дисплей TFT можно использовать для ряда приложений, таких как –. Для отображения текста и шрифтов.
MCUFRIEND_kbv — Список библиотек Arduino
www.arduinolibraries.info › библиотеки › mcufriend_k…
Библиотека TFT для экранов mcufriend UNO Shield 2,4, 2,8, 3,5, 3,6, 3,95 дюйма. Должен иметь вывод /RD, чтобы его можно было прочитать. Загрузки. Имя файла, дата выпуска, размер файла …
OpenSmart 2.2inch ILI9225 Shield — Hackster.io
www.hackster.io › patrick-fitzgerald2
05.01.2023 . … by OpenSmart #include
Шрифты Mcufriend — tagwerkerding.de
tagwerkerding.de › страницы › шрифты mcufriend
Шрифты Mcufriend — pgnn Adafruit Gfx Graphics Library — Бесплатная загрузка в виде файла PDF (Растровые шрифты Контент сообщества доступен по лицензии CC-BY-SA если .