(спойлер: задача решена оптимально, см. нижние сообщения) Внезапно, наверное от скуки, озаботился сабжем. Готовых решений не нашел, поэтому пытаюсь сделать свое. Русский фонт прикрутил, вывод на экран символов обеспечил, но пока что сама процедура вывода не совсем изящна, так как метод 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); В итоге получается так: Однако, хотелось бы чего то подобного: Код (C++): printRus (6, 0, "Русские часы"); Ищу способ передачи строки в функцию таким способом с целью раздербавнивания ее внутри на буквы и коды ихние. Если кто знает, не таите, поделитесь.
После углубления в тему выяснилось, что проблема в кодировках, которые не совсем соответствуют друг другу в разных местах кода. В принципе все можно допилить, это потребует времени, но был бы смысл. Пока что вывести несколько русских слов на экран проще так как написано выше. Если надо, выложу код данных костылей.
Покурив тему с кодировками, удалось создать конвертор из двухбайтового UTF-8 в однобайтовую внутреннюю для сопоставления с матрицей символов, что позволило привести вывод строк к максимально понятному виду: Код (C++): byte montag[] = "понедельник"; // массив размером 23 байта - по два на символ + стоповый . . . printRuss(6, 0, montag, sizeof(montag)); Результат: Два вопроса к знатокам С++. Один простой, второй посложнее: 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 чтобы подкорректировать его под свои нужды?
Довел до состояния, которое меня устраивает. Переделывать библиотеку нет ни времени, ни желания, ни необходимости, сделал пока надстройку которая позволяет выводить любой текст включая русские, латинские буквы и знаки препинания. Причем, что я считаю очень удобным, что текст набирается в том виде в каком нужно прямо в окне IDE, без костылей типа "\208" и тп. Код примера выглядит так: Код (C++): printRusLat(0, 0, "Hello - привет"); printRusLat(0, 10, "World - мир"); printRusLat(0, 20, "все good!"); printRusLat(0, 30, "test пройден"); Результат на экране так:
Все таки перелопатил библиотеку от Adafruit, теперь она понимает по-русски. Пример имеется. Вариант тестовый, возможны глюки, надо проверять, но в таком виде работает хорошо. При компиляции примера возможны "кракозяблы", это нормально. См. пояснение в шапке примера.
Единственное над чем голову сломал, почему вывод русских букв иногда спрыгивает с UTF-8 сам собой на CP-1251 в результате чего на экране получается абракадабра. Быть такого не должно по идее, да и специально добиться не могу. Не понятно.
Кажется начинаю понимать, файл примера *.PDE не воспринимается компилятором как родной Ардуиновский и он корежит его кодировку, так что если в примере будет выводить на экран каракули - смело копипастим его в новый проект и все будет хорошо. ) Библиотеку обновил, чтобы было понятнее.
Обязательно. Но, к сожалению, нескоро. Недавно вышел из отпуска - работой завалили. Как только доберусь - обязательно отпишусь.
Касательно вывода текста. Проверил - работает. Чему безмерно рад. Ваша библиотека самая работающая, из найденных мною за неделю поисков. Не нашёл действенного способа вывода индексов и значка градуса. Рисовать попиксельно, или это всё-таки как-то возможно в данной библиотеке? Ибо второй пример. Тот, который рисует фигуры - выдаёт ошибку Спойлер: ошибка при загрузке 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))' ЧЯДНТ?
Т.е. редактировать сам шрифт? Объективно есть неиспользуемые символы. Хмм...а это может статься самый простой вариант. Отпишусь по результатам.
Сбылась мечта идиота - нашел РАБОТОСПОСОБНУЮ библиотеку для работы на Великом и Могучем... Благодарю, ostrov! Но, вот оказия..., перестал работать метод "setRotation" от одноименной библы (без rus) :-(( Может, что-то другое также перестало работать - не знаю, не проверял. Проверял Ваши библиотеки на готовом скетче, где на тот момент был кусок кода на переворот экрана.