Нужна помощь с библиотекой U8GLIB

У меня есть проект, в котором используется oled-дисплей 128x64. Мне приходится использовать U8GLIB, поскольку доступные дисплеи меняются с SSD1306 на SSH1106 в зависимости от того, когда вы его покупаете, и какая библиотека охватывает оба дисплея. Я не хочу, чтобы программа для дисплея съедала память ардуино, поэтому я использую u8glib вместо u8g2! для этого проекта мне нужно отображать числа от 0 до 9, десятичную точку, омегу (символ Ома) и метрические префиксы, такие как μ, m, k, M и т. д. Сначала я попытался создать растровый шрифт (.bdf) и преобразовать его в файл C, потому что именно на это намекали в нескольких сообщениях. Учебников не было, и после возни с разными форматами и попыток добавить шрифт в библиотеку я просто сдался, потому что не мог в этом разобраться. Вместо этого я решил использовать этот сайт, который генерирует растровые изображения из файлов TTF: https://littlevgl.com/ttf-font-to-c-array

Теперь я могу использовать эти растровые изображения и иметь несколько символов, которые используют очень мало памяти (около 20% по сравнению с более чем 70% при использовании полного символьного шрифта в u8g2!), но это делает ситуацию очень неудобной, поскольку мне приходится переводить каждое число я разбиваю на отдельные цифры, а затем в растровое изображение! также я могу использовать только размеры шрифтов, высота которых кратна 8, потому что по какой-то странной причине эта библиотека ожидает ширину в байтах и высоту в пикселях!

cnt: количество байтов растрового изображения по горизонтали. Ширина растрового изображения — cnt*8.

так что я могу использовать шрифты, например, размером 48, но не 50 или 52, которые больше подходят для моего приложения! Я не уверен, сталкивалась ли кто-нибудь еще с этой проблемой, но должен быть способ отображать нужные символы, не разрушая все пространство памяти, как это делает u8g2! Только дойти до этого момента у меня заняло 2 дня (слева 0,96″ SSD1306, а справа 1,3″ SSH1106):

Пожалуйста, помогите, если у вас есть идеи, как поступить с этой библиотекой, поскольку сейчас она сводит меня с ума!

, 👍2


1 ответ


1

Хотя это может и не совсем ответить на ваш вопрос, может быть некоторая информация о u8g2lib, которую вы не видели. Исходный код библиотеки доступен здесь: u8g2lib

В этом репозитории находится документация по часто задаваемым вопросам, которая включает в себя такие драгоценные камни, как:

р>

Вопрос: U8g2 требует много памяти. Как это уменьшить? – Посетите https://github.com/olikraus/u8g2/wiki/u8g2optimization. - Если возможно, отключите функции U8g2 (см. u8g2.h). - Ограничьте размер шрифта. Если возможно, избегайте шрифтов «f», вместо этого используйте шрифты «r» или «n». - Если интерфейс I2C не требуется, раскомментируйте #define U8X8_HAVE_HW_I2C в U8x8lib.h (Справочная информация: из-за проблемы в Wire.h, библиотека I2C Arduino всегда включена)

и

Вопрос: Как создать собственный шрифт. Ответ: шрифт должен быть доступен в формат файла bdf. Затем используйте bdfconv для создания данных шрифта. Шрифт данные можно вставить в существующий файл вашего проекта. Есть также хороший редактор растровых шрифтов Windows «Fony ». (http://hukka.ncn.fi/?fony), который может экспортировать файлы .bdf. Копия Fony 1.4.7 доступен здесь: https://github.com/olikraus/u8g2/tree/master/tools/font/fony

Каталог tools/font содержит несколько утилит, в том числе такую, которая конвертирует шрифты OTF в формат BDF

После получения шрифта формата BDF вы используете bdfconv для создания файл C, содержащий массив шрифтов. Одним из аргументов bdfconf является опция -m 'map'. Вы можете разместить там список диапазонов Юникода, которые ограничивают количество включенных символов. Таким образом, вы можете создать шрифт, содержащий ТОЛЬКО те символы, которые вам нужны.

Например, -m '45-46,48-57,77,107,109,181,937' возвращает вам минус, десятичное число, 0–9, 'M', 'k', 'm', мю, омега . Карта символов Юникода на странице https://unicode-table.com/en/

Преимущество создания шрифта заключается в том, что библиотека u8g2lib сама выполняет все сопоставление с растровыми изображениями, расчет ширины символов и т. д., поэтому вам не нужно этого делать.

,

это действительно полезно, особенно в части сокращения памяти, но я до сих пор не уверен, как использовать инструмент bdfconv, похоже, он используется с командной строкой Linux, а не Windows. Кроме того, даже когда я получаю файл C, я не знаю, как его использовать. следует ли мне добавить что-нибудь в u8g2_fonts.c? должен ли я просто скопировать и вставить сгенерированный файл в свой эскиз .ino? пожалуйста, дайте ссылку на полное руководство, если можете, или хотя бы создайте базовое руководство, спасибо!, @OM222O

Я не уверен, что существует полное руководство. Посмотрите https://github.com/olikraus/u8g2/tree/master/tools/font/bdfconv для версии bdfconv .exe для Windows!. Полученный файл шрифта .c: просто #include "fontfile.c" в вашу программу и поместите файл в ту же папку, что и ваш эскиз. Это позволит добавить шрифт без необходимости редактировать существующий файл шрифтов., @jose can u c

когда я запускаю файл .exe, ничего не происходит. Должен ли я также загрузить и изменить «Makefile»? Инструкции действительно расплывчаты и отсутствуют, если честно., @OM222O

Я скачал https://github.com/olikraus/u8g2/blob/master/tools/font/bdfconv/bdfconv_2_22.exe, и он работает нормально., @jose can u c

он не требует никаких других файлов и работает сам по себе? у меня он открывается и закрывается сразу после этого! Я думаю, мне придется продолжать создавать растровые изображения вручную :(, @OM222O

Вам придется запустить его из командной строки. Это не графическая программа., @jose can u c

Еще одно замечание: если шрифты, которые вы хотите использовать, занимают 70% флэш-пространства, но вы не заполняете 100%, то в чем проблема?, @jose can u c

потому что это только аспект программы, связанный с отображением! если я добавлю остальную часть проекта, он не поместится!, @OM222O