Вывод русских букв на LCD дисплей Arduino

Опубликовано 20.02.2016 23:05:47


Русские символы OLED Arduino

 

В данной статье мы рассмотрим как можно русифицировать библиотеку Adafruit_GFX. Статья основана на работе пользователя arduinec с форума arduino.ru
Хотите узнать, как использовать русские символы при работе с пиксельными LCD дисплеями на Arduino? Добро пожаловать под кат.

 


Основной и наиболее удобной библиотекой для работы с LCD пиксельными дисплеями является библиотека Adafruit GFX.
Данная библиотека чисто графическая, поэтому для работы с определенной моделью дисплея вместе с ней стоит использовать еще одну специализированную библиотеку.
Например, для Nokia 5110 дисплея это Adafruit-PCD8544, Для OLED 0.96" OLED 128x64 - Adafruit_SSD1306. Библиотеки для других моделей можно найти здесь (или здесь: список).

Итак, вы подключили свой дисплей, в скетче добавили две библиотеки, о которых шла речь выше и пробуете вывести русские буквы. Но вот незадача - вместо них ваш дисплей отображает всякие кракозябры. Это происходит потому, что в библиотеках от Adafruit нет русского шрифта. Добавить его совсем не сложно. Нужно заменить в файле glcdfont.c из библиотеки Adafruit GFX определенные символы на русские в нужной кодировке. Однако, шрифт рассчитан на однобайтную кодировку букв, а Arduino IDE использует для русских букв двухбайтовую UTF-8,

В русской кодировке UTF-8 прослеживается определенная закономерность, которая позволяет нехитрым образом преобразовывать из UTF-8 в однобайтовую русскую кодировку Windows-1251, которая и была выбрана для замены букв.

Функция utf8rus() получает исходную строку, символы с кодами 0x00-0xBF пропускает без изменения в выходную строку, а в оставшихся кодах отбирает русские буквы и перекодирует их.

 
Функция перекодировки русских букв из UTF-8 в Win-1251
/* Recode russian fonts from UTF-8 to Windows-1251 */
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 + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

 

Таким образом, для русификации вашего дисплея необходимо:
- скачать любой из приведённых ниже (или выше) архивов;
- заменить файл glcdfont.c в Adafruit-GFX на вот этот;
- добавить функцию utf8rus() в скетч;
- вставить в начале скетча команду: display.cp437(true);

Применять функцию utf8rus() можно внутри команд печати строк:
display.println(utf8rus("Тест"));
 


Примеры для разных дисплеев

 
Nokia 5110 (PCD8544)
 
2.8" TFT Touch Shield 320x240
 
0.96" OLED 128x64

 


А как же комментарии?