ESPsmart » Блог » Русский язык на дисплее OLED SSD1306 c ESP 8266
Приглашаем всех желающих, принять участие в тестировании системы управления микроконтроллерами ESP8266/ESP32. Принять участие.

Русский язык на дисплее OLED SSD1306 c ESP 8266



Библиотека ESP 8266 and ESP 32 Oled Driver for SSD1306 display by Daniel Eichhorn, Fabrice Weinberg не поддерживает русский язык, но есть способ, как добавить поддержку русского языка.

1. Если библиотека ESP 8266 and ESP 32 Oled Driver for SSD1306 display by Daniel Eichhorn, Fabrice Weinberg не установлена, то устанавливаем ее.
2. В папку со скетчем копируем файл fontsRus.h и подключаем его в скетч

#include "fontsRus.h"

3. Добавим новую функцию

byte FontUtf8Rus(const byte ch) { 
    static uint8_t LASTCHAR;

    if ((LASTCHAR == 0) && (ch < 0xC0)) {
      return ch;
    }

    if (LASTCHAR == 0) {
        LASTCHAR = ch;
        return 0;
    }

    uint8_t last = LASTCHAR;
    LASTCHAR = 0;
    
    switch (last) {
        case 0xD0:
            if (ch == 0x81) return 0xA8;
            if (ch >= 0x90 && ch <= 0xBF) return ch + 0x30;
            break;
        case 0xD1:
            if (ch == 0x91) return 0xB8;
            if (ch >= 0x80 && ch <= 0x8F) return ch + 0x70;
            break;
    }

    return (uint8_t) 0;
}


4. В setup() переопределяем функцию

display.setFontTableLookupFunction(FontUtf8Rus);

В качестве примера, рассмотрим подключение SSD1306 OLED дисплея c русским текстом, скетч ниже
#include <SSD1306Wire.h>
#include "fontsRus.h"
SSD1306Wire display(0x3c, 5, 4); // SDA - IO5 (D1), SCL - IO4 (D2) 

void setup() {
  Serial.begin(115200);
  display.init(); //  Инициализируем дисплей
  display.flipScreenVertically(); // Устанавливаем зеркальное отображение экрана, к примеру, удобно, если вы хотите желтую область сделать вверху
  display.setFontTableLookupFunction(FontUtf8Rus);
}

void loop() {
  display.clear(); // Очищаем экран
  
  display.drawRect(102, 2, 20, 8); // Пустой прямоугольник
  display.fillRect(104, 4, 4, 4); // Заполненный прямоугольник
  display.fillRect(110, 4, 4, 4); // Заполненный прямоугольник
  display.fillRect(116, 4, 4, 4); // Заполненный прямоугольник
  
  display.drawHorizontalLine(0, 14, 128); // Горизонтальная линия
  
  display.setFont(ArialRus_Plain_10); // Шрифт кегль 10
  display.drawString(0, 14, "Привет мир!");
  display.setFont(ArialRus_Plain_16); // Шрифт кегль 16
  display.drawString(0, 25, "Привет мир!");
  display.setFont(ArialRus_Plain_24); // Шрифт кегль 24
  display.drawString(0, 40, "Привет мир!");
  display.display(); // Выводим на экран
}

char FontUtf8Rus(const byte ch) { 
    static uint8_t LASTCHAR;

    if ((LASTCHAR == 0) && (ch < 0xC0)) {
      return ch;
    }

    if (LASTCHAR == 0) {
        LASTCHAR = ch;
        return 0;
    }

    uint8_t last = LASTCHAR;
    LASTCHAR = 0;
    
    switch (last) {
        case 0xD0:
            if (ch == 0x81) return 0xA8;
            if (ch >= 0x90 && ch <= 0xBF) return ch + 0x30;
            break;
        case 0xD1:
            if (ch == 0x91) return 0xB8;
            if (ch >= 0x80 && ch <= 0x8F) return ch + 0x70;
            break;
    }

    return (uint8_t) 0;
}

Комментарии

Гость виктор
от 24 июля 2023 19:35
Спасибо ! Работает.
от 3 октября 2023 13:07
invalid conversion from 'byte (*)(byte)' {aka 'unsigned char (*)(unsigned char)'} to 'FontTableLookupFunction' {aka 'char (*)(unsigned char)'} [-fpermissive]

Цитата: Никита
invalid conversion from 'byte (*)(byte)' {aka 'unsigned char (*)(unsigned char)'} to 'FontTableLookupFunction' {aka 'char (*)(unsigned char)'} [-fpermissive]

помогла замена с byte на char в:
char FontUtf8Rus(const byte ch)

Оставить комментарий