583

Свой текст для 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

876 постов8.4K подписчика

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

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

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

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

Подробнее
Лучшие посты за сегодня
6834

А она и правда щеночков показать хотела и угостить газировкой

А она и правда щеночков показать хотела и угостить газировкой
6631

Но хомо

Но хомо
6554

Встреча поколений

Встреча поколений Кот, Юмор, Поколение, Картинка с текстом
Показать полностью 1
6267

Забули

Забули Политика, Илья Варламов, Украина, Скриншот, Twitter, Мат
Показать полностью 1
6146

Рамзан Кадыров: А ведь я предупреждал...

5315

Особенности национальных заражений

Особенности национальных заражений Европа, Китай, Коронавирус, Заражение, Комментарии, Мат, Неведомое, Сожрали, Секс, Вирус, Скриншот, Текст, Обезьянья оспа, Комментарии на Пикабу
5276

Все бывает впервые

Все бывает впервые Паук, Укус насекомого, Длиннопост, Южнорусский тарантул
Все бывает впервые Паук, Укус насекомого, Длиннопост, Южнорусский тарантул
Показать полностью 2
5115

Удачно закинул

5062

Как не надо

Показать полностью
4729

Международное караоке

Международное караоке
4650

В Ютюбе

В Ютюбе
4541

Зубная фея у всех разная

4164

Карта в рукаве

Карта в рукаве Скриншот, Комментарии на Пикабу, Комментарии, Фридрих Паулюс, Мат, Политика
Показать полностью 1
4139

По кругу

По кругу
3936

Фродо дембельнулся

Фродо дембельнулся Властелин колец, Встреча, Хоббит, Актеры и актрисы, Знаменитости
Показать полностью 1
3899

Додо

Додо Похудение, Дневник, Семья, Спор, Неудачники
3835

Пикабу, догоняй!

Пикабу, догоняй! Слив, Персональные данные, Twitter, Пикабу, Delivery Club, Яндекс, СДЭК, РИА Новости, Скриншот, Утечка данных
Показать полностью 1
3822

Джеисон Мамоа в суде про Эмбер Херд

3706

Чужие дети

Показать полностью
3565

Человек без телефона, просто живущий моментом и наслаждающийся игрой

Человек без телефона, просто живущий моментом и наслаждающийся игрой Спорт, Телефон, Гольф, Тайгер Вудс
Показать полностью 1
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: