Русификация библиотеки Adafruit-GFX и вывод русских букв на дисплей в кодировке UTF-8 из Arduino IDE

arduinec
Offline
Зарегистрирован: 01.09.2015

Краткие итоги предыдущих 200 постов

Для русификации библиотеки Adafruit-GFX требуется:
- скачать любой из приведённых ниже архивов;
- заменить файл glcdfont.c в Adafruit-GFX;
- добавить функцию utf8rus() в скетч;
- вставить в начале скетча команду: display.cp437(true);

Применять функцию utf8rus() можно внутри команд печати строк:
display.println(utf8rus("Тест"));

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

0.96" OLED 128x64
https://yadi.sk/d/dd7ULuRftVcRV

2.8" TFT Touch Shield 320x240
https://yadi.sk/d/FgUr5NPztVcRd

Nokia 5110 84x48
https://yadi.sk/d/juZ_mZbfsTpez

Более подробная информация в предыдущих постах.
Например:
В посте 27 демонстрируется скетч, с помощью которого можно редактировать шрифты (в том числе и в glcdfont.c).
В посте 40 приводится вариант utf8rus() с экономным использованием оперативной памяти.
В посте 46 показан 2.8" TFT Touch Shield для Uno и Mega, и прилагается полный набор библиотек и примеров для него.
В посте 80 описаны изменения в шрифте для проекта Transistor Tester.

obuhus
Offline
Зарегистрирован: 26.05.2017

Доброго дня всем.

Столкнулся с такой проблемой: дома работаю с ардуино, всё хорошо. Ещё раз спасибо уважаемому arduinec и всем, кто помогал. Но вот решил подключить на работе - шрифты не идут - кракозябры рисует. Среда разработки не ругается, сообщений не выдает... Пробовал переустанавливать,  и даже тупо скопировать полностью папку ардуино с домашнего на рабочий комп - нивкакую... ((

В чем мой косяк? Где что исправить?

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

В либе адафрут гфх поменяйте файл glcdfont.c

Опосля обязательно перезапустите дурину - там файлы из кеша берутся при компиляции

З.Ы. про это половина сообщений в этой теме

Pingui
Pingui аватар
Offline
Зарегистрирован: 30.05.2017

Всем привет) А я вот заказала на алиэкспресс телефон, а он на китайском походу. Что делать? Прошивать наверное надо?

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

arduinec, я все больше склоняюсь к тому, чтобы русский шрифт оформить отдельным массивом либо вообще вынести в отдельный хидер.

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

Pingui пишет:

Всем привет) А я вот заказала на алиэкспресс телефон, а он на китайском походу. Что делать? Прошивать наверное надо?

Это причем тут?

obuhus
Offline
Зарегистрирован: 26.05.2017

pilnikov пишет:

В либе адафрут гфх поменяйте файл glcdfont.c

Опосля обязательно перезапустите дурину - там файлы из кеша берутся при компиляции

З.Ы. про это половина сообщений в этой теме

Разумеется, заменил. Не хочет и всё тут...

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

А латиницу корректно отображает?

А версии ардуино иде одинаковые?

А если скетч из дома принести и не редактируя залить - также кракозябры?

Еще при компиляции могет выдаватся сообщение про то что найдено несколько либ гфх и будет использована - эта. А не та, в которой все поменяно 

obuhus
Offline
Зарегистрирован: 26.05.2017

С латиницей Ok. Скетч один и тот же. Ардуина одна и та же.

obuhus
Offline
Зарегистрирован: 26.05.2017

pilnikov пишет:

Еще при компиляции могет выдаватся сообщение про то что найдено несколько либ гфх и будет использована - эта. А не та, в которой все поменяно 

Есть такая штука. Как побороть? Подскажете?

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

удалите лишние (перенесите в папку в корне диска с именем "лишнее")

obuhus
Offline
Зарегистрирован: 26.05.2017

pilnikov пишет:

удалите лишние (перенесите в папку в корне диска с именем "лишнее")

Прошу прощения. Для особо одаренных... Как именно это сделать?

Genri5
Offline
Зарегистрирован: 31.05.2016

e

arduinec
Offline
Зарегистрирован: 01.09.2015

obuhus пишет:

pilnikov пишет:

Еще при компиляции могет выдаватся сообщение про то что найдено несколько либ гфх и будет использована - эта. А не та, в которой все поменяно 

Есть такая штука. Как побороть? Подскажете?

Например, можно заменить glcdfont.c во всех Adafruit-GFX.

obuhus
Offline
Зарегистрирован: 26.05.2017

[/quote]

Например, можно заменить glcdfont.c во всех Adafruit-GFX.

[/quote]

Тоже пробовал - не помогает. Ниче понять не могу((( Есть где-то инструкция подробная для начинающих, как устанавливать библиотеки, как их удалять - прям пошагово? Буду начинать с начала...

arduinec
Offline
Зарегистрирован: 01.09.2015

obuhus пишет:

Есть где-то инструкция подробная для начинающих, как устанавливать библиотеки, как их удалять - прям пошагово?

http://atmel.ucoz.ru/publ/ustanovka_dopolnitelnykh_bibliotek_arduino/2-1...

obuhus
Offline
Зарегистрирован: 26.05.2017

arduinec пишет:

obuhus пишет:

Есть где-то инструкция подробная для начинающих, как устанавливать библиотеки, как их удалять - прям пошагово?

http://atmel.ucoz.ru/publ/ustanovka_dopolnitelnykh_bibliotek_arduino/2-1...

Спасибо большое, буду изучать

obuhus
Offline
Зарегистрирован: 26.05.2017

arduinec пишет:

Появился у меня недавно 2.8" TFT Touch Shield для Uno и Mega

Вопрос к уважаемому arduinec.

Имеется Arduino Mega 2560 и 2,4" TFT, много обсуждаемый на форуме. С графикой порядок, даже русские шрифты, благодаря Вам и этому форуму... Но.

Запонадобилось соорудить диммер с графическим экраном и, соответственно, внешним прерыванием по переходу через ноль. Без выше обсуждаемого экрана всё чудесно, всё работает. Подключаю к ардуине экран, затем втыкаю пин 21 (прерывание 2) - белый экран. Перепробовал все доступные прерывания - одно и то же. Прерывания 0 и 1 сразу в белый экран, даже без подключения живого провода перехода через ноль. 

Как быть с этим экраном? Есть возможность обойти проблему?

В качестве альтернативы(замены) нашел у китайцев похожего на Ваш TFT 2.8". Вот здесь: https://www.elecrow.com/wiki/index.php?title=2.8%27%27_TFT_Touch_Shield . Пишут, что использует только пины D4-D13 и A0-A3. Т.е. пины 2 и 3 для моего прерывания, вроде как, доступны. Будет-ли он у меня работать выдадвая графику и не мешая работе внешнего прерывания? 

Заранее спасибо.

KoJIxo3Huk
Offline
Зарегистрирован: 07.02.2017

"пин 21 (прерывание 2)" - это получается пин МК, не пин Меги? На этом пине ICSP сидит, может из-за этого? Не пробовали прерывания на порту К использовать? Это на меге ноги А8-А15.

Или может прерывания очень долго обрабатываются - код в обработчике прерывания большой? У меня из-за большой загрузки МК (таймер_1 очень часто вызывался) практически не работал тач-скрин, пришлось от него отказаться.

obuhus
Offline
Зарегистрирован: 26.05.2017

21 pin на плате Меги, он же Arduino Mega Interrrupt #2.

На самом деле у меня, пока, 2 разных скетча. 1й - графика и сбор необходимых данных (переменных). 2й - собственно счектч обработки прерываний на основе "собранных данных". Графика без подключенного провода CrossZero работает, всё как надо. Мега без экрана с подключенным проводом CrossZero работает как надо, прерывания обрабатываются.

Запускаю скетч 1й с экраном, втыкаю провод CrossZero и всё - белый экран. В скетче кода прерывания нет! Выдергиваю провод CrossZero - Мега перезагружается, графика в порядке.

KoJIxo3Huk
Offline
Зарегистрирован: 07.02.2017

Значит надо Вашу схему смотреть.

Лучше создайте отдельную тему, это к русификации библиотеки не относится.

P.S. По-идее - 21-я нога на Меге - это 43-я нога на кристалле, знаит это PD0/SCL/INT0, почему в Ардуино назвали его как Interrrupt #2 - непонятно.

obuhus
Offline
Зарегистрирован: 26.05.2017

Всё, разобрался. Ошибка в коде с обращением к Interrrupt была. Точнее обращения не было и Мега сразу уходила в бесконечное прерывание... ))) Но тем не менее огромное спасибо за участие и помощь. Благодаря Вам осенило и просмотрел код подробнее. СПАСИБО)))

sva_khv
Offline
Зарегистрирован: 19.12.2016

Vitali-71 пишет:

библиотека UTFT

Я начал тему по русификации UTFT

Если еще актуально - http://arduino.ru/forum/apparatnye-voprosy/utft-rusifikatsiya-proportsionalnym-shriftom

BB-8
Offline
Зарегистрирован: 16.07.2017

Здравствуйте не могли бы вы руссифицировать библеотеку TFT_22_ILI9225

dadja.sam
Offline
Зарегистрирован: 19.07.2017

Roboto Regular 10 - 14 pt

Roboto Thin 10 -14 pt

https://yadi.sk/d/FwQheqH73LD8WM

dadja.sam
Offline
Зарегистрирован: 19.07.2017

Roboto Black 10 -14 pt

Roboto Bold 10 -14 pt

Roboto Bold Condensed 10 -14 pt

https://yadi.sk/d/PvlcK_KW3LDdJd

AndrF
Offline
Зарегистрирован: 10.04.2016

Мой вариант руссификации дисплейчиков OLED: https://yadi.sk/d/lVw7y7Ey3M4EsE

Отличия от того что выше - нет необходимости в функции utf8rus (для этого пришлось чуть подправить файл OLEDDisplay.cpp, добавив туда свою функцию utf8ascii).

#include <brzo_i2c.h>
#include "SSD1306Brzo.h"

SSD1306Brzo OledDisplay(0x3c, D5, D6);
....
OledDisplay.init();
OledDisplay.flipScreenVertically();
OledDisplay.setContrast(200);
OledDisplay.setFont(Font5x7);
......
OledDisplay.clear();
OledDisplay.setFont(Font12x16);
OledDisplay.drawString(24, 16, "Wait...");
OledDisplay.setFont(Font5x7);
OledDisplay.drawString(8, 40, "Подключение к WiFi:");
OledDisplay.display();

Шрифты находятся в файле OLEDDisplayFonts.h. С русским я туда экспортировал только Font5x7.

arduino328
Offline
Зарегистрирован: 01.09.2016

AndrF пишет:

Отличия от того что выше ,,,

... в том, что это не руссификация Adafruit-GFX, а отдельной библиотеки для OLED-дисплеев.

AndrF
Offline
Зарегистрирован: 10.04.2016

arduino328 пишет:

... в том, что это не руссификация Adafruit-GFX, а отдельной библиотеки для OLED-дисплеев.

Не спорю. Но по идее так же можно было бы реализовать в Adafruit-GFX. Было бы время...

И что касается именно Adafruit-GFX - здесь почему-то обсуждается лишь замена "системного" фонта этой библиотечки. Однако хорошо бы иметь набор руссифицированных фонтов в его формате. В том числе и системного размера 5x7. Тогда системный можно было бы и не трогать вообще.

Лишь один человек выложил подобные фонты - как раз перед моим предыдущим сообщением. К сожалению, 5x7 там нет, а ведь он самый востребованный...

 

 

 

arduino328
Offline
Зарегистрирован: 01.09.2016

AndrF пишет:

К сожалению, 5x7 там нет, а ведь он самый востребованный...

А чем не устраивает руссифицированный шрифт 5x7, выложенный в данной теме?

AndrF
Offline
Зарегистрирован: 10.04.2016

arduino328 пишет:

А чем не устраивает руссифицированный шрифт 5x7, выложенный в данной теме?

У него формат не тот. Просто сравните его с фонтами в папке Fonts. Вот если бы конвертнуть эти фонты http://arduino.ru/forum/programmirovanie/russkie-shrifty-dlya-biblioteki-u8glib в формат Adafruit_GFX - было бы очень полезно...

negavoid
Offline
Зарегистрирован: 09.07.2016

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

Поэтому, конвертните сами для adafruit gfx, её собственной утилитой, любой шрифт, любой размер, на любой вкус: 

http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

AndrF
Offline
Зарегистрирован: 10.04.2016

negavoid пишет:

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

Сильно сомневаюсь что дело в интеллектуальной собственности на давным-давно существующие растровые шрифты. Английские фонты найти ведь совершенно не проблема. А вот нормальных русских растровых тупо нет.

negavoid пишет:

Поэтому, конвертните сами для adafruit gfx, её собственной утилитой, любой шрифт, любой размер, на любой вкус

Спасибо, конечно. Мне проще с форматами разобраться и свой конвертор набросать чем Linux ставить. Да и не горит пока - для текущей задачи обошелся тем что есть.

Кроме того те конверторы что я встречал в мелкие форматы (а 5x7 к ним относится) конвертят крайне криво.

 

arduino328
Offline
Зарегистрирован: 01.09.2016

AndrF пишет:

arduino328 пишет:

А чем не устраивает руссифицированный шрифт 5x7, выложенный в данной теме?

У него формат не тот.

Ну тут ты меня насмешил :)
Оказывается шрифт из библиотеки Adafruit-GFX имеет не тот формат, а библиотека про это не знает и продолжает его отображать :)

AndrF пишет:

Вот если бы конвертнуть эти фонты http://arduino.ru/forum/programmirovanie/russkie-shrifty-dlya-biblioteki-u8glib в формат Adafruit_GFX - было бы очень полезно...

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

arduino328
Offline
Зарегистрирован: 01.09.2016

AndrF пишет:

Кроме того те конверторы что я встречал в мелкие форматы (а 5x7 к ним относится) конвертят крайне криво.

В посте #27 данной темы приводится скетч для конвертации шрифтов с помощью Ардуино.

AndrF
Offline
Зарегистрирован: 10.04.2016

arduino328 пишет:

Оказывается шрифт из библиотеки Adafruit-GFX имеет не тот формат, а библиотека про это не знает и продолжает его отображать :)

Так вы посмотрели файлы фонтов в папочке Fonts? Я про папочку в каталоге собственно библиотеки Adafruit-GFX, если что.

arduino328 пишет:

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

Чего ради - будут нужного формата - скажу спасибо. Или даже так - СПАСИБО! Только сомневаюсь - тут ваш конвертор не поможет...

negavoid
Offline
Зарегистрирован: 09.07.2016

AndrF пишет:
Спасибо, конечно. Мне проще с форматами разобраться и свой конвертор набросать чем Linux ставить. Да и не горит пока - для текущей задачи обошелся тем что есть.

Можно и не ставить, можно скачать freetype под виндовс и собрать fontconvert.exe, уже готовый конвертер, РОДНОЙ для библиотеки adafruit. Это всё же попроще, чем разбираться с форматами и писать свой конвертер.

AndrF
Offline
Зарегистрирован: 10.04.2016

negavoid пишет:

Можно и не ставить, можно скачать freetype под виндовс и собрать fontconvert.exe, уже готовый конвертер, РОДНОЙ для библиотеки adafruit. Это всё же попроще, чем разбираться с форматами и писать свой конвертер.

Да не будет оно работать - откуда он знает форматы тех фонтов что я давал по ссылке?

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Да не нужны те шрифты, они подобным же образом сконвертированы из "нормальных, обычных". А форматы обычных знает libfreetype.

pilnikov
pilnikov аватар
Онлайн
Зарегистрирован: 28.08.2015

MikroElektronika GLCD Font Creator www.mikroe.com 

Сидите  и рисуйте какие хошь шрифты

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndrF пишет:

Сильно сомневаюсь что дело в интеллектуальной собственности на давным-давно существующие растровые шрифты.

А Вы чем-то можете аргументировать свои сомнения?

Открываем ГК РФ и читаем статью 1281 ч.1.:

Цитата:
. Исключительное право на произведение действует в течение всей жизни автора и семидесяти лет, считая с 1 января года, следующего за годом смерти автора.

Исключительное право на произведение, созданное в соавторстве, действует в течение всей жизни автора, пережившего других соавторов, и семидесяти лет, считая с 1 января года, следующего за годом его смерти.

Вы уверены, что авторы всех используемых Вами шрифтов умерли, и с момента их смерти прошло более 70 лет?

Например, срок действия авторских прав на самые первые шаги кинематографа еще не истек, Вы считаете, что массовое использование (и разработка) растровых шрифтов начались намного раньше первого кино?

sherzodbek
Offline
Зарегистрирован: 03.09.2017

Skayl пишет:

Пробовал, но как только в программе вводишь русские символы, на экране они занимают 2 знакоместа или 2 байта, не знаю как правильно объяснить...

Во второй строчке экрана, набраны буквы "АБВГД". Вот что он отображает, перед каждой буквой какой то значок. Букву "А" перерисовал в редакторе, отображается правильно. Остальные не трогал.

arduinec
Offline
Зарегистрирован: 01.09.2015

arduinec пишет:

Для того, чтобы русские буквы нормально выводились, нужно использовать функцию utf8rus(). Она есть в архиве и в примере показано как она работает.

Судя по фотографии, файл glcdfont.c не заменён, то есть русских букв в Adafruit-GFX нет.

DenSyo
Offline
Зарегистрирован: 13.01.2017

AndrF & All

есть виндовый конвертер для шрифтов адафруит и утфт с возможностью редактирования готовых с-файлов. в комплекте положил наши любимые русские дос шрифты 8х16. можете изготовить свой любого размера, можете сконвертировать любой шрифт через промежуточный формат bdf (например с помощью замечательного FontForge). есть возможность сменить кодировку шрифту. полученные в результате русские адафруит-шрифты работают через utf8rus(), русские утфт-шрифты выводятся без проблем в моем дополнении utft_binFonts

AndrF
Offline
Зарегистрирован: 10.04.2016

DenSyo пишет:
AndrF & All 

Спасибо. Бум смотреть.

Gogi
Offline
Зарегистрирован: 17.09.2017

[quote=arduinec]

Русификация библиотеки Adafruit-GFX и вывод русских букв на дисплей в кодировке UTF-8 из Arduino IDE

При этом русские буквы вводятся стандартным способом через русскую клавиатуру и отображаются в Arduino IDE как русские символы.

Мне понравились библиотеки Adafruit-GFX и Adafruit-SSD1306 (https://github.com/adafruit) для OLED Display 0.96 128x64 (http://arduino-project.net/oled-l2c-arduino-uno/).
Но (как и следовало ожидать) в них не оказалось русского шрифта. Добавить его оказалось несложно: нужно лишь заменить в файле glcdfont.c из Adafruit-GFX некоторые символы на русские буквы (в нужной кодировке).
Но шрифт рассчитан на однобайтовую кодировку букв, а Arduino IDE использует (для русских букв) двухбайтовую кодировку UTF-8.
Однако, при внимательном рассмотрении (и чтении Википедии) оказалось, что в русской кодировке UTF-8 прослеживается определенная последовательность. И она позволяет несложным путем перекодировать из UTF-8 в однобайтовую русскую кодировку Windows-1251, которая и была выбрана для замены букв.

Функция utf8rus() получает исходную строку, символы с кодами 0x00-0xBF пропускает без изменения в выходную строку, а в оставшихся кодах отбирает русские буквы и перекодирует их.

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Применять ее можно внутри команд печати строк:
display.println(utf8rus("Тест"));

Саму функцию можно добавить в скетч, либо в виде отдельного файла положить в каталог скетча (как и сделано в примере).

В архиве utf8rus.zip прилагаются:
- файл glcdfont.c с русскими буквами для замены в Adafruit-GFX;
- пример OledRusTest для демонстрации русских (и других) символов и работы функции utf8rus();
- пример OledSymbolTest для демонстрации использования динамических символов.
Обращаю внимание в примерах на то, что мой дисплей подключается через SPI.

https://yadi.sk/d/FWO6Y1NwiqLVu

 

Помогите вывести на матрицу MAX7219 ардуино уно знак градуса "°" Как ни пытаюсь не получается. В скетче виден а на матрице фигня. Соседние символы пробовал-тоже самое.

Gogi
Offline
Зарегистрирован: 17.09.2017

arduinec]</p> <p>[quote=Rolan_Che пишет:

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

Для примера используем ту же букву Й:

В кодировке Windows-1251 код символа Й = 0xC9, в десятичной системе = 201. В файле glcdfont.c (из архива utf8rus2.zip) массив символов начинается со строки 16. Сложив 16 и 201 получаем, что символ Й находится в строке 217.

Как вывести знак градус на MAX7219. Вместо градуса выходит "Г+-"

arduinec
Offline
Зарегистрирован: 01.09.2015

Gogi, на ваши вопросы "как" есть супер-универсальный ответ: "Молча!".

Для более разумных ответов не хватает информации: всё ли было сделано как описано в посте 201 (например)?

Gogi
Offline
Зарегистрирован: 17.09.2017

arduinec Грубо ответил. Я спрашивал не о дисплее а о матрице MAX7219. Я не программист. Информация: Плата Arduino Uno. 8 матриц MAX7219 в 1 ряд.  DHT11, DS1307 скетч здесь :http://bit.ly/2gUk99l  Библиотеки взяты по ссылке под скетчем на youtube ."°" Так он отображается в скетче(то бишь правильно.) На матрице "Г±". Соседние символы пробовал и другие пробовал-всё безуспешно.

Gogi
Offline
Зарегистрирован: 17.09.2017

[quote=arduinec]

Gogi, на ваши вопросы "как" есть супер-универсальный ответ: "Молча!".

Для более разумных ответов не хватает информации: всё ли было сделано как описано в посте 201 (например)?

 

Грубо ответил. Я спрашивал о матрице MAX7219 а не о дисплее. Я не программист. Информация: Плата Arduino Uno. 8 матриц MAX7219 в 1 ряд. DHT11, DS1307 скетч здесь :http://bit.ly/2gUk99l Библиотеки взяты по ссылке под скетчем на youtube."°" Так он отображается в скетче(то бишь правильно.) На матрице "Г±". Соседние символы пробовал и другие пробовал-всё безуспешно. Вот видео:https://www.youtube.com/watch?v=x7MATkNGZt0