UTFT на русском (кириллица )

Уважаемые, участники форума, опытные ардуинщики, нуждаюсь в вашей помощи. К ардуино Мега 2560 подключил tft lcd mega shield v2.2. а к нему дисплей TFT_320QDT_9341. Интерфейс 16 битный параллельный. Подскажите пожалуйста UTFT библиотеку для программирования этого сенсорного дисплея с выводом текста и кнопок на русском языке. Может есть какая-то библиотека, которой не важно, русский или Английский текст? Или шрифт какой-то?

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

Я очень рад, что вы освоили. Но к чему здесь это сообщение, мне не очень понятно

Если вам нужны готовые варианты, почему вы не пользуетесь поиском?
В гуле по теме “руссификация UTFT” десятки ссылок.

1NotApple6 позвольте порекомендовать вам создать тему в платном разделе, как раз скоро буду копаться, и вывод строки будет с веб сервера,(зациклено!) включая поддержку русских букв, по деньгам возьму всего 5к))) а вот бесплатный вариант https://robotclass.ru/tutorials/russkij-tekst-tft_espi/ (но могу ошибаться)

Странная сама форма вопроса: подскажите, как зовут Алексея Михайловича из 32 квартиры.
Если Вас интересует конкретная библиотека, то она может либо поддерживать кириллицу, либо не поддерживать. На МК с ограниченными ресурсами не принято играть в толерантность, поэтому, как правило, при необходимости поддерживается только ASCII, а именно, 95 печатных символа и 33 управляющих. Но существуют способы разной степени кривизны, позволяющие иметь на дисплее символы кириллицы.
Хотя, честно говоря, я сам приложил руку к русификации одного из дисплеев.

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

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

Да, библиотекари не могут написать ни одной русифицированной библиотеки с анимацией надписей. Лень им, видите ли :slight_smile: Особенно бесят иностранные авторы. То ресурсов МК жалко, то никому это не надо, то просто лень. Сотни отговорок. А прописные буквы, шоб своей рукой шрифт. Одни мечты.

Здесь есть два варианта:

  • подобная “радуга” поддерживается аппаратно. Ну примерно так, как распространенный 1602 поддерживает скроллинг.
  • “радуга” аппаратно не поддерживается.

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

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

Все, гады, норовят иероглифами!

Прямоугольник с радужной заливкой осилите? А дальше остаётся только напечатать по нему нужный текст буквами с инверсией

Всё же больше Деванагари :t_rex:

кажется я просто ошибся в двух местах, и вот так работает

#include <TFT_eSPI.h>
#include <pgmspace.h>

// ==================== СИСТЕМНЫЙ ШРИФТ SystemRus5x7 ====================
const uint8_t SystemRus5x7Bitmaps[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20
  0x00, 0x00, 0x5F, 0x00, 0x00,// ! 0x21
  0x00, 0x07, 0x00, 0x07, 0x00,// " 0x22
  0x14, 0x7F, 0x14, 0x7F, 0x14,// # 0x23
  0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 0x24
  0x23, 0x13, 0x08, 0x64, 0x62,// % 0x25
  0x36, 0x49, 0x55, 0x22, 0x50,// & 0x26
  0x00, 0x05, 0x03, 0x00, 0x00,// ' 0x27
  0x00, 0x1C, 0x22, 0x41, 0x00,// ( 0x28
  0x00, 0x41, 0x22, 0x1C, 0x00,// ) 0x29
  0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 0x2A
  0x08, 0x08, 0x3E, 0x08, 0x08,// + 0x2B
  0x00, 0x50, 0x30, 0x00, 0x00,// , 0x2C
  0x08, 0x08, 0x08, 0x08, 0x08,// - 0x2D
  0x00, 0x60, 0x60, 0x00, 0x00,// . 0x2E
  0x20, 0x10, 0x08, 0x04, 0x02,// / 0x2F
  0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 0x30
  0x00, 0x42, 0x7F, 0x40, 0x00,// 1 0x31
  0x42, 0x61, 0x51, 0x49, 0x46,// 2 0x32
  0x21, 0x41, 0x45, 0x4B, 0x31,// 3 0x33
  0x18, 0x14, 0x12, 0x7F, 0x10,// 4 0x34
  0x27, 0x45, 0x45, 0x45, 0x39,// 5 0x35
  0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 0x36
  0x01, 0x71, 0x09, 0x05, 0x03,// 7 0x37
  0x36, 0x49, 0x49, 0x49, 0x36,// 8 0x38
  0x06, 0x49, 0x49, 0x29, 0x1E,// 9 0x39
  0x00, 0x36, 0x36, 0x00, 0x00,// : 0x3A
  0x00, 0x56, 0x36, 0x00, 0x00,// ; 0x3B
  0x00, 0x08, 0x14, 0x22, 0x41,// < 0x3C
  0x14, 0x14, 0x14, 0x14, 0x14,// = 0x3D
  0x41, 0x22, 0x14, 0x08, 0x00,// > 0x3E
  0x02, 0x01, 0x51, 0x09, 0x06,// ? 0x3F
  0x32, 0x49, 0x79, 0x41, 0x3E,// @ 0x40
  0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x41
  0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x42
  0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x43
  0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44
  0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x45
  0x7F, 0x09, 0x09, 0x01, 0x01,// F 0x46
  0x3E, 0x41, 0x41, 0x51, 0x32,// G 0x47
  0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x48
  0x00, 0x41, 0x7F, 0x41, 0x00,// I 0x49
  0x20, 0x40, 0x41, 0x3F, 0x01,// J 0x4A
  0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x4B
  0x7F, 0x40, 0x40, 0x40, 0x40,// L 0x4C
  0x7F, 0x02, 0x04, 0x02, 0x7F,// M 0x4D
  0x7F, 0x04, 0x08, 0x10, 0x7F,// N 0x4E
  0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x4F
  0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x50
  0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 0x51
  0x7F, 0x09, 0x19, 0x29, 0x46,// R 0x52
  0x46, 0x49, 0x49, 0x49, 0x31,// S 0x53
  0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x54
  0x3F, 0x40, 0x40, 0x40, 0x3F,// U 0x55
  0x1F, 0x20, 0x40, 0x20, 0x1F,// V 0x56
  0x7F, 0x20, 0x18, 0x20, 0x7F,// W 0x57
  0x63, 0x14, 0x08, 0x14, 0x63,// X 0x58
  0x03, 0x04, 0x78, 0x04, 0x03,// Y 0x59
  0x61, 0x51, 0x49, 0x45, 0x43,// Z 0x5A
  0x00, 0x00, 0x7F, 0x41, 0x41,// [ 0x5B
  0x02, 0x04, 0x08, 0x10, 0x20,// "\" 0x5C
  0x41, 0x41, 0x7F, 0x00, 0x00,// ] 0x5D
  0x04, 0x02, 0x01, 0x02, 0x04,// ^ 0x5E
  0x40, 0x40, 0x40, 0x40, 0x40,// _ 0x5F
  0x00, 0x01, 0x02, 0x04, 0x00,// ` 0x60
  0x20, 0x54, 0x54, 0x54, 0x78,// a 0x61
  0x7F, 0x48, 0x44, 0x44, 0x38,// b 0x62
  0x38, 0x44, 0x44, 0x44, 0x20,// c 0x63
  0x38, 0x44, 0x44, 0x48, 0x7F,// d 0x64
  0x38, 0x54, 0x54, 0x54, 0x18,// e 0x65
  0x08, 0x7E, 0x09, 0x01, 0x02,// f 0x66
  0x08, 0x14, 0x54, 0x54, 0x3C,// g 0x67
  0x7F, 0x08, 0x04, 0x04, 0x78,// h 0x68
  0x00, 0x44, 0x7D, 0x40, 0x00,// i 0x69
  0x20, 0x40, 0x44, 0x3D, 0x00,// j 0x6A
  0x00, 0x7F, 0x10, 0x28, 0x44,// k 0x6B
  0x00, 0x41, 0x7F, 0x40, 0x00,// l 0x6C
  0x7C, 0x04, 0x18, 0x04, 0x78,// m 0x6D
  0x7C, 0x08, 0x04, 0x04, 0x78,// n 0x6E
  0x38, 0x44, 0x44, 0x44, 0x38,// o 0x6F
  0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x70
  0x08, 0x14, 0x14, 0x18, 0x7C,// q 0x71
  0x7C, 0x08, 0x04, 0x04, 0x08,// r 0x72
  0x48, 0x54, 0x54, 0x54, 0x20,// s 0x73
  0x04, 0x3F, 0x44, 0x40, 0x20,// t 0x74
  0x3C, 0x40, 0x40, 0x20, 0x7C,// u 0x75
  0x1C, 0x20, 0x40, 0x20, 0x1C,// v 0x76
  0x3C, 0x40, 0x30, 0x40, 0x3C,// w 0x77
  0x44, 0x28, 0x10, 0x28, 0x44,// x 0x78
  0x0C, 0x50, 0x50, 0x50, 0x3C,// y 0x79
  0x44, 0x64, 0x54, 0x4C, 0x44,// z 0x7A
  0x00, 0x08, 0x36, 0x41, 0x00,// { 0x7B
  0x00, 0x00, 0x7F, 0x00, 0x00,// | 0x7C
  0x00, 0x41, 0x36, 0x08, 0x00,// } 0x7D
  0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 0x7E
  0x08, 0x1C, 0x2A, 0x08, 0x08, // <- 0x7F
  // Русские буквы (CP866 кодировка)
  0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x80
  0x38, 0x44, 0x44, 0x44, 0x20,// c 0x81
  0x04, 0x04, 0x7C, 0x04, 0x04,// т 0x82
  0x0C, 0x50, 0x50, 0x50, 0x3C,// у 0x83
  0x30, 0x48, 0xFC, 0x48, 0x30,// ф 0x84
  0x44, 0x28, 0x10, 0x28, 0x44,// x 0x85
  0x7C, 0x40, 0x40, 0x40, 0xFC,// ц 0x86
  0x0C, 0x10, 0x10, 0x10, 0x7C,// ч 0x87
  0x7C, 0x40, 0x7C, 0x40, 0x7C,// ш 0x88
  0x7C, 0x40, 0x7C, 0x40, 0xFC,// щ 0x89
  0x04, 0x7C, 0x50, 0x50, 0x20,// ъ 0x8A
  0x7C, 0x50, 0x50, 0x20, 0x7C,// ы 0x8B
  0x7C, 0x50, 0x50, 0x20, 0x00,// ь 0x8C
  0x28, 0x44, 0x54, 0x54, 0x38,// э 0x8D
  0x7C, 0x10, 0x38, 0x44, 0x38,// ю 0x8E
  0x08, 0x54, 0x34, 0x14, 0x7C,// я 0x8F
  // Заглавные русские буквы
  0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x90
  0x7F, 0x49, 0x49, 0x49, 0x33,// Б 0x91
  0x7F, 0x49, 0x49, 0x49, 0x36,// В 0x92
  0x7F, 0x01, 0x01, 0x01, 0x03,// Г 0x93
  0xE0, 0x51, 0x4F, 0x41, 0xFF,// Д 0x94
  0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x95
  0x77, 0x08, 0x7F, 0x08, 0x77,// Ж 0x96
  0x41, 0x49, 0x49, 0x49, 0x36,// З 0x97
  0x7F, 0x10, 0x08, 0x04, 0x7F,// И 0x98
  0x7C, 0x21, 0x12, 0x09, 0x7C,// Й 0x99
  0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x9A
  0x20, 0x41, 0x3F, 0x01, 0x7F,// Л 0x9B
  0x7F, 0x02, 0x0C, 0x02, 0x7F,// M 0x9C
  0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x9D
  0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x9E
  0x7F, 0x01, 0x01, 0x01, 0x7F,// П 0x9F
  0x7F, 0x09, 0x09, 0x09, 0x06,// P 0xA0
  0x3E, 0x41, 0x41, 0x41, 0x22,// C 0xA1
  0x01, 0x01, 0x7F, 0x01, 0x01,// T 0xA2
  0x47, 0x28, 0x10, 0x08, 0x07,// У 0xA3
  0x1C, 0x22, 0x7F, 0x22, 0x1C,// Ф 0xA4
  0x63, 0x14, 0x08, 0x14, 0x63,// X 0xA5
  0x7F, 0x40, 0x40, 0x40, 0xFF,// Ц 0xA6
  0x07, 0x08, 0x08, 0x08, 0x7F,// Ч 0xA7
  0x7F, 0x40, 0x7F, 0x40, 0x7F,// Ш 0xA8
  0x7F, 0x40, 0x7F, 0x40, 0xFF,// Щ 0xA9
  0x01, 0x7F, 0x48, 0x48, 0x30,// Ъ 0xAA
  0x7F, 0x48, 0x30, 0x00, 0x7F,// Ы 0xAB
  0x00, 0x7F, 0x48, 0x48, 0x30,// Э 0xAC
  0x22, 0x41, 0x49, 0x49, 0x3E,// Ь 0xAD
  0x7F, 0x08, 0x3E, 0x41, 0x3E,// Ю 0xAE
  0x46, 0x29, 0x19, 0x09, 0x7F,// Я 0xAF
  // Строчные русские буквы
  0x20, 0x54, 0x54, 0x54, 0x78,// a 0xB0
  0x3C, 0x4A, 0x4A, 0x49, 0x31,// б 0xB1
  0x7C, 0x54, 0x54, 0x28, 0x00,// в 0xB2
  0x7C, 0x04, 0x04, 0x04, 0x0C,// г 0xB3
  0xE0, 0x54, 0x4C, 0x44, 0xFC,// д 0xB4
  0x38, 0x54, 0x54, 0x54, 0x18,// e 0xB5
  0x6C, 0x10, 0x7C, 0x10, 0x6C,// ж 0xB6
  0x44, 0x44, 0x54, 0x54, 0x28,// з 0xB7
  0x7C, 0x20, 0x10, 0x08, 0x7C,// и 0xB8
  0x7C, 0x41, 0x22, 0x11, 0x7C,// й 0xB9
  0x7C, 0x10, 0x28, 0x44, 0x00,// к 0xBA
  0x20, 0x44, 0x3C, 0x04, 0x7C,// л 0xBB
  0x7C, 0x08, 0x10, 0x08, 0x7C,// м 0xBC
  0x7C, 0x10, 0x10, 0x10, 0x7C,// н 0xBD
  0x38, 0x44, 0x44, 0x44, 0x38,// o 0xBE
  0x7C, 0x04, 0x04, 0x04, 0x7C, // п 0xBF
  0x7F, 0x49, 0x49, 0x41, 0x63,  // Ё 0xF0 - как E с двумя точками
  0x38, 0x54, 0x54, 0x54, 0x48   // ё 0xF1 - как e с двумя точками
};

// Упрощенная структура для bitmap шрифта
typedef struct {
  const uint8_t *bitmap;  // Указатель на bitmap данные
  uint16_t first;         // Первый символ
  uint16_t last;          // Последний символ
  uint8_t  width;         // Ширина символа
  uint8_t  height;        // Высота символа
} RusFont;

// Создаем структуру шрифта
const RusFont SystemRus5x7Font = {
SystemRus5x7Bitmaps,
0x20,   // first
0xF1,   // last (расширен до F1)
5,      // width
7       // height
};

// ==================== ОСНОВНОЙ КОД ====================
TFT_eSPI tft = TFT_eSPI();

// Функция для вывода символов русского шрифта
void drawRussianChar(int x, int y, uint8_t char_code, uint16_t color = TFT_WHITE) {
if (char_code < SystemRus5x7Font.first || char_code > SystemRus5x7Font.last) {
return; // Символ вне диапазона
}
uint16_t index = (char_code - SystemRus5x7Font.first) * SystemRus5x7Font.width;
for (uint8_t col = 0; col < SystemRus5x7Font.width; col++) {
uint8_t line = pgm_read_byte(&SystemRus5x7Font.bitmap[index + col]);
for (uint8_t row = 0; row < SystemRus5x7Font.height; row++) {
if (line & 0x01) { tft.drawPixel(x + col, y + row, color); }
line >>= 1; }
}
}

// Функция для вывода русской строки
void drawRussianText(int x, int y, const char* text, uint16_t color = TFT_WHITE) {
int cursor_x = x;
int cursor_y = y;
for (int i = 0; text[i] != '\0'; i++) {
if (text[i] == '\n') {
cursor_y += SystemRus5x7Font.height + 2;
cursor_x = x; continue; }
// Проверка на выход за границы экрана
if (cursor_x + SystemRus5x7Font.width > tft.width()) {
cursor_x = x;
cursor_y += SystemRus5x7Font.height + 2;
}
drawRussianChar(cursor_x, cursor_y, text[i], color);
cursor_x += SystemRus5x7Font.width + 1;
}
}

// Улучшенная конвертация UTF-8 → CP866
String utf8_to_cp866_simple(const String &utf8_str) {
String result = "";
int i = 0;
while (i < utf8_str.length()) {
byte c = utf8_str[i];
if (c == 0xD0 && i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
if (c2 >= 0x90 && c2 <= 0xBF) { // А-п
result += (char)(0x90 + (c2 - 0x90));
i++;
} else if (c2 == 0x81) { // Ё
result += (char)0xF0;
i++;
} else { 
result += (char)c; 
}
} 
else if (c == 0xD1 && i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
if (c2 >= 0x80 && c2 <= 0x8F) { // р-я
result += (char)(0xA0 + (c2 - 0x80));
i++;
} else if (c2 == 0x91) { // ё
result += (char)0xF1; 
i++; 
} else { result += (char)c; }
} else { result += (char)c; } 
i++; 
} return result; }

void setup() {
Serial.begin(115200);
pinMode(TFT_BL, OUTPUT); 
digitalWrite(TFT_BL, HIGH);
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
Serial.println("SystemRus5x7 font ready!");
}

void loop() {
// Тест всех русских букв
tft.fillScreen(TFT_BLACK);
// Заглавные буквы А-Я + Ё
String uppercase = utf8_to_cp866_simple("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
drawRussianText(0, 10, uppercase.c_str(), TFT_GREEN);
// Строчные буквы а-я + ё
String lowercase = utf8_to_cp866_simple("абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
drawRussianText(0, 30, lowercase.c_str(), TFT_YELLOW);
// Тест с Ё и ё отдельно
String test_yo = utf8_to_cp866_simple("Ёлка ёжик");
drawRussianText(10, 70, test_yo.c_str(), TFT_RED);
delay(3000);
// Мигающий текст
for (int i = 0; i < 5; i++) { 
tft.fillScreen(TFT_BLACK);
String text1 = utf8_to_cp866_simple("РАБОТАЕТ ЁЁ!");
drawRussianText(20, 20, text1.c_str(), TFT_RED);
String text2 = utf8_to_cp866_simple("@!#$%^&*");
drawRussianText(30, 35, text2.c_str(), TFT_RED);
String text3 = utf8_to_cp866_simple("GSDAAGSwqerwer");
drawRussianText(40, 65, text3.c_str(), TFT_RED);
delay(500);
tft.fillScreen(TFT_BLACK);
delay(500);
}
delay(3000);
}

ну почти работает))) если кто может подскажите пж как вывести Ёё и почему вместо английских букв у меня выводит символы ?

А чем английские буквы отличаются от символов?

andriano вот такие ```
@!#$%^&*

я просто не учел размеры текста, и символы заехали на английские буквы, разница от букв немного есть)))