Микроконтроллеры это просто. TFT дисплеи. Вывод шрифтов.
Я рассказывал как вывести русский шрифт на LED матрицы, а так же как создавать свои шрифты для LED матриц, в этой статье речь будет о выводе шрифтов на TFT экраны, их создание и оптимальное использование в Arduino IDE.
Теория.
Для начала немного теории. В Arduino IDE русский текст имеет кодировку UTF-8, то есть каждый символ закодирован 2 байтами, за исключением латинских символов, цифр и знаков, которые имеют 1 байт, вернее 7 бит (от 32 до 127). Библиотеки обрабатывают только одно байтовые строки и если им попадется символ из кодировки UTF-8 то напечатано будет 2 знака. Например буква А русского алфавита в кодировке UTF-8 имеет кодировку 208 144 в десятичной системе и соответственно будут напечатаны 2 символа имеющие код 208 и 144
Как использовать русские символы в этом случае? Вариантов тут несколько, один из них предложил пользователь на форуме arduino сделав шрифт в кодировке win-1251 и в скетче используя функцию конвертирования из utf-8 в win-1251. Недостатком использования этого способа является большой размер шрифта, начиная от пробела (код 32) и заканчивая буквой «я» (код 255) размер шрифта от 32-го до 255-го символа при этом имеется 40 неиспользуемых символов которые занимают место (с шрифтом по умолчанию таблица шрифта начинается с 0) . Это было бы не критично при использовании библиотеки Parola но с библиотекой Adafruit GFX которая отвечает за обработку шрифтов не всё так просто. При использовании стандартного шрифта в файле glcdfont.c символы которые не используются занимают в памяти микроконтроллера 5 байт, внешние символы этого лишены но так же используют память из-за указания параметров символа нулевой длинны. Второй недостаток использования шрифта win-1251 это необходимость использования функции преобразования, что занимает так же память. На рисунке окно программы FontForge c русскими символами соответствующие кодировке win-1251, синим указаны неиспользуемые символы.
Для исключения этих недостатков (одного или сразу двух) таблицу шрифтов лучше сделать следующим образом.
При таком расположении все русские буквы имеют такое же значение младшего байта в кодировке UTF-8 кроме букв Ё ё. А это значит, что для использования нам надо лишь отбрасывать старший байт. В кодировке UTF-8 старший байт русских символов имеет код 208 или 209, если не надо использовать букву ё то достаточно в шрифте использовать символы с кодом 208 и 209 нулевой длинны и такой шрифт будет отображаться без перекодирования, кроме того, по сравнению с шрифтом win1251 имеет меньший размер.
Использование.
Для использования скачайте шрифты и функцию перекодировки поместите папку FontsRus в папку с библиотекой Adafruit-GFX
1 2 3 4 5 |
#include "FontsRus/TimesNRCyr10.h" tft.setFont(&TimesNRCyr10pt8b); // выбор шрифта tft.print("Съешь еще этих маленьких булочек и выпей чаю"); tft.setFont(); // выбор шрифта по умолчанию |
С использованием букв Ё ё и при использовании стандартного шрифта использовать функцию utf8rus2, положите файл utf8rus2.ino в папку с скетчем
Подключаемый шрифт
1 2 3 4 5 |
#include "FontsRus/TimesNRCyr10.h" tft.setFont(&TimesNRCyr10pt8b); // выбор шрифта tft.print(utf8rus2("Съешь еще этих маленьких булочек и выпей чаю")); tft.setFont(); // выбор шрифта по умолчанию |
Стандартный шрифт (положите файл glcdfont.c в папку с библиотекой Adafruit-GFX)
1 |
tft.print(utf8rus2("Съешь еще этих маленьких булочек и выпей чаю")); |
Вот отображение внешнего шрифта TimesNewRomanCyr на экране
Сверху шрифт батарейки, который содержит 5 символов батарейки на месте цифр 0-4