Свой текст для OLED 128x64

В очередном своём проекте я решил использовать китайский OLED дисплей разрешением 128х64 точки с интерфейсом подключения I2C.

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Но после курения весьма немногочисленных и однотипных гайдов по работе с такими экранами я понял, что круче руководств как подключить его к дуньке (4 провода, смех) и вывода на него стандартного примера, ничего во всеобъемлющем интернете толком то и нет... Да и ещё у него есть такой недостаток как скудность стандартных шрифтов – в стандартной библиотеке их всего 5, два из которых буквенные и три циферные, причём самый большой циферный выполнен в каком-то псевдоготическом стиле.

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

В общем ни один из стандартных шрифтов мне не подходил категорически. Ну чтож, подумал я, значит надо сделать свой шрифт с блекджеком и шлюхами. Дело за малым – найти гайд и бабахнуть. Но тут всплыла ещё одна проблема – гайдов по этому делу нет, только ссылки на мёртвые сайты, хождения вокруг да около, троллинг, закольцованные комментарии. Ныть на форумах я не собирался, ожидая что кто-то сделает всю работу за меня, поэтому принял решение расковырять библиотеку, а конкретнее файл DefaultFonts.c, лежащий в её папке. Итак, открываем его и видим портянку из шестнадцатеричного кода с комментами.

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Ну думаю круто, сейчас возьму фотошоп, нарисую в монохроме шрифт, загоню его в прогу конвертер картинок в хекс-код, забью в наш DefaultFonts.c и дело в шляпе. Ок, рисую шрифт 20х40:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Сохраняю в картинку каждый символ, перегоняю его в хекс с помощью DotFactory (скрин наспех, делал уже потом, для данного поста, восьмёрка кривая, как видно по визуализатору, не исправлял настройки программы):

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Вставляю в файл шрифта, в скопированный блок с новообозванным шрифтом. Затем загружаю в ардуино тестовый скетч и получаю сраку на дисплее (фото не делал, там просто россыпь хаотичных пикселей, как будто гном чихнул).

Значит не так всё просто как кажется… В конечном итоге разобрался и опишу процесс пошагово на примере одного символа.

Начну пожалуй с того, что каждый шрифт в файле DefaultFonts.c представляет собой блок с заголовком в виде:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Где MediumNumbers - имя шрифта, а набор из четырёх байтов - параметры. Итак по порядку:

0x0c - ширина шрифта, в данном случае 12 пикселей

0x10 - высота шрифта, тут равна 16ти пикселям

0x2d - порядковый номер первого символа согласно таблице ASCII

0x0d - общее количество символов в шрифте (блоке)

Теперь постараюсь ещё подробнее, чтобы не извращаться с дорисовкой ноликов, ширину принимаем кратной 4ке, то есть 4, 8, 12, 16 и тд. С высотой попроще, позже объясню как правильно её корректировать. Количество символов наверное можно не объяснять, в данном примере она равна 13ти и можно тупо посчитать строки - их ровно 13, справа даже комментарии есть какой символ зашифрован. По поводу кода символа согласно ASCII - ниже таблица, например если нужно чтобы шрифт начинался с двойки - пишем 0x32 (50 номер в десятичной), если например с буквы Q - пишем 0x51 (81 в десятичной).

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

В данном примере сделаем шрифт из одного символа, с размерами 24х32, который будет печататься на экран вместо цифры "0". Так как все делают метеостанции и умные дома, то решил нарисовать наспех такой символ:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Заметьте, картинка 24х30 пикселей, нестандартная высота для примера, цвет неважен. Хоть сине-зелёную сделайте.

Дальше валим её набок вправо, затем делим её справа налево на колонки по 8 пикселей, открываем любой текстовый редактор (или тетрадку). Я предпочитаю обычный Microsoft Word, где делаю таблицу из двух колонок - в первой у нас будут двоичные числа, во второй - перевод в 16тиричную. В принципе всё видно на картинках ниже:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Забиваем в таблицу числа в виде ХХХХХХХХ (8 бит или 1 байт) согласно заполненности цветом, у меня белый - 0, чёрный - 1. Занятие муторное, но нормальных программ для этого дела я не нашёл, наверное плохо искал.

В итоге получаем 4 блока, нумерация идёт справа налево, повторюсь. В фотошопе прекрасно видно - фон как раз таки состоит из клеток 8х8 пикселей.

Вы наверное заметили, что получилось 3 блока по 8 пикселей и последний на 6 пикселей. Как быть с последним? Просто допишем нули в начало:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

После того, как все значения записаны в двоичном коде - переводим их в шестнадцатиричную систему счисления, я делаю это с помощью калькулятора из 10ой винды, можно приспособить любой онлайн конвертер или прогу BinDecHex. В принципе наверное можно забить в файл шрифтов и в двоичном коде, но я не пробовал, можете попробовать и отписаться. В двоичном формате наверняка портянка получится дай боже.

Не забываем отделять все числа запятыми!

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Когда мучения закончатся - вставляем полученное содержимое в файл DefaultFonts.c в новый свеженький блок:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Обзовём шрифт Symbol, параметры будут "0x18, 0x20, 0x30, 0x01," что равнозначно 24х32 пикселя, 48 стартовый номер (цифра "0") и всего 1 символ в шрифте.

Далее осталось дело за малым - накидать скетч и залить в ардуино:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

В итоге получаем это:

Свой текст для OLED 128x64 Arduino, Oled, Шрифт, Своими руками, Длиннопост

Толком сфокусироваться не смог, дисплей слишком контрастный, да и поздно было) Но в принципе видно что всё у нас вышло.

Как обычно замечу что на гениальность не претендую, возможно есть способы быстрее и продуктивнее. Но этот пост позволит разобраться в принципах формирования шрифта в этой библиотеке. Гайд не исчерпывающий и для меня остались некоторые пробелы - почему например нельзя сделать шрифт произвольного размера, допустим 37х21. Если ответ на этот вопрос появится в комментариях - буду рад. Так же если имеются дополнения и вопросы - пишите, не стесняйтесь.

TECHNO BROTHER

1.6K постов12.5K подписчиков

Добавить пост

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

Ну вы прям ваще=))))

http://www.rinkydinkelectronics.com/t_make_font_file_mono.php

Рисуем в паенте вставляем конвертируем сохраняем фаил в папке с библиотекой и всё.

Все символы должны быть кратными 8 по высоте.

Как вы так гуглите что ничего не находите?

http://s020.radikal.ru/i713/1702/bc/936e24f3b1dd.jpg

Часы с моим шрифтом цифровым(крупный) перерисовал со шрифта "Терминатор", мелкие это стандартные цифры они температуру показывают.

Есть и полный шрифт "Терминатор" с анг и рус буквами и цифрами и тд.

Сейчас ещё шрифт цифрово символьный рисую как в фильме "Хищник"

раскрыть ветку (3)
Автор поста оценил этот комментарий

ну так, лёгких путей не ищем) сейчас вот нашёл прогу которой быстро перегонять в хекс можно, быстрее процесс пошёл) шрифт хищника это круто) у меня есть несколько идей по этому поводу, но руки не доходят

раскрыть ветку (2)
Автор поста оценил этот комментарий

Только шрифты "хищник" везде разные. Для винды одни, для приложения андроида другие, а по оригиналу как то мало сведений. Я пока с винды перерисовал для пробы=)

Если бы OLED дисплеи ещё бы красные продавались, идеально для такого шрифта было бы.

   

раскрыть ветку (1)
Автор поста оценил этот комментарий

с игры AVP старой надо срисовывать

Иллюстрация к комментарию
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку