люди добрые, и не очень, подмогните рукопопу кто чем может, (или сделайте за меня) не печатается 2 символа Ёё, и не печатается русский текст с английским, надо не только для дисплея, но и для вебсервера… если получится сможете пользоваться сами
а так же возможно плохо печатается русская буква у…
0x77, 0x08, 0x7F, 0x08, 0x77, // Ё 0xF0
0x2C, 0x50, 0x7C, 0x50, 0x2C, // ё 0xF1
String yoTest = utf8_to_cp866_complete("Ёлка ёжик ЁЖИК");
drawMixedText(10, 30, yoTest.c_str(), TFT_RED);
каюсь что лень, и совершенно нет времени сидеть вникать)))
если скинете ссылку на что то готовое, я подозреваю что она не будет работать с текстом отправленным через сайт… но это не точно
#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
0x77, 0x08, 0x7F, 0x08, 0x77, // Ё 0xF0
0x2C, 0x50, 0x7C, 0x50, 0x2C, // ё 0xF1
};
// Упрощенная структура для bitmap шрифта
typedef struct {
const uint8_t *bitmap;
uint16_t first;
uint16_t last;
uint8_t width;
uint8_t height;
} RusFont;
const RusFont SystemRus5x7Font = {
SystemRus5x7Bitmaps,
0x20, // first
0xF1, // last
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) {
// Если символ не в диапазоне, используем стандартный шрифт
tft.setCursor(x, y);
tft.setTextColor(color);
tft.print((char)char_code);
return;
}
// Вычисляем индекс в массиве bitmap
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 drawMixedText(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;
}
// Для ASCII символов используем стандартный шрифт
if ((unsigned char)text[i] < 0x80) {
tft.setCursor(cursor_x, cursor_y);
tft.setTextColor(color);
tft.print(text[i]);
cursor_x += 6; // Ширина стандартного шрифта
} else {
// Для русских символов используем наш шрифт
drawRussianChar(cursor_x, cursor_y, (uint8_t)text[i], color);
cursor_x += SystemRus5x7Font.width + 1;
}
}
}
// Улучшенная конвертация UTF-8 → CP866
String utf8_to_cp866_complete(const String &utf8_str) {
String result = "";
int i = 0;
while (i < utf8_str.length()) {
byte c = utf8_str[i];
// Обработка русских букв (UTF-8 двухбайтовые последовательности)
if (c == 0xD0) { // Первый байт русских букв
if (i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
// Заглавные русские буквы А-Я (кроме Ё)
if (c2 >= 0x90 && c2 <= 0xBF) {
result += (char)(0x80 + (c2 - 0x90)); // CP866: 0x80-0xAF
i++;
}
// Буква Ё
else if (c2 == 0x81) {
result += (char)0xF0; // Ё в CP866
i++;
}
else { result += (char)c; // Неизвестный символ
}
}
}
else if (c == 0xD1) { // Второй байт русских букв
if (i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
// Строчные русские буквы а-я (кроме ё)
if (c2 >= 0x80 && c2 <= 0x8F) {
result += (char)(0xA0 + (c2 - 0x80)); // CP866: 0xA0-0xAF
i++;
}
// Буква ё
else if (c2 == 0x91) {
result += (char)0xF1; // ё в CP866
i++;
} else { result += (char)c; // Неизвестный символ
}
}
}
// Все остальные символы (ASCII)
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);
tft.setTextSize(1);
Serial.println("System ready!");
}
void loop() {
// Тест 1: Русские буквы
tft.fillScreen(TFT_BLACK);
String uppercase = utf8_to_cp866_complete("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
drawMixedText(0, 10, uppercase.c_str(), TFT_GREEN);
String lowercase = utf8_to_cp866_complete("абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
drawMixedText(0, 30, lowercase.c_str(), TFT_YELLOW);
delay(3000);
// Тест 2: Смешанный текст
tft.fillScreen(TFT_BLACK);
String mixed = utf8_to_cp866_complete("Привет Hello Ёё Test 123");
drawMixedText(10, 30, mixed.c_str(), TFT_CYAN);
delay(3000);
// Тест 3: Английские символы
tft.fillScreen(TFT_BLACK);
String english = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 !@#$%^&*()";
drawMixedText(10, 30, english.c_str(), TFT_MAGENTA);
delay(3000);
// Тест 4: Ё и ё отдельно
tft.fillScreen(TFT_BLACK);
String yoTest = utf8_to_cp866_complete("Ёлка ёжик ЁЖИК");
drawMixedText(10, 30, yoTest.c_str(), TFT_RED);
delay(3000);
}
