Для русификации библиотеки Adafruit-GFX требуется:
- скачать любой из приведённых ниже архивов;
- заменить файл glcdfont.c в Adafruit-GFX;
- добавить функцию utf8rus() в скетч;
- вставить в начале скетча команду: display.cp437(true);
Применять функцию utf8rus() можно внутри команд печати строк: display.println(utf8rus("Тест"));
В архивах примеры и библиотеки, различающиеся по виду дисплея:
Более подробная информация в предыдущих постах.
Например:
В посте 27 демонстрируется скетч, с помощью которого можно редактировать шрифты (в том числе и в glcdfont.c).
В посте 40 приводится вариант utf8rus() с экономным использованием оперативной памяти (с char-строками вместо String).
В посте 46 показан 2.8" TFT Touch Shield для Uno и Mega, и прилагается полный набор библиотек и примеров для него.
В посте 80 описаны изменения в шрифте для проекта Transistor Tester (http://arduino.ru/forum/proekty/transistor-tester-arduino).
В посте 379 дополнительно приведён скетч для демонстрации динамических эффектов из символов, содержащихся в шрифте.
В посте 399 приводится скетч с функцией utf8rus2hex(), которая перекодирует русские буквы и преобразует их в строчные HEX-символы.
В посте 405 приводится вариант функции utf8rus_P() для работы со строками, размещёнными в PROGMEM.
максимум это 106 размер - #define maxString 106
С такой константой стабильная работа
1945, у вас скорее всего просто не хватает оперативной памяти для более длинных строк. Эта проблема не имеет никакого отношения к библиотеке и уж точно не связана с типом char :)
Если вкратце, то заморочился я с выводом латышских букв... Даже не знаю как сделать правильно, сначала хотел к латинским буквам дорисовывать знаки "различия". НО, потом понял, что при изменении размера шрифта рисовка тоже должна меняться, тогда тупо в файл библиотеки зарисовал латышские буквы и кейсами проверяю.
Хотелось бы чтобы можно было объединить utf8rus и моё творение, поэтому прошу рассмотреть что бы сделать для совмещения. Ах да, зачем мне это надо... я живу в такой стране где в обороте оба языка - латышский и русский, ну и у меня мысль в своём проекте, в меню, сделать выбор языка. Естественно, вызывать одну функцию легче чем двумя крутить. Ну и поскольку с Arduino занимаюсь 4-ый день, то допускаю возможность оптимизации моей задумки.
Прошу сильно не пинать и тапками не бросаться.
String utf8(String source, int x, int y)
{
int i,k;
String target;
unsigned char n;
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
Serial.print(String(i)+" - "); Serial.println(n);
if (n == 196){
n = source[i++];// i++;
switch(n){
case 128: {
source.replace("Ā", String(char(244)));
}
case 129: {
source.replace("ā", String(char(233)));
}
case 140: {
source.replace("Č", String(char(245)));
}
case 141: {
source.replace("č", String(char(234)));
}
case 146: {
source.replace("Ē", String(char(246)));
}
case 147: {
source.replace("ē", String(char(235)));
}
case 162: {
source.replace("Ģ", String(char(247)));
}
case 163: {
source.replace("ģ", String(char(236)));
}
case 170: {
source.replace("Ī", String(char(248)));
}
case 171: {
source.replace("ī", String(char(237)));
}
case 182: {
source.replace("Ķ", String(char(249)));
}
case 183: {
source.replace("ķ", String(char(238)));
}
case 187: {
source.replace("Ļ", String(char(250)));
}
case 188: {
source.replace("ļ", String(char(239)));
}
}
}
if (n == 197){
n = source[i++];
switch(n){
case 133: {
source.replace("Ņ", String(char(251)));
}
case 134: {
source.replace("ņ", String(char(240)));
}
case 160: {
source.replace("Š", String(char(252)));
}
case 161: {
source.replace("š", String(char(241)));
}
case 170: {
source.replace("Ū", String(char(253)));
}
case 171: {
source.replace("ū", String(char(242)));
}
case 189: {
source.replace("Ž", String(char(254)));
}
case 190: {
source.replace("ž", String(char(243)));
}
}
}
}
return source;
}
Кwazimoda, обьединить не получится, потому что судя по вашему коду - латышские и русские буквы расположены в таблице в одном и том же диапазоне и пересекаются по кодам
Точнее так - функцию то обьединить можно, но не ясно - зачем. Все равно фонты придется использовать разные, то есть смешивать в одной строке латышские и русские буквы не выйдет, а значит и единая функция не нужна, проще две отдельных
Кwazimoda, обьединить не получится, потому что судя по вашему коду - латышские и русские буквы расположены в таблице в одном и том же диапазоне и пересекаются по кодам Точнее так - функцию то обьединить можно, но не ясно - зачем. Все равно фонты придется использовать разные, то есть смешивать в одной строке латышские и русские буквы не выйдет, а значит и единая функция не нужна, проще две отдельных
Может я не так расписал. Буквы в те же ячейки я сам накидал. Пробовал "присобачить" сср775, но Arduino IDE меня отшила. Повторюсь, с Arduino и ESP знакомлюсь четвёртый вечер. Латышские буквы можно раскидать по свободным местам, если таковые имеются, я не могу просмотреть весь знакогенератор, а по одному символу разбирать...не серьёзно.
Так же смешивать буквы не надо будет, поскольку текст только или по латышски, или по русски. Ну если уж никак, тогда, да, надо будет 2 набора символов.
К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.
Нафик стока case??? Два массива в виде векторов с общим смещением не?
Как умею, так пою (могу и с ifами нагородить :D). Можно и 2 массива, только обАрзец можете накидать исходя из моих кейсов? :) Я с массивами (особенно двухмерными) не сильно дружу. Другое дело из таблицы считать данные, и получить массив для сравнения, енто не вопрос, а в таком разрезе пока фантазия так далеко не дошла.
К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.
В ASCII буквы Ā нет. Думаю, правильное (насколько это возможно) преобразование в ASCII должно давать букву A.
Да, поэтому я и написал какие коды получает символ - он из юникод таблицы, но со смещением как у автора ничего не получится, поэтому надо было что-то изобрести.
kwazimoda, в сообщении №457 Вы написали "не знаю". Теперь, после моего ответа в сообщении №459 - знаете.
Ну, либо я думаю, что знаете. Если я не очень понятно изложил свою мысль, попытаюсь еще раз: При преобразовании из utf-8 в ASCII буква Ā превращается в букву A. Никаких других правильных вариантов здесь нет. Другими словами, если Вам непременно нужна буква Ā, то ASCII Вам категорически не подходит.
Цитата:
поэтому надо было что-то изобрести.
В большинстве случаев оказывается, что все уже изобретено до нас. Поэтому нам остается только воспользоваться ранее изобретенным. Вопрос в том, чего именно Вы хотите добиться этим "изобретением".
Сама тема, правда, посвящена несколько иному, но в последнем сообщении приведен способ работы одновременно с несколькими кодировками. Правда, на примере кириллицы. Но подобный же механизм можно использовать и в других случаях, когда необходимо иметь на экране текст, использующий несколько разных национальных наборов.
Исполнилось 5 лет первой публикации кода функции utf8rus(). Архивы с данным кодом скачало более 9 тысяч человек. Надеюсь, что данная тема помогла им русифицировать свои дисплеи.
Большая благодарность Автору за создание и подробное разъяснение использования шрифтов в данной библиотеке. Но с появлением дисплеев с большим разрешением, потребовалось несколько доработать Adafruit-GFX. Идеи автора и его доработки подсказали идею применить шрифт 10х16 в glcdfont.c. Сам шрифт полностью перерабатывается под принципы работы библиотеки. На картинке недоработанные символы более тонкие, доработка шрифта и самой библиотеки продолжается...
- ставим туда линукс, у меня уже была готовая машина с убунтой (http://www.ubuntu.com/download/desktop), я её и использовал, вы же смело можете проклацать по умолчанию все этапы установки в виртуалку - далее, далее, далее... Не забываем также после установки системы установить дополнения для виртуальной машины, чтобы нам было удобно копировать и вставлять файлы.
Приветствую! Спасибо за подробную инструкцию! Вроде как сделал все, как описано, но после загрузки на экране не отображаются русские символы (пример на скрине). код вывода:
Есть нюанс, по выводу букв, у них смещение на 1 символ.
Если у кого такой же нюанс, то смещаемся по таблице кодировок в верх.
Где фильтр от А до П, пишем вместо n = n + 0x30; - n = n + 0x2F;
Где фильтр от Р до Я, пишем вместо n = n + 0x70; - n = n + 0x6F;
Здравствуйте! Скетч написан для ESP32. Применены все рекомендации, описанные в данном форуме. Компилятор Arduino IDE 1.8.19 (свежий). Раньше скетч работал и русификатор в нем тоже. После обновления Arduino IDE также все работает, кроме русификации. После компиляции подмены шрифта не происходит от слова совсем. Вместо русского шрифта-кракозябры. В логах появляется следующее сообщение: "gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal". Может кто сталкивался с подобной проблемой и подскажет, на что обратить внимание?
Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(
похоже вы не поняли. Вам предлагают не просто переустановить библиотеку, а взять более старую версию. Советую взять Adafruit_GFX 1.7
Спасибо, но не помогло. Adafruit_GFX 1.7 установил, файл glcdfont.c подменил. Толку никакого. Сообщение: "gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal" так же появляется после компиляции. Куда копать, ума не приложу
Знаете, я тут поэкспериментировал и пришел к выводу, что проблема компилятора связана с ESP32. Собрал макет на nano, загрузил скетч с русификатором. Все работает. А с ESP - нет. Конечно столь древний Adafruit_GFX я не ставил. Но попробую из принципа, а вдруг...
Скомпилировал ваш код. Все равно не работает. Выдает сообщение - gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal.
Перепробовал разные релизы IDE, разные релизы библиотек. Исход одинаков. Что делать дальше, где еще копать - не знаю. Видимо собака порылась где-то в недрах реестра. Что еще придумать, ума не приложу. Остается забить на русификацию.
Тупанул немного. Запустил компиляцию вашего кода и не заметил что выбрана плата ESP8266. А ESP32 проверить не могу, у меня сейчас в наличии только ноут с Win7x32. На нем не компилируется даже пустой код для ESP32 - pyton(esptool.py) матерится что не совместим с 32-разрядными ОС. Так что вечером дома попробую, отпишусь.
Я и не сомневался. Тут причина в чем-то другом по-видимому. С ардуино нано русификация работает без проблем. Проблемы только с ESP. Причем конкретно с моим IDE. Что-то с ПО, скорее всего, возможно результат обновления, или еще что. Загадка.
Давно не был на форуме, но вижу, что тут и без меня неплохо справляются. Сейчас опубликую в последний раз "Краткие итоги предыдущих постов" и далее эта тема будет развиваться без моего наблюдения.
Краткие итоги предыдущих 450 постов
Для русификации библиотеки 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() с экономным использованием оперативной памяти (с char-строками вместо String).
В посте 46 показан 2.8" TFT Touch Shield для Uno и Mega, и прилагается полный набор библиотек и примеров для него.
В посте 80 описаны изменения в шрифте для проекта Transistor Tester (http://arduino.ru/forum/proekty/transistor-tester-arduino).
В посте 379 дополнительно приведён скетч для демонстрации динамических эффектов из символов, содержащихся в шрифте.
В посте 399 приводится скетч с функцией utf8rus2hex(), которая перекодирует русские буквы и преобразует их в строчные HEX-символы.
В посте 405 приводится вариант функции utf8rus_P() для работы со строками, размещёнными в PROGMEM.
максимум это 106 размер - #define maxString 106
С такой константой стабильная работа
Для чего опрелена maxString описано в посте #40 (http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...)
максимум это 106 размер - #define maxString 106
С такой константой стабильная работа
1945, у вас скорее всего просто не хватает оперативной памяти для более длинных строк. Эта проблема не имеет никакого отношения к библиотеке и уж точно не связана с типом char :)
Всем привет!
Если вкратце, то заморочился я с выводом латышских букв... Даже не знаю как сделать правильно, сначала хотел к латинским буквам дорисовывать знаки "различия". НО, потом понял, что при изменении размера шрифта рисовка тоже должна меняться, тогда тупо в файл библиотеки зарисовал латышские буквы и кейсами проверяю.
Хотелось бы чтобы можно было объединить utf8rus и моё творение, поэтому прошу рассмотреть что бы сделать для совмещения. Ах да, зачем мне это надо... я живу в такой стране где в обороте оба языка - латышский и русский, ну и у меня мысль в своём проекте, в меню, сделать выбор языка. Естественно, вызывать одну функцию легче чем двумя крутить. Ну и поскольку с Arduino занимаюсь 4-ый день, то допускаю возможность оптимизации моей задумки.
Прошу сильно не пинать и тапками не бросаться.
String utf8(String source, int x, int y) { int i,k; String target; unsigned char n; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; Serial.print(String(i)+" - "); Serial.println(n); if (n == 196){ n = source[i++];// i++; switch(n){ case 128: { source.replace("Ā", String(char(244))); } case 129: { source.replace("ā", String(char(233))); } case 140: { source.replace("Č", String(char(245))); } case 141: { source.replace("č", String(char(234))); } case 146: { source.replace("Ē", String(char(246))); } case 147: { source.replace("ē", String(char(235))); } case 162: { source.replace("Ģ", String(char(247))); } case 163: { source.replace("ģ", String(char(236))); } case 170: { source.replace("Ī", String(char(248))); } case 171: { source.replace("ī", String(char(237))); } case 182: { source.replace("Ķ", String(char(249))); } case 183: { source.replace("ķ", String(char(238))); } case 187: { source.replace("Ļ", String(char(250))); } case 188: { source.replace("ļ", String(char(239))); } } } if (n == 197){ n = source[i++]; switch(n){ case 133: { source.replace("Ņ", String(char(251))); } case 134: { source.replace("ņ", String(char(240))); } case 160: { source.replace("Š", String(char(252))); } case 161: { source.replace("š", String(char(241))); } case 170: { source.replace("Ū", String(char(253))); } case 171: { source.replace("ū", String(char(242))); } case 189: { source.replace("Ž", String(char(254))); } case 190: { source.replace("ž", String(char(243))); } } } } return source; }Кwazimoda, обьединить не получится, потому что судя по вашему коду - латышские и русские буквы расположены в таблице в одном и том же диапазоне и пересекаются по кодам
Точнее так - функцию то обьединить можно, но не ясно - зачем. Все равно фонты придется использовать разные, то есть смешивать в одной строке латышские и русские буквы не выйдет, а значит и единая функция не нужна, проще две отдельных
Нафик стока case??? Два массива в виде векторов с общим смещением не?
Может я не так расписал. Буквы в те же ячейки я сам накидал. Пробовал "присобачить" сср775, но Arduino IDE меня отшила. Повторюсь, с Arduino и ESP знакомлюсь четвёртый вечер. Латышские буквы можно раскидать по свободным местам, если таковые имеются, я не могу просмотреть весь знакогенератор, а по одному символу разбирать...не серьёзно.
Так же смешивать буквы не надо будет, поскольку текст только или по латышски, или по русски. Ну если уж никак, тогда, да, надо будет 2 набора символов.
К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.
Нафик стока case??? Два массива в виде векторов с общим смещением не?
Как умею, так пою (могу и с ifами нагородить :D). Можно и 2 массива, только обАрзец можете накидать исходя из моих кейсов? :) Я с массивами (особенно двухмерными) не сильно дружу. Другое дело из таблицы считать данные, и получить массив для сравнения, енто не вопрос, а в таком разрезе пока фантазия так далеко не дошла.
К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.
К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.
Да, поэтому я и написал какие коды получает символ - он из юникод таблицы, но со смещением как у автора ничего не получится, поэтому надо было что-то изобрести.
kwazimoda, в сообщении №457 Вы написали "не знаю". Теперь, после моего ответа в сообщении №459 - знаете.
Ну, либо я думаю, что знаете. Если я не очень понятно изложил свою мысль, попытаюсь еще раз: При преобразовании из utf-8 в ASCII буква Ā превращается в букву A. Никаких других правильных вариантов здесь нет. Другими словами, если Вам непременно нужна буква Ā, то ASCII Вам категорически не подходит.
В большинстве случаев оказывается, что все уже изобретено до нас. Поэтому нам остается только воспользоваться ранее изобретенным. Вопрос в том, чего именно Вы хотите добиться этим "изобретением".
По поводу работы с кодировками - посмотрите эту тему: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal
Сама тема, правда, посвящена несколько иному, но в последнем сообщении приведен способ работы одновременно с несколькими кодировками. Правда, на примере кириллицы. Но подобный же механизм можно использовать и в других случаях, когда необходимо иметь на экране текст, использующий несколько разных национальных наборов.
Исполнилось 5 лет первой публикации кода функции utf8rus(). Архивы с данным кодом скачало более 9 тысяч человек. Надеюсь, что данная тема помогла им русифицировать свои дисплеи.
Большая благодарность Автору за создание и подробное разъяснение использования шрифтов в данной библиотеке. Но с появлением дисплеев с большим разрешением, потребовалось несколько доработать Adafruit-GFX. Идеи автора и его доработки подсказали идею применить шрифт 10х16 в glcdfont.c. Сам шрифт полностью перерабатывается под принципы работы библиотеки. На картинке недоработанные символы более тонкие, доработка шрифта и самой библиотеки продолжается...
Архив перезалил, заменив файлы на текущую версию
#include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <ESP8266WiFi.h> #include "Wire.h" #include "TimeClient.h" Adafruit_PCD8544 display = Adafruit_PCD8544(14, 13, 12, 5, 4); float utcOffset = 4; // enter your UTC TimeClient timeClient(utcOffset); String ssid = "Tenda"; int clockDelay = 1000 ; // clock update period int updateDelay = 30*60*1000 ; // time server verify period min*sec*millis unsigned long clockUpdate = 0 ; // unsigned long timeUpdate = 0 ; // void syncPrint () ; void timePrint (); void setup() { Serial.begin(9600); Serial.println(); Serial.println(); // initialize dispaly display.begin(); // init done display.cp437(true); // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(50); /* display.display(); // show splashscreen delay(2000); display.clearDisplay(); // clears the screen and buffer */ WiFi.begin("Tenda", "12345678"); display.setTextColor(BLACK); while (WiFi.status() != WL_CONNECTED) { delay(250); Serial.print("."); display.setTextSize(1); display.clearDisplay(); display.setCursor(0,0); display.print(utf8rus("Соединяем х")); display.display(); delay(250); Serial.print("."); display.clearDisplay(); display.setCursor(0,0); display.print(utf8rus("Соединяем +")); display.display(); } display.clearDisplay(); display.setCursor(0,0); display.print(utf8rus("Ура!!!")); display.setCursor(0,10); display.print(utf8rus("Мы в сети:")); display.setCursor(0,20); display.print(ssid); display.display(); delay (2000); clockUpdate = millis () ; // timeUpdate = millis () ; // timeClient.updateTime(); } void loop () { unsigned long currentMillis = millis(); if ((currentMillis - timeUpdate) < 3000){ syncPrint (); } if ((currentMillis - timeUpdate) > updateDelay) { timeClient.updateTime(); timeUpdate = millis (); } if ((currentMillis - clockUpdate) >= clockDelay ) { timePrint (); clockUpdate = millis (); } display.display(); } void timePrint () { // String time = timeClient.getFormattedTime(); String H = timeClient.getHours(); String M = timeClient.getMinutes(); String S = timeClient.getSeconds(); display.clearDisplay(); display.setCursor(1,24); // display.print(time); display.setTextSize(3); display.print(H); // display.setTextSize(2); // display.print("-"); display.setCursor(47,24); display.setTextSize(3); display.print(M); display.setTextSize(1); display.setCursor(35,24); display.print(S); display.display (); } void syncPrint () { // display.clearDisplay(); display.setTextSize(1); display.setCursor(0,0); display.print(utf8rus("Сверим часы с")); display.setCursor(0,8); display.print("time.nist.gov"); display.display (); }https://github.com/ThingPulse/esp8266-weather-station/tree/master/src
удалите плиз
удалите плиз
каво?
Как сконвертировать любые кириллические шрифты Windows для использования с Adafruit GFX
Подготовка (1 раз):
- glcdfont.c заменять не обязательно, если не планируем выводить кириллицу шрифтом по умолчанию
- у меня всё работает и без вызова display.cp437(true), возможно, вам всё же понадобится её вызвать в скетче
- устанавливаем любую виртуальную машину, vmware, virtualbox (https://www.virtualbox.org/wiki/Downloads)
- ставим туда линукс, у меня уже была готовая машина с убунтой (http://www.ubuntu.com/download/desktop), я её и использовал, вы же смело можете проклацать по умолчанию все этапы установки в виртуалку - далее, далее, далее... Не забываем также после установки системы установить дополнения для виртуальной машины, чтобы нам было удобно копировать и вставлять файлы.
- заходим в папку [ скетчи/libraries/ваш-adafruit-gfx/fontconvert/ ], заменяем содержимое файла fontconvert.c на вот это (чуть подправил его для корректной работы с юникодом, таблицу взял здесь http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT):
Приветствую! Спасибо за подробную инструкцию! Вроде как сделал все, как описано, но после загрузки на экране не отображаются русские символы (пример на скрине). код вывода:
tft.setTextSize(2); tft.setFreeFont(&SEGOESC10pt8b); tft.setCursor(30, 60); tft.setTextColor(TFT_RED); tft.println(utf8rus("Привет")); tft.println(utf8rus("МИР!"));использую tft.setFreeFont т.к. при попытки использовать tft.setFont(&SEGOESC10pt8b); получаю ошибку: 'class TFT_eSPI' has no member named 'setFont'
ну вообще как то странно, часть символов отображается, часть - нет
tft.setTextColor(TFT_RED); tft.setFreeFont(&ARIAL10pt8b); tft.setCursor(30, 60); tft.println( utf8rus( "т" ) ); tft.println( utf8rus( "п" ) ); tft.println( utf8rus( "ы" ) );Судя по всему, кодировка русского в программе и в фонте - разная.
Вы утилиту utf8rus откуда брали? - уверены, что она совместима с моими фонтами?
Судя по всему, кодировка русского в программе и в фонте - разная.
Вы утилиту utf8rus откуда брали? - уверены, что она совместима с моими фонтами?
"кодировка русского в программе и в фонте - разная."
в плане кодировки самого ino-файла?
"Вы утилиту utf8rus откуда брали"
из посты выше, где описана схема конвертирования
Есть нюанс, по выводу букв, у них смещение на 1 символ.
Если у кого такой же нюанс, то смещаемся по таблице кодировок в верх.
Где фильтр от А до П, пишем вместо n = n + 0x30; - n = n + 0x2F;
Где фильтр от Р до Я, пишем вместо n = n + 0x70; - n = n + 0x6F;
Таблица: https://wiki.iarduino.ru/page/encoding-arduino/
Здравствуйте, я не могу понять Почему
в скетче автора работает, в моем уже ругается?! На одном и том же компьютере с одной и тоже программы.
заменить файл glcdfont.c, заменил
Библиотеки одинаковые:
Вот мой скетч
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define NUMFLAKES 10 // Number of snowflakes in the animation example void setup() { display.begin(SSD1306_SWITCHCAPVCC); display.cp437(true); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally display.drawPixel(10, 10, SSD1306_WHITE); } void loop() { testscrolltext(); } void testscrolltext() { display.clearDisplay(); display.setTextSize(1); // Draw 2X-scale text display.setTextColor(SSD1306_WHITE); display.setCursor(10, 0); display.println(utf8rus("АБВГДЕЖЗИЙКЛМНОП")); display.display(); // Show initial text delay(100); // Scroll in various directions, pausing in-between: display.startscrollright(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); delay(1000); }как ругается? - матом?
Если имеются в виду ошибки компиляции - приведите сообщение об ошибке полностью.
И, кстати, покажите мне в вашем коде функцию utf8rus() - по-моему ее тут нет
Use of undeclared identifier 'utf8rus'
Compilation error: exit status 1
Use of undeclared identifier 'utf8rus'
Compilation error: exit status 1
ну так и я вам о том же - где у вас в коде функция utf8rus?
Спасибо большое
не хватало
/* Recode russian fonts from UTF-8 to Windows-1251 */ 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; }Здравствуйте! Скетч написан для ESP32. Применены все рекомендации, описанные в данном форуме. Компилятор Arduino IDE 1.8.19 (свежий). Раньше скетч работал и русификатор в нем тоже. После обновления Arduino IDE также все работает, кроме русификации. После компиляции подмены шрифта не происходит от слова совсем. Вместо русского шрифта-кракозябры. В логах появляется следующее сообщение: "gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal". Может кто сталкивался с подобной проблемой и подскажет, на что обратить внимание?
Может кто сталкивался с подобной проблемой и подскажет, на что обратить внимание?
Сталкивался с таким после обновления Adafruit_GFX. Решил проблему откатом адафрутовской библиотеки пока не заработало.
Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(
Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(
похоже вы не поняли. Вам предлагают не просто переустановить библиотеку, а взять более старую версию. Советую взять Adafruit_GFX 1.7
Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(
похоже вы не поняли. Вам предлагают не просто переустановить библиотеку, а взять более старую версию. Советую взять Adafruit_GFX 1.7
Спасибо, но не помогло. Adafruit_GFX 1.7 установил, файл glcdfont.c подменил. Толку никакого. Сообщение: "gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal" так же появляется после компиляции. Куда копать, ума не приложу
Посмотрел, у меня 1.5.6. С более новыми то ли не заработало, то ли я уже не стал экспериментировать, не помню. Эта работает, меня пока устраивает.
Посмотрел, у меня 1.5.6.
Знаете, я тут поэкспериментировал и пришел к выводу, что проблема компилятора связана с ESP32. Собрал макет на nano, загрузил скетч с русификатором. Все работает. А с ESP - нет. Конечно столь древний Adafruit_GFX я не ставил. Но попробую из принципа, а вдруг...
Посмотрел, у меня 1.5.6.
столь древний Adafruit_GFX я не ставил. Но попробую из принципа, а вдруг...
Попробовал. Безрезультатно. С ESP32 - не работает
Попробовал. Безрезультатно. С ESP32 - не работает
У меня сейчас на ESP32 как раз и работает. До этого была нанка, потом ESP8266.
Попробовал. Безрезультатно. С ESP32 - не работает
У меня сейчас на ESP32 как раз и работает. До этого была нанка, потом ESP8266.
А можно подробнее? Какая IDE у вас установлена? Какая плата ESP32? У меня DOIT ESP32 DEVKIT V1.
IDE 1.8.15 и 1.8.19 (на разных ПК). Ядро ESP32 2.0.1
Ядро ESP32 2.0.1
Извиняюсь, а где посмотреть про ядро ESP?
В менеджере плат
Вот с таким простейшим кодом под мой дисплей TFT 1.44 все нормально компилируется и работает на ESP32
#include <SPI.h> #include <Adafruit_ST7735.h> #define __CS 4 #define __A0 17 #define __RES 16 Adafruit_ST7735 tft = Adafruit_ST7735(__CS, __A0, __RES); void setup() { tft.initR(INITR_GREENTAB); tft.setRotation(4); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK); tft.setTextSize(2); tft.setCursor(1, 5); tft.println(utf8rus("Привет")); } 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 >= 0xBF) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } void loop() {}Скомпилировал ваш код. Все равно не работает. Выдает сообщение - gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal.
Перепробовал разные релизы IDE, разные релизы библиотек. Исход одинаков. Что делать дальше, где еще копать - не знаю. Видимо собака порылась где-то в недрах реестра. Что еще придумать, ума не приложу. Остается забить на русификацию.
Покажите свой код в таком же простейшем виде. Без лишних приблуд типа wifi и прочего
Вот, примерно как ваш. Но это значения не имеет:
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> // Arduino SPI library // ST7789 TFT module connections #define TFT_CS -1 // такого пина у экрана нет #define TFT_DC 4 // define data/command pin #define TFT_RST 2 // define reset pin, or set to -1 and connect to Arduino RESET pin /* подключение выводов дисплея 240х240 на ST7789 к ESP32 DEVKIT V1 SCL - D18 SDA - D23 RES - D2 DC - D4 */ // Initialize Adafruit ST7789 TFT library Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); void setup() { tft.cp437(true); tft.init(240, 240, SPI_MODE2); // Init ST7789 display 240x240 pixel tft.fillScreen(ST77XX_GREEN); tft.setRotation(2); //перевернуть вверх ногами } void loop() { tft.setCursor(5, 5); tft.setTextColor(ST77XX_BLACK); tft.setRotation(2); tft.setTextSize(4); tft.setTextWrap(true); tft.print (utf8rus("ПРОВЕРКА")); tft.setTextColor(ST77XX_RED); tft.setTextSize(3); tft.setCursor(10, 50); tft.print (utf8rus("Шрифты: ")); tft.setCursor(25, 80); tft.setTextSize(4); tft.print(utf8rus("ПРИВЕТ")); tft.setTextColor(ST77XX_BLUE); tft.setCursor(50, 120); tft.setTextSize(3); tft.println("123456789"); }Да, забыл отметить, что код русификатора у меня в отдельной вкладке, а не в общем теле программы. Но раньше это работало. И работает сейчас на нано.
del
del
А подробнее можно?
del
А подробнее можно?
Тупанул немного. Запустил компиляцию вашего кода и не заметил что выбрана плата ESP8266. А ESP32 проверить не могу, у меня сейчас в наличии только ноут с Win7x32. На нем не компилируется даже пустой код для ESP32 - pyton(esptool.py) матерится что не совместим с 32-разрядными ОС. Так что вечером дома попробую, отпишусь.
del
А подробнее можно?
Так что вечером дома попробую, отпишусь.
Спасибо. Буду ждать. Только не забудьте сделать вкладку "utf8rus" и в нее вставить русификатор
/* Recode russian fonts from UTF-8 to Windows-1251 */ 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; }Скомпилировалось нормально
Скомпилировалось нормально
Я и не сомневался. Тут причина в чем-то другом по-видимому. С ардуино нано русификация работает без проблем. Проблемы только с ESP. Причем конкретно с моим IDE. Что-то с ПО, скорее всего, возможно результат обновления, или еще что. Загадка.
Давно не был на форуме, но вижу, что тут и без меня неплохо справляются. Сейчас опубликую в последний раз "Краткие итоги предыдущих постов" и далее эта тема будет развиваться без моего наблюдения.