Вывод русского языка на max7219. Нужна помощь.

Тема в разделе "Arduino & Shields", создана пользователем Vladimir75rus, 30 май 2018.

  1. Vladimir75rus

    Vladimir75rus Нерд

    Всем здравствуйте, я нашел скетч в интернете для вывода русских букв на мою матрицу. Русские буквы у меня шли, только не те которые были нужны. Пример: ВОВА->ГБГП. Почему именно так ? Вот скетч.
    Код (C++):
    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Max72xxPanel.h>

    //------------------------------------------------------------------------------------------------------------

    int pinCS = 9;
    // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
    int numberOfHorizontalDisplays = 1;
    int numberOfVerticalDisplays = 4;

    Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

    String tape = "";
    int wait = 100; // In milliseconds

    int spacer = 2; // Промежуток между символами (кол-во точек)
    int width = 5 + spacer; // The font width is 5 pixels

    //------------------------------------------------------------------------------------------------------------

    /* UTF-8 */

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

    //----------------------------------------

    String Serial_Read() {
      unsigned char c; // переменная для чтения сериал порта
      String Serial_string = ""; // Формируемая из символов строка
      while (Serial.available() > 0) { // Если в сериал порту есть символы
        c = Serial.read(); // Читаем символ
        //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
        if (c == '\n') {  // Если это конец строки
              return Serial_string; // Возвращаем строку
        }
        if (c == 0xB8) c = c - 0x01;  // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
        if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
        Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
      }
      return Serial_string;
    }

    //------------------------------------------------------------------------------------------------------------

    void setup() {
      Serial.begin(9600);
      tape = utf8rus("Приятного использования");
      matrix.setIntensity(1); //Используйте значение от 0 до 15 для яркости
      matrix.setRotation(1); //1 - 90  2 - 180   3 - 270

    }

    //------------------------------------------------------------------------------------------------------------

    void loop() {

      if (Serial.available()){
        tape=Serial_Read();
      }
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
           {
        matrix.fillScreen(LOW);

        int letter = i / width; // номер символа выводимого на матрицу
       
        int x = (matrix.width() - 1) - i % width;
        int y = (matrix.height() - 8) / 2; // центрировать текст по вертикали

        while ( x + width - spacer >= 0 && letter >= 0 ) {
          if ( letter < tape.length() ) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
          }
          letter--;
          x -= width;
        }
        matrix.write(); // Отправить растровое изображение для отображения
        delay(wait);
      }
    }
     
  2. DetSimen

    DetSimen Guest

    откуда он узнал, что ты на самом деле не ВОВА, а ГБГП?
     
    b707, qwone и parovoZZ нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Так где скетч нашел, там и спрашивай)))
     
  4. Vladimir75rus

    Vladimir75rus Нерд

    Хорошая шутка, спасибо, что хотя бы повеселили)
     
  5. parovoZZ

    parovoZZ Гуру

    Ну заходи ещё. У нас весело =)
     
  6. valera1950

    valera1950 Нуб

    У меня была такая же ситуация . Версия библиотеки Adafruit_GFX очень много. Адреса, по которым распологается кирилица могут не совпадать с теми адресами, которые указаны в String utf8rus. Я просто подобрал несколько скетчей String utf8rus. Они друг от друга отличаются только адресами
    и подобрал под эти скетчи версии Adafruit_GFX. Версия 1.2.2 соответствует скетчу
    прведенному ниже
    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++;
    if (n >= 0xC0) {
    switch (n) {
    case 0xD0: {
    n = source; i++;
    if (n == 0x81) { n = 0xA8; break; }
    if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
    break;
    }
    case 0xD1: {
    n = source; 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;
    }
     
    Последнее редактирование: 12 дек 2021
  7. b707

    b707 Гуру

    ой блин.... умельцы... версий библиотеки у них много...
    Ребята, прежде чем выдумывать свои рецепты решения несуществующей проблемы. прочитайте в интернете какую-нибудь статью на тему что такое кодировка и какие бывают кодировки кириллицы.
     
    DetSimen нравится это.
  8. valera1950

    valera1950 Нуб

    В среде Arduino IDE больше 50 версий библиотеки Adafruit_GFX. И не каждая подходит под String utf8rus приведенный выше. Но когда выдается кирилицей слово ЕПН , то, на мой взгляд виновата не кодировка. Если сместить на одну позицию каждую букву , то получиться слово ДОМ, то что и было нужно. Вот это меня навело на мысль что произошло смещение по адресам кирилицы. Обычно, если не подходит кодировка выдается какая то абракадабра,
     
  9. b707

    b707 Гуру

    не пишите ерунды. Вы в принципе не понимаете, откуда берется проблема. Это не "50 версий библиотеки", это куча комбинаций функции utf8rus и кодировки фонтов, причем и то и другое к самой библиотеке Adafruit_GFX не имеет никакого отношения.
     
  10. Igor68

    Igor68 Гуру

    А Вы попробуйте текст "ВОВА" выводить в ASCII а не в UTF-8/16 и WINDOWS-1251. И посмотрите кодировку как тут сказали. А то не ясно ни шиша. В конце-концов переройте библиотеку - там всё ясно.
     
  11. valera1950

    valera1950 Нуб

    В менеджере библиотек ARDUINO IDE есть библиотека Adafruit GFX Library. Если подвести к нему указатель мышки, то высвечивается транспорант <ВЫЕРИТЕ ВЕРСИЮ> Вот откуда появились слова " 50 версий библиотеки" Я не спорю с вашим теоретическим обоснованием функции utf8rus Я недавно начал заниматься Ардуино и вообще программированием не занимался. Скачал скетч бегущей строки, собрал схему, Русский язык не пошел. Поискал в инете , нашел предположение, что может виновата библиотека. Начал подбирать версии, Нарваля сначала на кирилицу, но буквы не те, что нужно, а потом поймал нужную мне версию, Вопрос Vladimir75Rus очень подходил на мою проблему. Поэтому я и написал, что я сделал. Ни какие кодировки я не менял.
     
  12. parovoZZ

    parovoZZ Гуру

    LOL
    Жгите ещё.