Русификация библиотеки Adafruit-GFX и вывод русских букв на дисплей в кодировке UTF-8 из Arduino IDE

arduinec
Offline
Зарегистрирован: 01.09.2015

Краткие итоги предыдущих 350 постов

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

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

В архивах примеры и библиотеки, различающиеся по виду дисплея:

0.96" OLED 128x64
https://yadi.sk/d/dd7ULuRftVcRV

2.8" TFT Touch Shield 320x240
https://yadi.sk/d/FgUr5NPztVcRd

Nokia 5110 84x48
https://yadi.sk/d/juZ_mZbfsTpez

Более подробная информация в предыдущих постах.
Например:
В посте 27 демонстрируется скетч, с помощью которого можно редактировать шрифты (в том числе и в glcdfont.c).
В посте 40 приводится вариант utf8rus() с экономным использованием оперативной памяти.
В посте 46 показан 2.8" TFT Touch Shield для Uno и Mega, и прилагается полный набор библиотек и примеров для него.
В посте 80 описаны изменения в шрифте для проекта Transistor Tester (http://arduino.ru/forum/proekty/transistor-tester-arduino).

b707
Offline
Зарегистрирован: 26.05.2017

7am пишет:

так вот, с другими библиотеками все норм, вот прмиер

OLED_I2C

iarduino_OLED.h

по горизонтали нет осттупов, будто текст в полосках как тут 
 

Это зависит от фонта. Поменяйте фонт или вставьте отступы сами, проблем-то

arduinec
Offline
Зарегистрирован: 01.09.2015

7am пишет:

по горизонтали нет осттупов, будто текст в полосках как тут

В библиотеке Adafruit_SSD1306.h дисплей подключен как 128x64 или 128x32?

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

arduinec пишет:

7am пишет:

по горизонтали нет осттупов, будто текст в полосках как тут

В библиотеке Adafruit_SSD1306.h дисплей подключен как 128x64 или 128x32?

по умолчанию 32 было раскомменитровал на 64 все норм

 

#define SSD1306_I2C_ADDRESS   0x3C  // 011110+SA0+RW - 0x3C or 0x3D
// Address for 128x32 is 0x3C
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)

/*=========================================================================
    SSD1306 Displays
    -----------------------------------------------------------------------
    The driver is used in multiple displays (128x64, 128x32, etc.).
    Select the appropriate display below to create an appropriately
    sized framebuffer, etc.

    SSD1306_128_64  128x64 pixel display

    SSD1306_128_32  128x32 pixel display

    SSD1306_96_16

    -----------------------------------------------------------------------*/
  #define SSD1306_128_64 -------------------------------------- тут
  // #define SSD1306_128_32
//   #define SSD1306_96_16

 

arduinec
Offline
Зарегистрирован: 01.09.2015

7am пишет:

arduinec пишет:

В библиотеке Adafruit_SSD1306.h дисплей подключен как 128x64 или 128x32?

по умолчанию 32 было раскомменитровал на 64 все норм

Ну вот ларчик просто открывался, нужно было только задать правильный вопрос:
http://arduino.ru/forum/otvlechennye-temy/robert-shekli-vernyi-vopros

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

arduinec пишет:

7am пишет:

arduinec пишет:

В библиотеке Adafruit_SSD1306.h дисплей подключен как 128x64 или 128x32?

по умолчанию 32 было раскомменитровал на 64 все норм

Ну вот ларчик просто открывался, нужно было только задать правильный вопрос:
http://arduino.ru/forum/otvlechennye-temy/robert-shekli-vernyi-vopros

можно ли как то перековырять библиотеку по сути из функционала нужны русские буквы да отрисовка батареи, по сути оптимизировать бы чтобы хоть как то уменьшить поедание ОЗУ

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Озу жрет не либа, а шрифт и цвет, их можно уменьшить, как? Читайте чуть выше.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

pilnikov пишет:
Озу жрет не либа, а шрифт и цвет, их можно уменьшить, как? Читайте чуть выше.

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

arduinec
Offline
Зарегистрирован: 01.09.2015

7am пишет:

озу жрет скорее буфер 

В библиотеке Adafruit_SSD1306 оперативная память расходуется на буфер. На форуме есть библиотека для OLED-дисплея без буфера.

Michael74Rus
Offline
Зарегистрирован: 23.05.2018

В моем проекте используется экран SH1106 1,3"  и ESP8266, версия Arduino IDE 1.8.1. Библиотека для экрана взята отсюда https://github.com/rene-mt/esp8266-oled-sh1106. Шрифты в данной библиотеке хранятся в файле SH1106Fonts.h. Добавил русские символы в шрифт, они также как и в библиотеке Adafruit GFX идут с кода 192 (0xC0) по 255 (0xFF). Использовал функцию из первого поста. Иногда выводит один русский символ из набора, а чаще всего ничего не выводит. С английскими буквами работает отлично. Похоже, что где-то Arduino IDE неверно выдает кодировку. Если в код вставить напрямую символы, которые в шрифте имеют русские буквы, то на экран все выводится. Ниже покажу код, что имею ввиду. (лишнее убрал, чтоб не мешалось)

#include "SH1106.h"
#include "SH1106Ui.h"

bool drawFrame1(SH1106 *display, SH1106UiState* state, int x, int y) {
  display->setTextAlignment(TEXT_ALIGN_CENTER);
  display->setFont(ArialMT_Plain_10);
  display->drawString(64 + x, 0 + y, "АБВГабвг");  //ничего не выводит, это понятно
  display->drawString(64 + x, 10 + y, "ÀÁÂÃàáâã"); //выводит русские АБВГабвг, символы вставил из блокнота
  display->drawString(64 + x, 20 + y, (utf8rus("TESTtest"))); //выводит, то есть функция с английскими буквами работает
  display->drawString(64 + x, 30 + y, (utf8rus("АБВГабвг"))); //выводит букву Г, то есть функция как то сработало, но если указать только букву Г, то пусто

 

 

 

 

arduinec
Offline
Зарегистрирован: 01.09.2015

Michael74Rus пишет:

В моем проекте используется экран SH1106 1,3"  и ESP8266, версия Arduino IDE 1.8.1. Библиотека для экрана взята отсюда https://github.com/rene-mt/esp8266-oled-sh1106. Шрифты в данной библиотеке хранятся в файле SH1106Fonts.h. Добавил русские символы в шрифт, они также как и в библиотеке Adafruit GFX идут с кода 192 (0xC0) по 255 (0xFF). Использовал функцию из первого поста. Иногда выводит один русский символ из набора, а чаще всего ничего не выводит. С английскими буквами работает отлично. Похоже, что где-то Arduino IDE неверно выдает кодировку. Если в код вставить напрямую символы, которые в шрифте имеют русские буквы, то на экран все выводится.

В данной теме описано как русифицировать библиотеку Adafruit-GFX. Русифицировать все остальные имеющиеся в Интернете библиотеки мне лень.

P.S. Минутный поиск в Интернете (ну почему новички не умеют искать?) привёл к библиотеке, работающей с Adafruit-GFX: https://github.com/wonho-maker/Adafruit_SH1106

Michael74Rus
Offline
Зарегистрирован: 23.05.2018
Тут по сути разницы нет какая библиотека. Используя функцию Utf8rus мы передаем на дисплей адреса символов в кодировке Win1251 из Ide с кодировкой UTF8. Или я что-то не догоняю?
UTF8        "АБВГабвг";  //Коды 410, 411, 412, 413, 430, 431, 432, 433
             ||||||||
Win1251     "ÀÁÂÃàáâã"; //Коды C0, C1, C2, C3, E0, E1, E2, E3

 

 

arduinec
Offline
Зарегистрирован: 01.09.2015

Michael74Rus пишет:

Тут по сути разницы нет какая библиотека. Используя функцию Utf8rus мы передаем на дисплей адреса символов в кодировке Win1251 из Ide с кодировкой UTF8

Функция utf8rus() только перекодирует, а на дисплей передаёт библиотека, и от того как она это делает и зависит отображение символов.

mrdmoroz
Offline
Зарегистрирован: 20.09.2018

И так мне не очень хотелось через процедуру отдельную конвертировать UTF адаптировал Adafruit:

Файл:  Adafruit_CFX.cpp

size_t Adafruit_GFX::write(uint8_t c) {
    if(!gfxFont) { // 'Classic' built-in font
	if(c_old != 0) {                                          /// < начало кода здесь.
		switch (c_old) {
			case 0xD0: {
				if (c == 0x81) {c = 0xA8; break; }
				if (c >= 0x90 && c <= 0xBF) c = c + 0x30;
				break;
			}
			case 0xD1: {
				if (c == 0x91) {c = 0xB8; break; }
				if (c >= 0x80 && c <= 0x8F) c = c + 0x70;
				break;
			}
		}
	} else if(c >= 0xC0) {
		switch (c) {
			case 0xD0:case 0xD1:
				c_old=c;
				c='\r';
				break;
		}
	}                                                     /// < Конец кода здесь.
        if(c == '\n') {                        // Newline?
            cursor_x  = 0;                     // Reset x to zero,
            cursor_y += textsize * 8;          // advance y one line
        } else if(c != '\r') {                 // Ignore carriage returns
            if(wrap && ((cursor_x + textsize * 6) > _width)) { // Off right?
                cursor_x  = 0;                 // Reset x to zero,
                cursor_y += textsize * 8;      // advance y one line
            }
            drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
	    c_old=0;                           // ЕЩЕ ТУТ ОБНУЛЯТЬ ПРИХОДИТСЯ!!!
            cursor_x += textsize * 6;          // Advance x one char
        }

    } else { // Custom font

        if(c == '\n') {
            cursor_x  = 0;
            cursor_y += (int16_t)textsize *
                        (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
        } else if(c != '\r') {
            uint8_t first = pgm_read_byte(&gfxFont->first);
            if((c >= first) && (c <= (uint8_t)pgm_read_byte(&gfxFont->last))) {
                GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
                  &gfxFont->glyph))[c - first]);
                uint8_t   w     = pgm_read_byte(&glyph->width),
                          h     = pgm_read_byte(&glyph->height);
                if((w > 0) && (h > 0)) { // Is there an associated bitmap?
                    int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic
                    if(wrap && ((cursor_x + textsize * (xo + w)) > _width)) {
                        cursor_x  = 0;
                        cursor_y += (int16_t)textsize *
                          (uint8_t)pgm_read_byte(&gfxFont->yAdvance);
                    }
                    drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
                }
                cursor_x += (uint8_t)pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize;
            }
        }

    }
    return 1;
}

Файл: Adafruit_CFX.h

  uint8_t
    c_old,           ///< Сюда добавил.
    textsize,       ///< Desired magnification of text to print()
    rotation;       ///< Display rotation (0 thru 3)

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

Werewolf
Offline
Зарегистрирован: 06.01.2016

Коллеги, здравствуйте.

Есть проблема:

Имею дисплей на ILI9225. согласно рекомендациям расширил стандарный шрифт библиотеки дисплея Terminal11x16 символами с кириллицей согласно кодировке UTF-8. Шрифты генерил в GLCD Font creator:

fontdatatype Terminal11x16[] PROGMEM = {
        0x0B, 0x10, 0x20, 0xA0,
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char   (32)
        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xFF, 0x33, 0xFF, 0x33, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x08, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0x0B, 0x00, 0x02, 0x10, 0x1E, 0x90, 0x1F, 0xF0, 0x03, 0x7E, 0x02, 0x1E, 0x1E, 0x90, 0x1F, 0xF0, 0x03, 0x7E, 0x02, 0x1E, 0x00, 0x10, 0x00,  // Code for char #
        0x09, 0x00, 0x00, 0x78, 0x04, 0xFC, 0x0C, 0xCC, 0x0C, 0xFF, 0x3F, 0xFF, 0x3F, 0xCC, 0x0C, 0xCC, 0x0F, 0x88, 0x07, 0x00, 0x00, 0x00, 0x00,  // Code for char $
        0x0B, 0x00, 0x30, 0x38, 0x38, 0x38, 0x1C, 0x38, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x38, 0x70, 0x38, 0x38, 0x38, 0x1C, 0x00,  // Code for char %
        0x0A, 0x00, 0x00, 0x00, 0x1F, 0xB8, 0x3F, 0xFC, 0x31, 0xC6, 0x21, 0xE2, 0x37, 0x3E, 0x1E, 0x1C, 0x1C, 0x00, 0x36, 0x00, 0x22, 0x00, 0x00,  // Code for char &
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x08, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xFC, 0x0F, 0xFE, 0x1F, 0x07, 0x38, 0x01, 0x20, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x20, 0x07, 0x38, 0xFE, 0x1F, 0xFC, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x09, 0x00, 0x00, 0x98, 0x0C, 0xB8, 0x0E, 0xE0, 0x03, 0xF8, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xB8, 0x0E, 0x98, 0x0C, 0x00, 0x00, 0x00, 0x00,  // Code for char *
        0x09, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF0, 0x0F, 0xF0, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char +
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x09, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char -
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x0B, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00,  // Code for char /
        0x0B, 0xF8, 0x07, 0xFE, 0x1F, 0x06, 0x1E, 0x03, 0x33, 0x83, 0x31, 0xC3, 0x30, 0x63, 0x30, 0x33, 0x30, 0x1E, 0x18, 0xFE, 0x1F, 0xF8, 0x07,  // Code for char 0
        0x0A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x30, 0x0C, 0x30, 0x0E, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00,  // Code for char 1
        0x0B, 0x1C, 0x30, 0x1E, 0x38, 0x07, 0x3C, 0x03, 0x3E, 0x03, 0x37, 0x83, 0x33, 0xC3, 0x31, 0xE3, 0x30, 0x77, 0x30, 0x3E, 0x30, 0x1C, 0x30,  // Code for char 2
        0x0B, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x39, 0x7E, 0x1F, 0x3C, 0x0E,  // Code for char 3
        0x0B, 0xC0, 0x03, 0xE0, 0x03, 0x70, 0x03, 0x38, 0x03, 0x1C, 0x03, 0x0E, 0x03, 0x07, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x00, 0x03,  // Code for char 4
        0x0B, 0x3F, 0x0C, 0x7F, 0x1C, 0x63, 0x38, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0x63, 0x30, 0xE3, 0x38, 0xC3, 0x1F, 0x83, 0x0F,  // Code for char 5
        0x0B, 0xC0, 0x0F, 0xF0, 0x1F, 0xF8, 0x39, 0xDC, 0x30, 0xCE, 0x30, 0xC7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x39, 0x80, 0x1F, 0x00, 0x0F,  // Code for char 6
        0x0B, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x30, 0x03, 0x3C, 0x03, 0x0F, 0xC3, 0x03, 0xF3, 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x03, 0x00,  // Code for char 7
        0x0B, 0x00, 0x0F, 0xBC, 0x1F, 0xFE, 0x39, 0xE7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x30, 0xFE, 0x39, 0xBC, 0x1F, 0x00, 0x0F,  // Code for char 8
        0x0B, 0x3C, 0x00, 0x7E, 0x00, 0xE7, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x38, 0xC3, 0x1C, 0xC3, 0x0E, 0xE7, 0x07, 0xFE, 0x03, 0xFC, 0x00,  // Code for char 9
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1C, 0x70, 0x1C, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x9C, 0x70, 0xFC, 0x70, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x09, 0x00, 0x00, 0xC0, 0x00, 0xE0, 0x01, 0xF0, 0x03, 0x38, 0x07, 0x1C, 0x0E, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00,  // Code for char <
        0x0A, 0x00, 0x00, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x00, 0x00,  // Code for char =
        0x09, 0x00, 0x00, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xE0, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char >
        0x0A, 0x1C, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0x00, 0x83, 0x37, 0xC3, 0x37, 0xE3, 0x00, 0x77, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,  // Code for char ?
        0x0B, 0xF8, 0x0F, 0xFE, 0x1F, 0x07, 0x18, 0xF3, 0x33, 0xFB, 0x37, 0x1B, 0x36, 0xFB, 0x37, 0xFB, 0x37, 0x07, 0x36, 0xFE, 0x03, 0xF8, 0x01,  // Code for char @
        0x0A, 0x00, 0x38, 0x00, 0x3F, 0xE0, 0x07, 0xFC, 0x06, 0x1F, 0x06, 0x1F, 0x06, 0xFC, 0x06, 0xE0, 0x07, 0x00, 0x3F, 0x00, 0x38, 0x00, 0x00,  // Code for char A
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xE7, 0x30, 0xFE, 0x39, 0xBC, 0x1F, 0x00, 0x0F, 0x00, 0x00,  // Code for char B
        0x0A, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C, 0x00, 0x00,  // Code for char C
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0xFC, 0x0F, 0xF0, 0x03, 0x00, 0x00,  // Code for char D
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00,  // Code for char E
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,  // Code for char F
        0x0A, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC7, 0x3F, 0xC6, 0x3F, 0x00, 0x00,  // Code for char G
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00,  // Code for char H
        0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char I
        0x0A, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0xFF, 0x1F, 0xFF, 0x07, 0x00, 0x00,  // Code for char J
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xE0, 0x01, 0xF0, 0x03, 0x38, 0x07, 0x1C, 0x0E, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x00, 0x00,  // Code for char K
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00,  // Code for char L
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0x78, 0x00, 0x1E, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00,  // Code for char M
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x0E, 0x00, 0x38, 0x00, 0xF0, 0x00, 0xC0, 0x03, 0x00, 0x07, 0x00, 0x1C, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00,  // Code for char N
        0x0A, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x30, 0x07, 0x38, 0x0E, 0x1C, 0xFC, 0x0F, 0xF0, 0x03, 0x00, 0x00,  // Code for char O
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0x83, 0x01, 0xC7, 0x01, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00,  // Code for char P
        0x0A, 0xF0, 0x03, 0xFC, 0x0F, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x03, 0x36, 0x07, 0x3E, 0x0E, 0x1C, 0xFC, 0x3F, 0xF0, 0x33, 0x00, 0x00,  // Code for char Q
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x83, 0x01, 0x83, 0x01, 0x83, 0x03, 0x83, 0x07, 0x83, 0x0F, 0xC7, 0x1D, 0xFE, 0x38, 0x7C, 0x30, 0x00, 0x00,  // Code for char R
        0x0A, 0x3C, 0x0C, 0x7E, 0x1C, 0xE7, 0x38, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC7, 0x39, 0x8E, 0x1F, 0x0C, 0x0F, 0x00, 0x00,  // Code for char S
        0x09, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char T
        0x0A, 0xFF, 0x07, 0xFF, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0xFF, 0x1F, 0xFF, 0x07, 0x00, 0x00,  // Code for char U
        0x0A, 0x07, 0x00, 0x3F, 0x00, 0xF8, 0x01, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x3E, 0xC0, 0x0F, 0xF8, 0x01, 0x3F, 0x00, 0x07, 0x00, 0x00, 0x00,  // Code for char V
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x1C, 0x00, 0x06, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x1C, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00,  // Code for char W
        0x0A, 0x03, 0x30, 0x0F, 0x3C, 0x1C, 0x0E, 0x30, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0x30, 0x03, 0x1C, 0x0E, 0x0F, 0x3C, 0x03, 0x30, 0x00, 0x00,  // Code for char X
        0x0A, 0x03, 0x00, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00,  // Code for char Y
        0x0A, 0x03, 0x30, 0x03, 0x3C, 0x03, 0x3E, 0x03, 0x33, 0xC3, 0x31, 0xE3, 0x30, 0x33, 0x30, 0x1F, 0x30, 0x0F, 0x30, 0x03, 0x30, 0x00, 0x00,  // Code for char Z
        0x08, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
        0x0B, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x18,  // Code for char BackSlash
        0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
        0x0B, 0x60, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00,  // Code for char ^
        0x0B, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0,  // Code for char _
        0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x7E, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
        0x0A, 0x00, 0x1C, 0x40, 0x3E, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x3F, 0x00, 0x00,  // Code for char a
        0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x00,  // Code for char b
        0x0A, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x18, 0x80, 0x08, 0x00, 0x00,  // Code for char c
        0x0A, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x30, 0xC0, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00,  // Code for char d (100)
        0x0A, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x3B, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0xC0, 0x13, 0x80, 0x01, 0x00, 0x00,  // Code for char e
        0x08, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x3F, 0xFE, 0x3F, 0xC7, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
        0x0A, 0x80, 0x03, 0xC0, 0xC7, 0xE0, 0xCE, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xCC, 0x60, 0xE6, 0xE0, 0x7F, 0xE0, 0x3F, 0x00, 0x00,  // Code for char g
        0x09, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00,  // Code for char h
        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x30, 0xEC, 0x3F, 0xEC, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x60, 0xC0, 0xEC, 0xFF, 0xEC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
        0x09, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1C, 0x60, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,  // Code for char k
        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
        0x0A, 0xE0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F, 0x00, 0x00,  // Code for char m
        0x0A, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x3F, 0x80, 0x3F, 0x00, 0x00,  // Code for char n
        0x0A, 0x80, 0x0F, 0xC0, 0x1F, 0xE0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x00,  // Code for char o
        0x0A, 0xE0, 0xFF, 0xE0, 0xFF, 0x60, 0x0C, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0xE0, 0x1C, 0xC0, 0x0F, 0x80, 0x07, 0x00, 0x00,  // Code for char p
        0x0A, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1C, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x0C, 0xE0, 0xFF, 0xE0, 0xFF, 0x00, 0x00,  // Code for char q
        0x0A, 0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x3F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00,  // Code for char r
        0x08, 0xC0, 0x11, 0xE0, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x33, 0x60, 0x3F, 0x40, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char s
        0x08, 0x60, 0x00, 0x60, 0x00, 0xFE, 0x1F, 0xFE, 0x3F, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
        0x0A, 0xE0, 0x0F, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0xE0, 0x3F, 0xE0, 0x3F, 0x00, 0x00,  // Code for char u
        0x0A, 0x60, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x38, 0x00, 0x1E, 0x80, 0x07, 0xE0, 0x01, 0x60, 0x00, 0x00, 0x00,  // Code for char v
        0x0A, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x38, 0x00, 0x1C, 0xE0, 0x0F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0xE0, 0x1F, 0xE0, 0x07, 0x00, 0x00,  // Code for char w
        0x09, 0x60, 0x30, 0xE0, 0x38, 0xC0, 0x1D, 0x80, 0x0F, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x1D, 0xE0, 0x38, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,  // Code for char x (120)
        0x09, 0x00, 0x00, 0x60, 0x00, 0xE0, 0x81, 0x80, 0xE7, 0x00, 0x7E, 0x00, 0x1E, 0x80, 0x07, 0xE0, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char y
        0x09, 0x60, 0x30, 0x60, 0x38, 0x60, 0x3C, 0x60, 0x36, 0x60, 0x33, 0xE0, 0x31, 0xE0, 0x30, 0x60, 0x30, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00,  // Code for char z
        0x09, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x01, 0xFC, 0x1F, 0x7E, 0x3F, 0x07, 0x70, 0x03, 0x60, 0x03, 0x60, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00,  // Code for char {
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
        0x09, 0x00, 0x00, 0x03, 0x60, 0x03, 0x60, 0x03, 0x60, 0x07, 0x70, 0x7E, 0x3F, 0xFC, 0x1F, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
        0x0A, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, 0x00,  // Code for char ~
	0x0A, 0x00, 0x0F, 0x80, 0x0F, 0xC0, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x0C, 0xC0, 0x0C, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x00,  // Code for char  (127)
        0x07, 0xE0, 0xFF, 0x40, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x40, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char р (128-240)
        0x06, 0x80, 0x07, 0x40, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char с
        0x07, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x1F, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char т
        0x07, 0x60, 0x00, 0x80, 0x03, 0x00, 0xCC, 0x00, 0x30, 0x00, 0x0C, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char у
        0x0B, 0x80, 0x07, 0x40, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0xFE, 0xFF, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x40, 0x08, 0x80, 0x07,  // Code for char ф
        0x07, 0x20, 0x10, 0x40, 0x08, 0x80, 0x04, 0x00, 0x03, 0x80, 0x04, 0x40, 0x08, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char х
        0x08, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ц
        0x07, 0xE0, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ч
        0x0B, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xE0, 0x1F,  // Code for char ш
        0x0B, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xE0, 0x1F, 0x00, 0x10, 0x00, 0x70,  // Code for char щ
        0x09, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00,  // Code for char Ъ
        0x0A, 0xE0, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00,  // Code for char ы
        0x07, 0xE0, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ь
        0x06, 0x40, 0x08, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x40, 0x09, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char э
        0x0B, 0xE0, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x80, 0x07, 0x40, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x40, 0x08, 0x80, 0x07,  // Code for char ю
        0x07, 0xC0, 0x11, 0x20, 0x0A, 0x20, 0x06, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char я (143-255)
        0x0A, 0x00, 0x18, 0x00, 0x07, 0xC0, 0x02, 0x38, 0x02, 0x04, 0x02, 0x04, 0x02, 0x38, 0x02, 0xC0, 0x02, 0x00, 0x07, 0x00, 0x18, 0x00, 0x00,  // Code for char A (144-192)
        0x08, 0xFC, 0x1F, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x84, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Б
        0x08, 0xFC, 0x1F, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0xB8, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char В
        0x08, 0xFC, 0x1F, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Г
        0x0A, 0x00, 0x70, 0x00, 0x18, 0x00, 0x17, 0xFC, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0xFC, 0x1F, 0x00, 0x70, 0x00, 0x00,  // Code for char Д
        0x07, 0xFC, 0x1F, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Е
        0x0B, 0x0C, 0x18, 0x10, 0x04, 0x20, 0x02, 0x40, 0x01, 0x80, 0x00, 0xFC, 0x1F, 0x80, 0x00, 0x40, 0x01, 0x20, 0x02, 0x10, 0x04, 0x0C, 0x18,  // Code for char Ж
        0x07, 0x08, 0x08, 0x04, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0xA4, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char З
        0x09, 0xFC, 0x1F, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, 0x10, 0x00, 0x08, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char И
        0x09, 0xFC, 0x1F, 0x00, 0x08, 0x00, 0x04, 0x01, 0x03, 0x81, 0x00, 0x61, 0x00, 0x10, 0x00, 0x08, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char Й
        0x08, 0xFC, 0x1F, 0x80, 0x00, 0x80, 0x00, 0x60, 0x01, 0x18, 0x02, 0x04, 0x04, 0x04, 0x08, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char К
        0x0A, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0C, 0xFC, 0x03, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x1F, 0x00, 0x00,  // Code for char Л
        0x0B, 0xFC, 0x1F, 0x04, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x06, 0x80, 0x01, 0x60, 0x00, 0x18, 0x00, 0x04, 0x00, 0xFC, 0x1F,  // Code for char М
        0x09, 0xFC, 0x1F, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char Н
        0x0A, 0xE0, 0x03, 0x18, 0x0C, 0x08, 0x08, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x08, 0x08, 0x18, 0x0C, 0xE0, 0x03, 0x00, 0x00,  // Code for char О
        0x09, 0xFC, 0x1F, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char П
        0x08, 0xFC, 0x1F, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Р
        0x09, 0xE0, 0x03, 0x18, 0x0C, 0x08, 0x08, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x08, 0x08, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,  // Code for char С
        0x09, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x1F, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Т
        0x08, 0x0C, 0x10, 0x30, 0x10, 0xC0, 0x10, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char У
        0x0B, 0xC0, 0x01, 0x30, 0x06, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0xFC, 0x1F, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0x30, 0x06, 0xC0, 0x01,  // Code for char Ф
        0x08, 0x04, 0x10, 0x18, 0x0C, 0x20, 0x02, 0xC0, 0x01, 0xC0, 0x01, 0x20, 0x02, 0x18, 0x0C, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Х
        0x09, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x1F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,  // Code for char Ц
        0x09, 0x7C, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char Ч
        0x0B, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x1F,  // Code for char Ш
        0x0B, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x1F, 0x00, 0x10, 0x00, 0x70,  // Code for char Щ
        0x0B, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x1F, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x80, 0x08, 0x00, 0x07,  // Code for char Ъ
        0x0A, 0xFC, 0x1F, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x80, 0x08, 0x00, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00,  // Code for char Ы
        0x08, 0xFC, 0x1F, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x80, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Ь
        0x09, 0x08, 0x08, 0x04, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x44, 0x10, 0x48, 0x08, 0x58, 0x0C, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00,  // Code for char Э
        0x0B, 0xFC, 0x1F, 0x80, 0x00, 0x80, 0x00, 0xE0, 0x03, 0x18, 0x0C, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x18, 0x0C, 0xE0, 0x03,  // Code for char Ю
        0x09, 0x00, 0x10, 0x70, 0x08, 0x88, 0x04, 0x04, 0x03, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char Я (175-223)
        0x07, 0x00, 0x0E, 0x40, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x09, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char а (176-224)
        0x07, 0xF0, 0x07, 0x48, 0x08, 0x24, 0x10, 0x22, 0x10, 0x22, 0x10, 0x42, 0x08, 0x82, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char б
        0x07, 0xE0, 0x1F, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char в
        0x06, 0xE0, 0x1F, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char г
        0x08, 0x00, 0x70, 0x00, 0x1C, 0xE0, 0x13, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char д
        0x07, 0x80, 0x07, 0x40, 0x09, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x40, 0x11, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char е
        0x0B, 0x20, 0x10, 0x20, 0x08, 0x40, 0x04, 0x80, 0x02, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x20, 0x10,  // Code for char ж
        0x06, 0x40, 0x08, 0x20, 0x10, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char з
        0x07, 0xE0, 0x1F, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x40, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char и
        0x07, 0xE0, 0x1F, 0x04, 0x04, 0x08, 0x02, 0x08, 0x01, 0x88, 0x00, 0x44, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char й
        0x07, 0xE0, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char к
        0x07, 0x00, 0x10, 0xE0, 0x0F, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char л
        0x08, 0xE0, 0x1F, 0x40, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x03, 0x80, 0x00, 0x40, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char м
        0x07, 0xE0, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char н
        0x08, 0x80, 0x07, 0x40, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x40, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char о
        0x07, 0xE0, 0x1F, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char п (191-239)
        };

При выводе на дисплей к русским буквам добавляется спереди какой-то символ, к примеру строка "АБВГДЕабвгде" отображается так: 

В чем может быть проблема?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Уже вроде всё обсудили. Смотри ранние посты.

Проблема в кодировке, если точнее то как раз в кирилице.

Для её кодировки необходимо не 1, а 2 байта на символ. Вот первый и выводится.

Его нужно отсечь. Это воплотили, как минимум двумя способами.

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

Второй способ расписан в посте №322

AlexTVR
Offline
Зарегистрирован: 06.10.2018

Русифицировал библиотеку, как указано на сайте.

Попытался вывести строчку в протеусе.

В Протеусе выводит загогулины вместо русских букв. Нокиа5110, протеус 8.6.

Скетч:

 
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
 
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
 
void setup() {
 
  // put your setup code here, to run once:
    display.begin();
    display.cp437(true);
    display.clearDisplay();
    display.display();
    
    display.setContrast(50); // установка контраста
    delay(1000);
    display.setTextSize(1);  // установка размера шрифта
    display.setTextColor(BLACK); // установка цвета текста
    display.setCursor(0,0); // установка позиции курсора
  
    
    display.println(utf8rus("Тест"));
    display.display();
}
 
String utf8rus(String source)
{..........
arduinec
Offline
Зарегистрирован: 01.09.2015

Werewolf пишет:

При выводе на дисплей к русским буквам добавляется спереди какой-то символ

В чем может быть проблема?

В невнимательном прочтении нулевого поста данной темы.

arduinec
Offline
Зарегистрирован: 01.09.2015

AlexTVR пишет:

В Протеусе выводит загогулины вместо русских букв. Нокиа5110, протеус 8.6.

Протеус у меня не установлен, а на дисплее всё работает.

Werewolf
Offline
Зарегистрирован: 06.01.2016

Да, действительно. сразу не въехал. Внедрил функцию utft8rus (без переброса кодов символов, т.к. у меня буквы в нужном порядке) и все заработало.

Нечеловеческое спасибо автору!

Werewolf
Offline
Зарегистрирован: 06.01.2016

Да, действительно. сразу не въехал. Внедрил функцию utft8rus (без переброса кодов символов, т.к. у меня буквы в нужном порядке) и все заработало.

Нечеловеческое спасибо автору!

AlexTVR
Offline
Зарегистрирован: 06.10.2018

Добрый день! Русифицировал, как указано на сайте. OLED 0.91 выводит все русские буквы со сдвигом на одну букву - вместо А - выводит Б, ..., вместо Ю - выводит Я. Где поправить?

AlexTVR
Offline
Зарегистрирован: 06.10.2018

Добрый день! Русифицировал, как указано на сайте. OLED 0.91 выводит все русские буквы со сдвигом на одну букву - вместо А - выводит Б, ..., вместо Ю - выводит Я. Где поправить?

arduinec
Offline
Зарегистрирован: 01.09.2015

AlexTVR пишет:

Добрый день! Русифицировал, как указано на сайте. OLED 0.91 выводит все русские буквы со сдвигом на одну букву - вместо А - выводит Б, ..., вместо Ю - выводит Я. Где поправить?

Скорее всего решение данной проблемы описано в посте #15 (http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...).

AlexTVR
Offline
Зарегистрирован: 06.10.2018

Поменял две строчки кода в utf8rus и все заработало, как надо.

if (n >= 0x90 && n <= 0xBF) n = n-1 + 0x30;

 if (n >= 0x80 && n <= 0x8F) n = n-1 + 0x70;

arduinec
Offline
Зарегистрирован: 01.09.2015

AlexTVR пишет:

Поменял две строчки кода в utf8rus

А display.cp437(true); до этого не решил проблему?

AlexTVR
Offline
Зарегистрирован: 06.10.2018

arduinec пишет:

AlexTVR пишет:

Поменял две строчки кода в utf8rus

А display.cp437(true); до этого не решил проблему?

Спасибо за подсказку. Не знал, что означает этот оператор. Попробую, отпишусь.

kskot
Offline
Зарегистрирован: 30.09.2018

Доброго времени суток. Столкнулся с таким вопросом хотел бы вывести символ из примера, на фото третий снизу (символ динамика) но неразобрался как, находится в void TEST_display_1, может кто подскажит как это сделать?

 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Подключаем по SPI
// # define OLED_MOSI 12
// # define OLED_CLK 13
// # define OLED_DC 10
// # define OLED_CS 9
// # define OLED_RESET 11
// Отображение Adafruit_SSD1306 (OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Подключаем по l2c
#define OLED_RESET 4
Дисплей Adafruit_SSD1306 (OLED_RESET);

unsigned char i1, i2, c3;



void setup () {                 
  display.begin (SSD1306_SWITCHCAPVCC);
  display.cp437 (истина);
}

void loop () {
  TEST_display_1 ();
  Задержка (5000);
  TEST_display_2 ();
  Задержка (5000);
  // TEST_display_3 ();
  // задержка (5000);
  // TEST_display_4 ();
  // задержка (5000);
}

void TEST_display_1 ()
{
  display.clearDisplay ();
  display.setTextColor (белый);
  display.setTextSize (1);
  display.setCursor (0,0);
  
  для (i1 = 0; i1 <8; i1 ++) {
    для (i2 = 0; i2 <16; i2 ++) {
      с3 = i1 * 16 + i2;
      if (c3 == 0x0A || c3 == 0x0D) display.print ("");
      else display.write (c3);
    }
    display.println ( "");
  }
  display.display ();
}

void TEST_display_2 ()
{
  display.clearDisplay ();
  display.setTextColor (белый);
  display.setTextSize (1);
  display.setCursor (0,0);
  
  для (i1 = 8; i1 <16; i1 ++) {
    для (i2 = 0; i2 <16; i2 ++)
      display.write (i1 * 16 + i2);
    display.println ( "");
  }
  display.display ();
}

void TEST_display_3 ()
{
  display.clearDisplay (); 
  display.setTextColor (белый);
  display.setTextSize (1);
  display.setCursor (0,0);

  display.println (utf8rus ( "АБВГДЕЖЗИЙКЛМНОП"));
  display.println (utf8rus ( "РСТУФХЦЧШЩЪЫЬЭЮЯ"));
  display.println (utf8rus ( "абвгдежзийклмноп"));
  display.println (utf8rus ( "рстуфхцчшщъыьэюя"));
  display.println (utf8rus ( "Ёё123ABCabc @ # \ XBC \ XBD!"));
  display.println (utf8rus ("10 \ x83 10 \ x8A \ x82 10 \ x81 \ x80 2 \ x85"));

  display.display ();  
}

void TEST_display_4 ()
{
  display.clearDisplay (); 
  display.setTextColor (белый);
  display.setCursor (0,0);

  display.setTextSize (1);
  display.println (utf8rus ("Размер шрифта 1"));

  display.setTextSize (2);
  display.println (utf8rus («Размер 2»));

  display.setTextSize (3);
  display.println (utf8rus («Разм 3»));

  display.display ();  
}

/ * Перекодировать русские шрифты из UTF-8 в Windows-1251 * /
String utf8rus (источник строки)
{
  int i, k;
  String target;
  unsigned char n;
  char m [2] = {'0', '\ 0'};

  k = source.length (); i = 0;

  тогда как (i <k) {
    n = источник [i]; я ++;

    если (n> = 0xC0) {
      switch (n) {
        case 0xD0: {
          n = источник [i]; я ++;
          if (n == 0x81) {n = 0xA8; перерыв; }
          if (n> = 0x90 && n <= 0xBF) n = n + 0x30;
          перерыв;
        }
        case 0xD1: {
          n = источник [i]; я ++;
          if (n == 0x91) {n = 0xB8; перерыв; }
          if (n> = 0x80 && n <= 0x8F) n = n + 0x70;
          перерыв;
        }
      }
    }
    m [0] = n; target = target + String (m);
  }
return target;
}

Извеняюсь что не в сполере незнаю как скрыть под сполер

arduinec
Offline
Зарегистрирован: 01.09.2015

kskot пишет:

Доброго времени суток. Столкнулся с таким вопросом хотел бы вывести символ из примера, на фото третий снизу (символ динамика) но неразобрался как, находится в void TEST_display_1, может кто подскажит как это сделать?

Не надо в строке 83 между \ и x83 пробел ставить, правильно так: "\x83".

Скетч OledSymbolTest.ino с выводом символов:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// software SPI:
#define OLED_MOSI  12
#define OLED_CLK   13
#define OLED_DC    10
#define OLED_CS    9
#define OLED_RESET 11

char battery[5][4] = {
"\x9D\x9E\x9F", 
"\x9D\x9E\xA3", 
"\x9D\xA1\xA3", 
"\x9D\xA2\xA3", 
"\xA0\xA2\xA3"
};
char signal[7][3] = {
"\x96\x96", 
"\x97\x96", 
"\x98\x96", 
"\x99\x96", 
"\x99\x9A", 
"\x99\x9B", 
"\x99\x9C", 
};
char zvuk[4][4] = {
"   ", 
")  ", 
")) ", 
")))"
};
char zvonok[3][6] = {
"  \xB3  ", 
" \xAB\xB3\xBB ",
"<\xAB\xB3\xBB>"
};
unsigned char horizontal[4] = 
{ 0x8C, 0x8D, 0x8E, 0x8F };
unsigned char vertical[6] = 
{ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95 };
unsigned char strelki[8] = 
{ 0x18, 0xBD, 0x1A, 0xBF, 0x19, 0xBE, 0x1B, 0xBC };

unsigned char i1,i2,c3;

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup(){                 
  display.begin(SSD1306_SWITCHCAPVCC);
  display.cp437(true);
}

void loop() {
  unsigned char i,
    x1=6, y1=0,
    x2=108, y2=0,
    x3=0, y3=16,
    x4=0, y4=32,
    x5=6, y5=48,
    x6=42, y6=48,
    x7=108, y7=48;

  display.clearDisplay(); 
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.println("\xAD   \xAE");

  display.setCursor(0,48);
  display.println("\xB2    \xB4       \xAF \xAC");

  randomSeed(millis());

  for(i=0; i<80; i++) {
    display.setTextColor(BLACK);

    display.setCursor(x1, y1);
    display.print("\x8B\x8B");

    display.setCursor(x2, y2);
    display.print("\x8B\x8B\x8B");

    display.setCursor(x3 + (i%20)*6, y3);
    display.write(0x8B);

    display.setCursor(x5, y5);
    display.print("\x8B\x8B\x8B");

    display.setCursor(x6, y6);
    display.print("\x8B\x8B\x8B\x8B\x8B");

    display.setCursor(x7, y7);
    display.write(0x8B);

    display.setTextColor(WHITE);

    display.setCursor(x1, y1);
    display.print(signal[i%7]);

    display.setCursor(x2, y2);
    display.print(battery[i%5]);
    
    display.setCursor(x3 + (i%20)*6, y3);
    display.write(vertical[random(5)]);

    display.setCursor(x4 + char(i/4)*6, y4);
    display.write(horizontal[i%4]);

    display.setCursor(x5, y5);
    display.print(zvuk[i%4]);

    display.setCursor(x6, y6);
    display.print(zvonok[i%3]);

    display.setCursor(x7, y7);
    display.write(strelki[i%8]);

    display.display();
    delay(1000);
  }
}

kskot пишет:

Извеняюсь что не в сполере незнаю как скрыть под сполер

При вставке кода на вкладке "Дополнительно" нужно поставить галочку там где "Свернуть" написано.

 

Yarik_22
Offline
Зарегистрирован: 13.03.2016

Здравствуйте.

использую TFT 1.8 SPI и Arduino NANO, все отлично заработало и текст руский и отображение всей остальной "мешуры", читая форум, так и не нашел подобного вопроса:

Со статическим отображением текста и цифр - все отлично.

пытаюсь отобразить  значение с аналогового входа и получается, не то, что ожидаю. если отображать значение с fillScreen  в lopp, экран мерцает и выводит "морось" какую то, если без fillScreen, то экран заполняется белми пикселями, понял что нужно обновление экрана для вывода динамического текста, не могу понять как.

 

что не так делаю?

#include <Adafruit_GFX.h>    
#include <Adafruit_ST7735.h>
#include <SPI.h>
 #define TFT_CS        10
  #define TFT_RST        9 
  #define TFT_DC         8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int sensorPin = A0;



void setup() {
 tft.initR(INITR_BLACKTAB);
 tft.fillScreen(ST77XX_BLACK);
}

void loop() {
   tft.cp437(true);
   tft.fillScreen(ST77XX_BLACK);
   char q = char(analogRead(sensorPin));
   char w = q + "\xB0";
   tft.setTextSize(1);
drawtext("ТЕКСТ",0xFFFFFF,0,0); 
 tft.setTextSize(2);
drawtext(w,0xFFFFFF,20,20); 
// tft.print(w);
}

void drawtext(char *text, uint16_t color,int x, int y) {

  tft.setCursor(x,y);
  tft.setTextColor(color);
 tft.setTextWrap(true);
  tft.println(utf8rus(text));

}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. В нормальной библиотеке дисплея должен быть режим вывода "с непрозрачным фоном", чтобы затирать то, что было нарисовано ранее.

2. Перерисовывать что-то имеет смысл только в том случае, если что-то поменялось. Писать "12345" поверх "12345" ведет лишь к сильному мерцанию.

Yarik_22
Offline
Зарегистрирован: 13.03.2016

 

1.эту функцию нужнго искать в бибиотеке Adafruit_ST7735.h?

2.до такого, надеюсь не дойдет))

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

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

Yarik_22
Offline
Зарегистрирован: 13.03.2016

мне кажется, это уже должно быть решено на уровне самой библиотеки, не может же быт, что только мне нужно выводит динамический текст!), за идею спасибо, если не решу прямым путем, буду делать так...

Yarik_22
Offline
Зарегистрирован: 13.03.2016

может кто то уже выводилдинамический текст/число, может пример показать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

pilnikov пишет:

рисуйте черный прямоугольник прежде чем выводить новое значение

Интересно, откуда происходит этот вредный совет?

Дело в том, что для 1-битного цвета рисование "с непрозрачным фоном" в несколько раз быстрее, чем с прозрачным. Для 16-битного звета чуть сложнее: рисование символа в потоковом режиме требует передачи двух байтов, а в индивидуальном, в зависимости от контроллера - 14 или 16 байтов. Т.е. при коэффициенте заполнения более 12-14% (а у большинства фонтов это так) быстрее рисовать символ с непрозрачным фоном. Если мы еще дополнительно рисуем черный прямоугольник, то затраты времени на такое рисование будет в 2-6 раз выше, чем рисование символа с непрозрачным фоном.

Вот и интересно, откуда растут ноги у таких рекомендаций, которые в разы замедляют работу программы?

Yarik_22
Offline
Зарегистрирован: 13.03.2016

Частитчно проблема решилась, добавлением в setTextColor цвета заднего фона, но текст пока отображается неадекватно

 

#include <Adafruit_GFX.h>    
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS        10
#define TFT_RST        9 
#define TFT_DC         8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int sensorPin = A0;

void setup() {
 tft.initR(INITR_BLACKTAB);
 tft.fillScreen(ST77XX_BLACK);
 tft.setRotation(2);
}

void loop() {
   tft.cp437(true);
    char q = char (analogRead(sensorPin));
   char w = q + "\xB0";
drawtext("ТЕКСТ",0xFFFFFF,0,0,1); 
drawtext(w,0xFFFFFF,20,20,1); 
 }

void drawtext(char *text, uint16_t color,int x, int y,int text_size) {
  tft.setCursor(x,y);
  tft.setTextColor(color,ST77XX_BLACK);
  tft.setTextSize(text_size);
 tft.setTextWrap(true);
  tft.print(utf8rus(text));
}

 

Yarik_22
Offline
Зарегистрирован: 13.03.2016

перевел char в String - появились адекватные значения от аналогового входа.

Осталось решить один нюанс - при переходе из 1023 в 0, крайние 3 цифры остаются на месте, получается -  0023, их надо затереть

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Если речь идёт об "затирании" лишнего (12 поверх 1234), то без квадратиков никуда.

Если же символ выводится печатая только сам символ (прозрачный), то не залезть в библиотеку не получится.

И скорей всего это будет файл Adafruit_ST7735.cpp

Искомая функция, вероятно, называется "drawChar".

Скорей всего там закоментирован вывот заднего фона. Это вывод пикселя цвета фона.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

У вас вопросы не относящиеся к этой ветке.

Yarik_22
Offline
Зарегистрирован: 13.03.2016

DarkGenius пишет:

У вас вопросы не относящиеся к этой ветке.

 

вот тут извиняюсь!

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

andriano пишет:

pilnikov пишет:

рисуйте черный прямоугольник прежде чем выводить новое значение

Интересно, откуда происходит этот вредный совет?

Вот и интересно, откуда растут ноги у таких рекомендаций, которые в разы замедляют работу программы?

Это кусок кода Adafruit_GFX.cpp

void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c,
  uint16_t color, uint16_t bg, uint8_t size) {

    if(!gfxFont) { // 'Classic' built-in font

        if((x >= _width)            || // Clip right
           (y >= _height)           || // Clip bottom
           ((x + 6 * size - 1) < 0) || // Clip left
           ((y + 8 * size - 1) < 0))   // Clip top
            return;

        if(!_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior

        startWrite();
        for(int8_t i=0; i<5; i++ ) { // Char bitmap = 5 columns
            uint8_t line = pgm_read_byte(&font[c * 5 + i]);
            for(int8_t j=0; j<8; j++, line >>= 1) {
                if(line & 1) {
                    if(size == 1)
                        writePixel(x+i, y+j, color);
                    else
                        writeFillRect(x+i*size, y+j*size, size, size, color);
                } else if(bg != color) {
                    if(size == 1)
                        writePixel(x+i, y+j, bg);
                    else
                        writeFillRect(x+i*size, y+j*size, size, size, bg);
                }
            }
        }

Скажите пожалуйста, что делают строки,  содержащие writeFillRect ???

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Если размер шрифта "1" (не увеличиваем) выводится, как фон или символ, пиксел.

Если размер шрифта больше одного, выводится квадрат размером как размер шрифта (2, 3, 4 ...)

immortalserg
Offline
Зарегистрирован: 19.12.2018

это относится только к базовому шрифту, у пользовательских шрифтов нет фона

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

hugoboss317 пишет:

Если речь идёт об "затирании" лишнего (12 поверх 1234), то без квадратиков никуда.

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

Цитата:

Если же символ выводится печатая только сам символ (прозрачный), то не залезть в библиотеку не получится.

И скорей всего это будет файл Adafruit_ST7735.cpp

Искомая функция, вероятно, называется "drawChar".

Скорей всего там закоментирован вывот заднего фона. Это вывод пикселя цвета фона.

Лично я для вывода на экран пользуюсь исключительно собственными библиотеками, поэтому насчет других ничего сказать не могу.

Если речь о том, что приведено в сообщении №392, то функция явно написана очень неоптимально. Притом так, что править даже нет смысла - нужно переписывать заново.

И по поводу "закомментировать", с приведенным вариантом это, конечно, сделать можно, но не нужно.

immortalserg
Offline
Зарегистрирован: 19.12.2018

andriano пишет:

hugoboss317 пишет:

Если речь идёт об "затирании" лишнего (12 поверх 1234), то без квадратиков никуда.

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

для библиотеки Adafruit-GFX-Library при использовании внешних шрифтов нельзя задать фон шрифта, согласно официальной документации в которой написано как использовать шрифты написано, что для стирания старого шрифта надо использовать функции getTextBounds () и fillRect (), вернее для стирания использовать fillRect ()
в прочем можно разными способами затирать шрифт, например печатая такой же шрифт только цветом фона

 

Yarik_22
Offline
Зарегистрирован: 13.03.2016

в итоге воспользовался функцией fillRect (), не совсем то что  хотел, хотя странно, что  Adafruit не сдела функции типа printNumI() как для OLED дисплея

killspika
Offline
Зарегистрирован: 04.02.2019

Добрый день! Хотел бы высказать свое огромное спасибо arduinec русский шрифт работает на ура с лентой WS2812b.

Собственно вопрос как использовать utf8rus с PROGMEM?

Код прилагаю конкретно интерисует для бегущей строки.

Спасибо за любые подсказки и помощь)


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <DS3231.h>
#include <EEPROM.h>
#include <SFE_BMP180.h>
#include <Wire.h>

#define EEPROM_I2C_ADDRESS 0x50

//переменные для датчика давления температуры
  char status;
  double T,P,p0,a;
  int len;
///максимальный размер текста
  #define maxString 100
  char target[maxString + 1] = "";

#define ALTITUDE 1655.0

//яркость и пин ленты
#define PIN    2
#define BRIGHT 255

///инициализация часов
char compileTime[] = __TIME__;
char compileDate[] = __DATE__;
DS3231 Clock(SDA,SCL);
Time RTC_Time;

///инициализация датчика температуры и давления
SFE_BMP180 pressure;

///инициализация ленты
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(42, 7, PIN,
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB + NEO_KHZ800);
  
///палитра цветов
const uint16_t colors[] = {matrix.Color(BRIGHT, 0, 0), matrix.Color(0, BRIGHT, 0), matrix.Color(0, 0, BRIGHT), matrix.Color(BRIGHT, BRIGHT, BRIGHT), matrix.Color(250, 0, 135),
matrix.Color(255, 75, 0), matrix.Color(0, 145, 255), matrix.Color(100, 0, 255), matrix.Color(145, 230, 80)};

  //0-красный
  //1-зеленый
  //2-синий
  //3-белый
  //4-розовый
  //5-оранжевый
  //6-голубой
  //7-фиолетовый
  //8-салатовый

// ------------Отображение русского шрифта------------- 
char *utf8rus(char *source)
{
  int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };

  strcpy(target, ""); k = strlen(source); i = j = 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; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}
const PROGMEM  uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};
const char text[] PROGMEM  = {"ПРИВЕТ"};
const char signMessage[] PROGMEM  = {("ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 1234567890 абвгдеёжзийклмнопрстуфхцчшщъьыэюя АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЫЭЮЯ")};
unsigned int displayInt;
char ruText[] = {("ПРИВЕТ")};
int k;    // counter variable
char myChar;  


void setup() {
  matrix.cp437(true);
  matrix.begin();
  pressure.begin();
  matrix.setTextWrap(false); ///перенос текста для высоких дисплеев
  matrix.setBrightness(100); ///настройка яркости
  matrix.setTextColor(colors[3]);
  Serial.begin(1000000);
  Clock.begin();
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);
  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
  if (EEPROMReadInt(0) != hash) {
    EEPROMWriteInt(0, hash);
    Clock.adjust(compileDate, compileTime);
  }
}


int x    = matrix.width();
int pass = 0;

  ///время
void timeOnScreen(){
  matrix.fillScreen(0);
  matrix.setCursor(6, 0);
  matrix.setTextColor(colors[6]);
  matrix.print(Clock.getTimeStr(1));
  matrix.show();
  delay(1000);
}

  //день месяц
void DayMonth(){
  matrix.fillScreen(0);
  matrix.setCursor(6, 0);
  matrix.setTextColor(colors[5]);
  matrix.print(Clock.getDateStr()[0]);
  matrix.print(Clock.getDateStr()[1]);
  matrix.print("/");
  matrix.print(Clock.getDateStr()[3]);
  matrix.print(Clock.getDateStr()[4]);
  matrix.show();
  delay(2000);
}
  
  //Год
void Year(){
  matrix.fillScreen(0);
  matrix.setCursor(0, 0);
  matrix.setTextColor(colors[5]);
  matrix.print(Clock.getDateStr()[6]);
  matrix.print(Clock.getDateStr()[7]);
  matrix.print(Clock.getDateStr()[8]);
  matrix.print(Clock.getDateStr()[9]);
  matrix.setCursor(25, 0);
  matrix.print(utf8rus("год"));
  matrix.show();
  delay(2000);
}

  //дата полность дд\мм\гггг
void DayMonthYear(){
  matrix.setTextColor(colors[5]);
  len = 100;
  while (--x > (len*(-1)))
   {
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(Clock.getDateStr()[0]);
    matrix.print(Clock.getDateStr()[1]);
    matrix.print("-");
    matrix.print(Clock.getDateStr()[3]);
    matrix.print(Clock.getDateStr()[4]);
    matrix.print("-");
    matrix.print(Clock.getDateStr()[6]);
    matrix.print(Clock.getDateStr()[7]);
    matrix.print(Clock.getDateStr()[8]);
    matrix.print(Clock.getDateStr()[9]);
    matrix.show();
    delay(15);
    } 
  x = matrix.width();
  delay(10);
  }

//бегущая строка
void ScrollText(){
   matrix.setTextColor(colors[4]);
  // myChar =  pgm_read_byte_near(signMessage + k); 
   len = 200;
   while (--x > (len*(-1)))
   {
      matrix.fillScreen(0);
      matrix.setCursor(x, 0);
      //matrix.print(utf8rus("Если не бегаешь, пока здоров, придеться побегать, когда заболеешь"));
     // matrix.print(myChar);
      for (k = 0; k < 5; k++){
        displayInt = pgm_read_word_near(charSet + k);
        Serial.print(displayInt);
        }
          for (k = 0; k < strlen_P(text); k++)
          {
            myChar =  pgm_read_byte_near(text + k);
            matrix.print(myChar);
          }
    //int idx = 0;
   // while((myChar[idx]) != '\0') 
   // {
   //   matrix.print(myChar[idx]);
   //   idx++;
   // }
    matrix.show();
    delay(15);
    } 
  x = matrix.width();
  delay(500);
}

//Текст Температура
void TextTemp(){
   matrix.setTextColor(colors[7]);
   len = 55;
   while (--x > (len*(-1)))
    {
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(utf8rus("Температура"));
    matrix.show();
    delay(15);
    } 
   x = matrix.width(); 
   delay(500);
}

//Температура
void Temp(){
  matrix.fillScreen(0);
  matrix.setCursor(6, 0);
  matrix.setTextColor(colors[7]);
  status = pressure.startTemperature();
  if(status!=0){
    delay(status); // Ожидание
    status = pressure.getTemperature(T);
    if(status!=0){
      matrix.print("t");
      matrix.print(T,0); // Вывод на экран значения температуры.
      matrix.print("C\xB0"); //Печать символа градуса Цельсия.
      }
    }
  matrix.show();
  delay(3000);
}

//текст Давление
void TextDav(){
  matrix.setTextColor(colors[8]);
  len = 47;
  while (--x > (len*(-1))){
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(utf8rus("Давление"));
    matrix.show();
    delay(15);
    } 
  x = matrix.width(); 
  delay(500);
}

//Давление
void Dav(){
  matrix.fillScreen(0);
  matrix.setCursor(6, 0);
  matrix.setTextColor(colors[8]);
  status = pressure.startPressure(3);
  if(status!=0){
    delay(status);
    status = pressure.getPressure(P,T);
    if(status!=0){
      matrix.print(P*0.7500637554192,0);
      matrix.print("mm");
      } 
  }
  matrix.show();
  delay(3000);  
}

void loop() { 
  ///время
timeOnScreen();  
  ///день месяц
//DayMonth();  
  //год
//Year(); 
  //день месяц год
DayMonthYear(); 
   //бегущая строка
ScrollText();   
  //строка температура в хате
TextTemp();   
  //Температура
Temp();
  //строка Давление
TextDav();    
///Давление
Dav();
}


char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}
//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);
  return (highByte << 8) | lowByte;
}
arduinec
Offline
Зарегистрирован: 01.09.2015

При 300 светодиодах для 100-байтовой строки и в оперативной памяти места хватит. Но если строк много и/или хочется сэкономить оперативную память, а строки в PROGMEM обычно не меняются, то можно в PROGMEM сохранять строки сразу с HEX-символами русских букв. Выводится такие строки могут стандартным образом без перекодирования.

Ниже приводится скетч с функцией utf8rus2hex(), которая перекодирует русские буквы из UTF-8 в кодировку Windows-1251 и преобразует их в строчные HEX-символы (английские символы при этом не меняются):

void setup()
{
  Serial.begin(9600);

  utf8rus2hex("Test");
  utf8rus2hex("Тест");
  utf8rus2hex("Test Тест");
}

void loop() {}

/* Recode russian fonts from UTF-8 to Windows-1251
   and convert in HEX-format */
void utf8rus2hex(char *source)
{
  int i,k;
  unsigned char n;

  k = strlen(source); i = 0;

  Serial.print("\"");

  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;
        }
      }
    }

    if ((n >= 0x20) && (n <= 0x7F)) Serial.write(n);
    else {
      Serial.print("\\x");
      if(n < 0x10) Serial.print("0");
      Serial.print(n, HEX);
    }
  }

  Serial.println("\"");
}

Результат:
"Test"
"\xD2\xE5\xF1\xF2"
"Test \xD2\xE5\xF1\xF2"

Остаётся только оформить строку (например последнюю) в нужном виде:
const unsigned char stroka[] PROGMEM = "Test \xD2\xE5\xF1\xF2";

Также в эту строку можно добавить и другие HEX-символы, содержащиеся в шрифте - пример можно посмотреть в посте #379.

arduinec
Offline
Зарегистрирован: 01.09.2015

Примеры моих бегущих строк (480 светодиодов, текстовая строка хранится в обычной оперативной памяти):
https://yadi.sk/i/KjPlzioNjskYL
https://yadi.sk/i/RzuRDpZkkK32s