Всем здравствуйте, я нашел скетч в интернете для вывода русских букв на мою матрицу. Русские буквы у меня шли, только не те которые были нужны. Пример: ВОВА->ГБГП. Почему именно так ? Вот скетч. Код (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); } }
У меня была такая же ситуация . Версия библиотеки 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; }
ой блин.... умельцы... версий библиотеки у них много... Ребята, прежде чем выдумывать свои рецепты решения несуществующей проблемы. прочитайте в интернете какую-нибудь статью на тему что такое кодировка и какие бывают кодировки кириллицы.
В среде Arduino IDE больше 50 версий библиотеки Adafruit_GFX. И не каждая подходит под String utf8rus приведенный выше. Но когда выдается кирилицей слово ЕПН , то, на мой взгляд виновата не кодировка. Если сместить на одну позицию каждую букву , то получиться слово ДОМ, то что и было нужно. Вот это меня навело на мысль что произошло смещение по адресам кирилицы. Обычно, если не подходит кодировка выдается какая то абракадабра,
не пишите ерунды. Вы в принципе не понимаете, откуда берется проблема. Это не "50 версий библиотеки", это куча комбинаций функции utf8rus и кодировки фонтов, причем и то и другое к самой библиотеке Adafruit_GFX не имеет никакого отношения.
А Вы попробуйте текст "ВОВА" выводить в ASCII а не в UTF-8/16 и WINDOWS-1251. И посмотрите кодировку как тут сказали. А то не ясно ни шиша. В конце-концов переройте библиотеку - там всё ясно.
В менеджере библиотек ARDUINO IDE есть библиотека Adafruit GFX Library. Если подвести к нему указатель мышки, то высвечивается транспорант <ВЫЕРИТЕ ВЕРСИЮ> Вот откуда появились слова " 50 версий библиотеки" Я не спорю с вашим теоретическим обоснованием функции utf8rus Я недавно начал заниматься Ардуино и вообще программированием не занимался. Скачал скетч бегущей строки, собрал схему, Русский язык не пошел. Поискал в инете , нашел предположение, что может виновата библиотека. Начал подбирать версии, Нарваля сначала на кирилицу, но буквы не те, что нужно, а потом поймал нужную мне версию, Вопрос Vladimir75Rus очень подходил на мою проблему. Поэтому я и написал, что я сделал. Ни какие кодировки я не менял.