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

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

Краткие итоги предыдущих 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.

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

1945 пишет:

максимум это 106 размер - #define maxString 106
С такой константой стабильная работа

Для чего опрелена maxString описано в посте #40 (http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...)

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

1945 пишет:

максимум это 106 размер - #define maxString 106
С такой константой стабильная работа

1945, у вас скорее всего просто не хватает оперативной памяти для более длинных строк. Эта проблема не имеет никакого отношения к библиотеке и уж точно не связана с типом char :)

kwazimoda
Offline
Зарегистрирован: 26.07.2020

Всем привет!

Если вкратце, то заморочился я с выводом латышских букв... Даже не знаю как сделать правильно, сначала хотел к латинским буквам дорисовывать знаки "различия". НО, потом понял, что при изменении размера шрифта рисовка тоже должна меняться, тогда тупо в файл библиотеки зарисовал латышские буквы и кейсами проверяю.

Хотелось бы чтобы можно было объединить 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;

}

 

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

Кwazimoda, обьединить не получится, потому что судя по вашему коду - латышские и русские буквы расположены в таблице в одном и том же диапазоне и пересекаются по кодам
Точнее так - функцию то обьединить можно, но не ясно - зачем. Все равно фонты придется использовать разные, то есть смешивать в одной строке латышские и русские буквы не выйдет, а значит и единая функция не нужна, проще две отдельных

-NMi-
Offline
Зарегистрирован: 20.08.2018

Нафик стока case??? Два массива в виде векторов с общим смещением не?

kwazimoda
Offline
Зарегистрирован: 26.07.2020

b707 пишет:
Кwazimoda, обьединить не получится, потому что судя по вашему коду - латышские и русские буквы расположены в таблице в одном и том же диапазоне и пересекаются по кодам Точнее так - функцию то обьединить можно, но не ясно - зачем. Все равно фонты придется использовать разные, то есть смешивать в одной строке латышские и русские буквы не выйдет, а значит и единая функция не нужна, проще две отдельных

Может я не так расписал. Буквы в те же ячейки я сам накидал. Пробовал "присобачить" сср775, но Arduino IDE меня отшила. Повторюсь, с Arduino и ESP знакомлюсь четвёртый вечер. Латышские буквы можно раскидать по свободным местам, если таковые имеются, я не могу просмотреть весь знакогенератор, а по одному символу разбирать...не серьёзно.

Так же смешивать буквы не надо будет, поскольку текст только или по латышски, или по русски. Ну если уж никак, тогда, да, надо будет 2 набора символов.

К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.

kwazimoda
Offline
Зарегистрирован: 26.07.2020

-NMi- пишет:

Нафик стока case??? Два массива в виде векторов с общим смещением не?

Как умею, так пою (могу и с ifами нагородить :D). Можно и 2 массива, только обАрзец можете накидать исходя из моих кейсов? :) Я с массивами (особенно двухмерными) не сильно дружу. Другое дело из таблицы считать данные, и получить массив для сравнения, енто не вопрос, а в таком разрезе пока фантазия так далеко не дошла.

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

kwazimoda пишет:

К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.

В ASCII буквы Ā нет. Думаю, правильное (насколько это возможно) преобразование в ASCII должно давать букву A.

kwazimoda
Offline
Зарегистрирован: 26.07.2020

andriano пишет:

kwazimoda пишет:

К примеру: латышская буква Ā в монитор порта выдаёт код 196 128, ну понятно, что это код юникода, вот как преобразовать в ASCII, не знаю.

В ASCII буквы Ā нет. Думаю, правильное (насколько это возможно) преобразование в ASCII должно давать букву A.

Да, поэтому я и написал какие коды получает символ - он из юникод таблицы, но со смещением как у автора ничего не получится, поэтому надо было что-то изобрести.

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

kwazimoda, в сообщении №457 Вы написали "не знаю". Теперь, после моего ответа в сообщении №459 - знаете.

Ну, либо я думаю, что знаете. Если я не очень понятно изложил свою мысль, попытаюсь еще раз: При преобразовании из utf-8 в ASCII буква Ā превращается в букву A. Никаких других правильных вариантов здесь нет. Другими словами, если Вам непременно нужна буква Ā, то ASCII Вам категорически не подходит.

Цитата:
поэтому надо было что-то изобрести.

В большинстве случаев оказывается, что все уже изобретено до нас. Поэтому нам остается только воспользоваться ранее изобретенным. Вопрос в том, чего именно Вы хотите добиться этим "изобретением".

По поводу работы с кодировками - посмотрите эту тему: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal

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

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

Исполнилось 5 лет первой публикации кода функции utf8rus(). Архивы с данным кодом скачало более 9 тысяч человек. Надеюсь, что данная тема помогла им русифицировать свои дисплеи.

Yuriy_K
Offline
Зарегистрирован: 23.12.2018

Большая благодарность Автору за создание и подробное разъяснение использования шрифтов в данной библиотеке. Но с появлением дисплеев с большим разрешением, потребовалось несколько доработать Adafruit-GFX. Идеи автора и его доработки подсказали идею применить шрифт 10х16 в glcdfont.c. Сам шрифт полностью перерабатывается под принципы работы библиотеки. На картинке недоработанные символы более тонкие, доработка шрифта и самой библиотеки продолжается...  

2.4&quot; TFT LCD SHIELD

    

EgorKa
Offline
Зарегистрирован: 15.08.2016

Vo_Van_163 пишет:

Архив перезалил, заменив файлы на текущую версию

#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 ();
}
  

 

Доброго времени суток, где брать библиотеку для TimeClient.h ?

pigtail000
Offline
Зарегистрирован: 03.09.2019
pigtail000
Offline
Зарегистрирован: 03.09.2019

удалите плиз

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

pigtail000 пишет:

удалите плиз

каво?

chiffa
Offline
Зарегистрирован: 30.04.2014

negavoid пишет:

Как сконвертировать любые кириллические шрифты 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'

Русские шрифты взяты отсюда отображаются без проблем... Может у кого будут идеи в чем может быть проблема?
 
chiffa
Offline
Зарегистрирован: 30.04.2014

ну вообще как то странно, часть символов отображается, часть - нет

 

    tft.setTextColor(TFT_RED);
    tft.setFreeFont(&ARIAL10pt8b);
    tft.setCursor(30, 60); 
    tft.println( utf8rus( "т" ) );
    tft.println( utf8rus( "п" ) );
    tft.println( utf8rus( "ы" ) );

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

Судя по всему, кодировка русского в программе и в фонте - разная.

Вы утилиту utf8rus откуда брали? - уверены, что она совместима с моими фонтами?

chiffa
Offline
Зарегистрирован: 30.04.2014

b707 пишет:

Судя по всему, кодировка русского в программе и в фонте - разная.

Вы утилиту utf8rus откуда брали? - уверены, что она совместима с моими фонтами?

"кодировка русского в программе и в фонте - разная."

 в плане кодировки самого ino-файла?

"Вы утилиту utf8rus откуда брали"

 из посты выше, где описана схема конвертирования

 

Sania1800
Offline
Зарегистрирован: 02.10.2021

Есть нюанс, по выводу букв, у них смещение на 1 символ.
Если у кого такой же нюанс, то смещаемся по таблице кодировок в верх.
Где фильтр от А до П, пишем вместо n = n + 0x30; - n = n + 0x2F;
Где фильтр от Р до Я, пишем вместо n = n + 0x70; - n = n + 0x6F;

Таблица: https://wiki.iarduino.ru/page/encoding-arduino/

Today_Nikolay
Today_Nikolay аватар
Offline
Зарегистрирован: 04.01.2022

Здравствуйте, я не могу понять Почему 

utf8rus

в скетче автора работает, в моем уже ругается?! На одном и том же компьютере с одной и тоже программы. 

заменить файл glcdfont.c, заменил 

Библиотеки одинаковые:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Вот мой скетч 

#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);
}

 

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

как ругается? - матом?

Если имеются в виду ошибки компиляции - приведите сообщение об ошибке полностью.

И, кстати, покажите мне в вашем коде функцию utf8rus() - по-моему ее тут нет

Today_Nikolay
Today_Nikolay аватар
Offline
Зарегистрирован: 04.01.2022

Use of undeclared identifier 'utf8rus'

Compilation error: exit status 1

 

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

Today_Nikolay пишет:

Use of undeclared identifier 'utf8rus'

Compilation error: exit status 1

 

ну так и я вам о том же - где у вас в коде функция utf8rus?

Today_Nikolay
Today_Nikolay аватар
Offline
Зарегистрирован: 04.01.2022

Спасибо большое

не хватало 

/* 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;
}

 

andrus
Offline
Зарегистрирован: 20.10.2019

Здравствуйте! Скетч написан для 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". Может кто сталкивался с подобной проблемой и подскажет, на что обратить внимание?

mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:

 Может кто сталкивался с подобной проблемой и подскажет, на что обратить внимание?

Сталкивался с таким после обновления Adafruit_GFX. Решил проблему откатом адафрутовской библиотеки пока не заработало.

andrus
Offline
Зарегистрирован: 20.10.2019

Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(

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

andrus пишет:

Спасибо за ответ! Тоже так делал. Переустанавливал и IDE тоже. Пока не помогло :(

похоже вы не поняли. Вам предлагают не просто переустановить библиотеку, а взять более старую версию. Советую взять Adafruit_GFX 1.7

andrus
Offline
Зарегистрирован: 20.10.2019

b707 пишет:

andrus пишет:

Спасибо за ответ! Тоже так делал. Переустанавливал и 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" так же появляется после компиляции. Куда копать, ума не приложу

 
mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:
Adafruit_GFX 1.7 установил

Посмотрел, у меня 1.5.6. С более новыми то ли не заработало, то ли я уже не стал экспериментировать, не помню. Эта работает, меня пока устраивает.

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

andrus пишет:
1.7 установил

Посмотрел, у меня 1.5.6. 

Знаете, я тут поэкспериментировал и пришел к выводу, что проблема компилятора связана с ESP32. Собрал макет на nano, загрузил скетч с русификатором. Все работает. А с ESP - нет. Конечно столь древний Adafruit_GFX я не ставил. Но попробую из принципа, а вдруг...

andrus
Offline
Зарегистрирован: 20.10.2019

andrus пишет:

mifar пишет:

andrus пишет:
1.7 установил

Посмотрел, у меня 1.5.6. 

столь древний Adafruit_GFX я не ставил. Но попробую из принципа, а вдруг...

Попробовал. Безрезультатно. С ESP32 - не работает

mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:

Попробовал. Безрезультатно. С ESP32 - не работает

У меня сейчас на ESP32 как раз и работает. До этого была нанка, потом ESP8266.

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

andrus пишет:

Попробовал. Безрезультатно. С ESP32 - не работает

У меня сейчас на ESP32 как раз и работает. До этого была нанка, потом ESP8266.

А можно подробнее? Какая IDE у вас установлена? Какая плата ESP32? У меня DOIT ESP32 DEVKIT V1. 

mifar
Offline
Зарегистрирован: 07.04.2021

IDE 1.8.15 и 1.8.19 (на разных ПК). Ядро ESP32 2.0.1

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

Ядро ESP32 2.0.1

Извиняюсь, а где посмотреть про ядро ESP?

mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:
где посмотреть про ядро 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() {}

 

andrus
Offline
Зарегистрирован: 20.10.2019

Скомпилировал ваш код. Все равно не работает. Выдает сообщение - gen_esp32part.py:507: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal. 

Перепробовал разные релизы IDE, разные релизы библиотек. Исход одинаков. Что делать дальше, где еще копать - не знаю. Видимо собака порылась где-то в недрах реестра. Что еще придумать, ума не приложу. Остается забить на русификацию. 

 

mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:
Что еще придумать, ума не приложу.

Покажите свой код в таком же простейшем виде. Без лишних приблуд типа wifi и прочего

andrus
Offline
Зарегистрирован: 20.10.2019

Вот, примерно как ваш. Но это значения не имеет:

#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");

}

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

 

mifar
Offline
Зарегистрирован: 07.04.2021

del

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

del

А подробнее можно?

mifar
Offline
Зарегистрирован: 07.04.2021

andrus пишет:

mifar пишет:

del

А подробнее можно?

Тупанул немного. Запустил компиляцию вашего кода и не заметил что выбрана плата ESP8266. А ESP32 проверить не могу, у меня сейчас в наличии только ноут с Win7x32. На нем не компилируется даже пустой код для ESP32 - pyton(esptool.py) матерится что не совместим с 32-разрядными ОС. Так что вечером дома попробую, отпишусь.

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

andrus пишет:

mifar пишет:

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;
}

 

mifar
Offline
Зарегистрирован: 07.04.2021

Скомпилировалось нормально

andrus
Offline
Зарегистрирован: 20.10.2019

mifar пишет:

Скомпилировалось нормально

Я и не сомневался. Тут причина в чем-то другом по-видимому. С ардуино нано русификация работает без проблем. Проблемы только с ESP. Причем конкретно с моим IDE. Что-то с ПО, скорее всего, возможно результат обновления, или еще что. Загадка.

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

Давно не был на форуме, но вижу, что тут и без меня неплохо справляются. Сейчас опубликую в последний раз "Краткие итоги предыдущих постов" и далее эта тема будет развиваться без моего наблюдения.