Руссификация дисплея NOKIA 5110 (PCD8544)

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем ostrov, 18 сен 2016.

  1. ostrov

    ostrov Гуру

    (спойлер: задача решена оптимально, см. нижние сообщения)

    Внезапно, наверное от скуки, озаботился сабжем. Готовых решений не нашел, поэтому пытаюсь сделать свое. Русский фонт прикрутил, вывод на экран символов обеспечил, но пока что сама процедура вывода не совсем изящна, так как метод print() и println() русскую кодировку в упор не понимает. Таким образом писать пока что слова приходится так:
    Код (C++):
    byte russkie[] = {7, 0x10, 0x33, 0x31, 0x31, 0x2a, 0x28, 0x25}; // "Русские", первый байт - длина слова
    byte chasi[] = {4, 0x37, 0x20, 0x31, 0x3b}; // "часы"
    А затем выводить на экран так:
    Код (C++):
      printRus (6, 0, russkie);
      printRus (54, 0, chasi);
    В итоге получается так:
    [​IMG]
    Однако, хотелось бы чего то подобного:
    Код (C++):
     printRus (6, 0, "Русские часы");
    Ищу способ передачи строки в функцию таким способом с целью раздербавнивания ее внутри на буквы и коды ихние. Если кто знает, не таите, поделитесь.
     
    Последнее редактирование: 30 сен 2016
  2. ostrov

    ostrov Гуру

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

    alp69 Форумчанин

    Надо :)
     
  4. ostrov

    ostrov Гуру

    Приглажу немного и выложу.
     
    alp69 нравится это.
  5. ostrov

    ostrov Гуру

    Покурив тему с кодировками, удалось создать конвертор из двухбайтового UTF-8 в однобайтовую внутреннюю для сопоставления с матрицей символов, что позволило привести вывод строк к максимально понятному виду:
    Код (C++):
     byte montag[] = "понедельник"; // массив размером 23 байта - по два на символ + стоповый
    .
    .
    .
      printRuss(6, 0, montag, sizeof(montag));
    Результат:
    [​IMG]

    Два вопроса к знатокам С++. Один простой, второй посложнее:
    1. Почему при передаче указателя массива в функцию ее размер определяется некорректно. То есть, например:
    Код (C++):
    byte massiv[]={1,2,3,4,5};
    Serial.println(sizeof(massiv));  // тут правильно
    .
    Mass (massiv);
    .
    .
    .
    void Mass (byte* mmm) {
    Serial.println(sizeof(mmm)); // тут неправильно (выдает размер указателя, а не размер массива)
    }
    Как получить правильный размер массива из функции? Чтобы не передавать размер массива вторым параметром.

    2. Как "перехватить" передачу данных в метод println чтобы подкорректировать его под свои нужды?
     
    Последнее редактирование: 19 сен 2016
  6. ostrov

    ostrov Гуру

    Довел до состояния, которое меня устраивает. Переделывать библиотеку нет ни времени, ни желания, ни необходимости, сделал пока надстройку которая позволяет выводить любой текст включая русские, латинские буквы и знаки препинания. Причем, что я считаю очень удобным, что текст набирается в том виде в каком нужно прямо в окне IDE, без костылей типа "\208" и тп.

    Код примера выглядит так:
    Код (C++):
      printRusLat(0, 0, "Hello - привет");
      printRusLat(0, 10, "World - мир");
      printRusLat(0, 20, "все good!");
      printRusLat(0, 30, "test пройден");
    Результат на экране так:
    [​IMG]
     
    Последнее редактирование: 19 сен 2016
    alp69 нравится это.
  7. ostrov

    ostrov Гуру

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

    При компиляции примера возможны "кракозяблы", это нормально. См. пояснение в шапке примера.
     

    Вложения:

    Последнее редактирование: 30 сен 2016
    alp69 нравится это.
  8. ostrov

    ostrov Гуру

    Единственное над чем голову сломал, почему вывод русских букв иногда спрыгивает с UTF-8 сам собой на CP-1251 в результате чего на экране получается абракадабра. Быть такого не должно по идее, да и специально добиться не могу. Не понятно.
     
  9. ostrov

    ostrov Гуру

    Кажется начинаю понимать, файл примера *.PDE не воспринимается компилятором как родной Ардуиновский и он корежит его кодировку, так что если в примере будет выводить на экран каракули - смело копипастим его в новый проект и все будет хорошо. )

    Библиотеку обновил, чтобы было понятнее.
     
    alp69 нравится это.
  10. ostrov

    ostrov Гуру

    О результатах испытаний отпишитесь.
     
  11. alp69

    alp69 Форумчанин

    Обязательно. Но, к сожалению, нескоро. Недавно вышел из отпуска - работой завалили. Как только доберусь - обязательно отпишусь.
     
  12. Касательно вывода текста. Проверил - работает. Чему безмерно рад. Ваша библиотека самая работающая, из найденных мною за неделю поисков. Не нашёл действенного способа вывода индексов и значка градуса. Рисовать попиксельно, или это всё-таки как-то возможно в данной библиотеке? Ибо второй пример. Тот, который рисует фигуры - выдаёт ошибку
    sketch_oct07b:38: error: variable 'logo16_glcd_bmp' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

    static unsigned char PROGMEM logo16_glcd_bmp[] =

    ^

    Несколько библиотек найдено для "Adafruit_GFX.h"
    Используется: D:\DN`s files\Arduino\libraries\Adafruit-GFX-Library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-GFX-Library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-GFX-Library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-GFX-Library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-GFX-Library-master
    Несколько библиотек найдено для "Adafruit_PCD8544.h"
    Используется: D:\DN`s files\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master
    Не используется: C:\Programs\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master
    exit status 1
    variable 'logo16_glcd_bmp' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
    ЧЯДНТ?
     
  13. ostrov

    ostrov Гуру

    Рисовать попиксельно. Именно так там все и нарисовано. Надо лишь добавить.
     
  14. Т.е. редактировать сам шрифт? Объективно есть неиспользуемые символы.
    Хмм...а это может статься самый простой вариант. Отпишусь по результатам.
     
  15. LavadIs

    LavadIs Нуб

    Сбылась мечта идиота - нашел РАБОТОСПОСОБНУЮ библиотеку для работы на Великом и Могучем...
    Благодарю, ostrov!
    Но, вот оказия..., перестал работать метод "setRotation" от одноименной библы (без rus) :-((
    Может, что-то другое также перестало работать - не знаю, не проверял. Проверял Ваши библиотеки на готовом скетче, где на тот момент был кусок кода на переворот экрана.