Добавить в корзинуПозвонить
Найти в Дзене
Электроника и жизнь

Вывод русских букв на LED матрицу в Arduino IDE

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

Всем привет! В прошлой статье Вывод бегущей строки на светодиодную матрицу, я пропустил проблему, которая возникает при работе с национальными символами (в т.ч. с русскими буквами) в Arduino IDE. В этой статье хочу рассказать о возникающих сложностях при работе с кириллицей в среде Ардуино и предложить один из возможных вариантов решения. усские буквы на LED матрице 16x16 адресных светодиодов.

По-сути, строка является массивом символов размером в 1 байт. И к каждому символу строки мы можем обратиться как к элементу массива по индексу. Т.е. если у нас есть строка:

String str="ABC";

то,

str[0]=='A', str[1]=='B', str[2]=='C';

Очень важным моментом является то, что для работы со строками существует множество функций (поиск символа в строке, обрезка строки, сложение строк). В результате этого, иногда проще задавать информацию не виде классического массива, а виде строки.

Очень полезна функция для работы со строками indexOf(), которая возвращает позицию символа в строке.

Т.е. позиция символа "B" в нашей строке, равна единице.

str.indexOf('B') == 1

Собственно, таким образом, мы и определяли в прошлой статье индекс символа в массиве битового представления букв и цифр, который нужно вывести на LED матрицу.

С цифрами, символами и латинскими буквами проблем нет. А вот с русскими буквами ситуация сложнее.

Скетч 1. Вывод строки посимвольно
Скетч 1. Вывод строки посимвольно

Напишем небольшой скетч, в котором посимвольно будем выводить сначала цифры и латинские буквы, а потом русские буквы в монитор порта.

Монитор порта для скетча 1
Монитор порта для скетча 1

Цифры и латинские буквы выводятся правильно. А вместо русских букв, выводятся перевернутые знаки вопроса.

Дело в том, что Arduino IDE сохраняет код скетча в кодировке utf-8. И в дальнейшем, при компиляции, национальные символы (в т.ч. русские буквы) занимают в памяти не 1 байт, а 2. Таким образом, и функция length() для строки, содержащей русские символы, будет выдавать не количество символов в строке, а размер строки в байтах. Т.е. кол-во всех латинских букв, символов, цифр + удвоенное количество русских букв.

Скетч 2. Размер строки
Скетч 2. Размер строки

Монитор порта скетча 2
Монитор порта скетча 2

В Интернете много обсуждений по этому поводу. Кто-то предлагает преобразовывать символы в одну из однобитных кодировок во время выполнения скетча, кто-то предлагает менять кодировку самого скетча, а кто-то вообще отказаться от русских символов и довольствоваться латиницей.

Я решаю эту задачу немного другим путем. Видоизменяем наш скетч, выводя каждый символ строки в виде числового кода. Для этого, мы используем приведение значения к типу int - (int)text[i].

Скетч 3. Вывод числового значения каждого символа строки
Скетч 3. Вывод числового значения каждого символа строки

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

Монитор порта скетча 3
Монитор порта скетча 3

Зная это, включаем в наш скетч условие, что первое отрицательное значение указывает нам на то, что символ – это русская буква, а из второго значения, с помощью простой формулы, извлекаем нужный нам число – т.е. номер элемента массива с битовым представлением буквы.

n=112+int(text[i]);

Скетч 4. Вывод положения в строке латинских букв и цифр и номера русской буквы
Скетч 4. Вывод положения в строке латинских букв и цифр и номера русской буквы

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

Монитор порта скетча 4
Монитор порта скетча 4

В своем видео "Вывод текста на светодиодную матрицу", которое опубликовано в конце статьи я разбираю ситуацию с выводом русских символов на LED матрицу.

Спасибо, что дочитали до конца! Надеюсь, информация будет кому-нибудь полезна. Всем пока!

_________________________________________________________

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

Другие публикации по теме: