Pull to refresh

Comments 13

Среда Arduino IDE — это обычный текстовый редактор Windows, который работает в универсальной кодировке UTF-8, как любой другой в современных версиях Windows (Блокнот, например)

Неправда, блокнот сохраняет в CHCP 1261

Черт, за столько лет и не заметил. Спасибо. Правда, не слишком часто пользуюсь блокнотом.

Библиотека u8g2 поддерживает несколько русских шрифтов из коробки и импорт сторонних шрифтов любых. Можно как с гитхаба скачать, так и из менеджера библиотек самой Arduino IDE. Автор активно развивает библиотеку и добавляет поддержку новых устройств.
Я смотрел все альтернативы, разумеется. Библиотека u8g2 чересчур сложна в применении и, кроме того, дело не в том, чтобы поддерживать шрифт. В любой библиотеке можно создать любой шрифт, это вопрос максимум полдня работы. Дело в удобстве вывода русских надписей — я стремился к тому, чтобы прямо с клавы получать читаемый код скетча. Иначе получишь трудновылавливаемые ошибки — например, когда названия месяцев в календаре по русски, ошибку в написании можно обнаружить через полгода. Я поэтому и значок градуса переместил.
Честно говоря, не увидел никаких сложностей с этой библиотекой. Русский вводится и отображается без проблем.

Три русских шрифта зашиты в библиотеку из коробки:
Unifont — https://github.com/olikraus/u8g2/wiki/fntgrpunifont
CU12 — https://github.com/olikraus/u8g2/wiki/fntgrpcu12
PX11 — https://github.com/olikraus/u8g2/wiki/fntgrpx11

Сторонние добавляются очень легко и отнюдь не за полдня. UTF8 отображает отлично.

В общем, дело ваше, использовать или нет эту библиотеку, но для других энтузиастов рекомендую именно её. Плюс библиотеку LCDMenuLib, автор которой, буквально два дня назад, даже добавил примеры для совместной работы этих двух библиотек, по моей просьбе.
fundorin, я же совершенно не возражаю. Вполне вероятно, u8g2 — наилучшее решение, а я чего-то не увидел (в первую очередь, наверное, внятной документации, позволяющей с ходу оценить преимущества и недостатки). Но так или иначе, GLCD распространена больше, примеры для нее на каждом углу, и потому мое решение ориентируется на нее.
case 'Ф': GLCD.PutChar(0xA4); break;

а разве не проще было написать что то вроде?:
String charMap = "рстуфхцшщ....";
....
  int cyrChar = charMap.indexOf(str[nn]);
if(cyrChar>=0)GLCD.PutChar(0x80+cyrChar); else GLCD.PutChar(str[nn]); 
...


www.arduino.cc/en/Reference/StringIndexOf

Может, сработает, но скорее всего нет. Я пробовал сократить алгоритм по-всякому, естественно (см. ссылку на arduinec'а в начале статьи). Простая замена кода элемента строки — напрашивается. Но никаким путем это не работало — именно из-за того, что исходные символы двухбайтовые. Строки типа String я, честно говоря, не пробовал, но уверен, что там будет то же самое: нигде не написано, что String поддерживает двухбайтовые символы (то есть наверняка не поддерживает — его элементы имеют тип char). Потому я плюнул на изыски, на которые ушла куча времени, и сделал тупую замену символов напрямую — пусть компилятор сам разбирается. Еще и потому, кстати, что сокращения времени работы все равно не получится, будет только сокращение исходного кода.
В шрифте 5х7 они абсолютно идентичны (если не считать перечеркивания нуля по умолчанию). Не путайте компьютерные TTF-шрифты с матричными при дефиците точек.

Это ноль и заглавная О соответственно

Sign up to leave a comment.

Articles