#15.1 SSD1306 OLED-дисплей, вывод текста на русском языке в Arduino IDE

.#15.1 SSD1306 OLED-дисплей, вывод текста на русском языке в Arduino IDE

Как и обещал в предыдущем уроке ДисплейSSD1306 подключаем к Arduino. Выводим текст,рисуем фигуры. расскажу, как вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE.

 вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE

Для урока понадодиться:

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

1. Установить библиотеки Adafruit : библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX . Как их установить, я рассматривал в предыдущем уроке.

2. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться.

3. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

<code>/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
</code>

4. Добавить в блок void setup() {} следующую строчку кода.

<code>display.cp437(true);
</code>

5. При выводе русского текста использовать функцию utf8rus().

За основу возьмите скетч из урока 15. вывод “Hello, world!” на OLED-дисплей .

И сделайте все по инструкции выше . Замените строчку

<code>display.println("Hello,world!");
</code>

на

<code>display.println(utf8rus("Привет МИР!"));
</code>

В итоге. у вас должен получится код:

<code>#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,20);             
  display.println(utf8rus("Привет МИР!"));
  display.display();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
</code>

Вы уже умеете работать с выводом теста на дисплей

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

изменить размер текста и расположить по центру дисплея

Скетч данного примера будет вот таким.

<code>#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(27, 0);
  // Display static text
  display.setTextSize(2); // Draw 2X-scale text
  display.println(utf8rus("Привет"));
    display.setCursor(32, 30);
  // Display static text
  display.setTextSize(3); // Draw 3X-scale text
  display.println(utf8rus("МИР!"));
  display.display(); 
}
void loop() {
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
</code>

Ниже скетч вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE :

<code>#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  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();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
</code>

вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE

И напоследок, вот такой пример вывода спец символов букв и цифр , найден на просторах интернета.

<code>#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
unsigned char i1,i2,c3;
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
}
void loop() {
  TEST_display_1();
  delay(10000);
  TEST_display_2();
  delay(10000);
  TEST_display_3();
  delay(8000);
  TEST_display_4();
  delay(4000);
}
void TEST_display_1()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=0; i1<8; i1++) {
    for(i2=0; i2<16; i2++) {
      c3=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(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=8; i1<16; i1++) {
    for(i2=0; i2<16; i2++)
      display.write(i1*16+i2);
    display.println("");
  }
  display.display();
}
void TEST_display_3()
{
  display.clearDisplay(); 
  display.setTextColor(WHITE);
  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(WHITE);
  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 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}
</code>

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

Данный метод вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

Понравилась статья? Поделитесь ею с друзьями:

Файлы для скачивания

glcdfont.c glcdfont.c.zip2 Kb 1050 Скачать
Вернуться в раздел: Уроки Arduino: Подключение датчиков и модулей к Arduino Дата публикации 28 ноября , 2019

Комментарии

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

devindow
#8 devindow (8 марта, 2024 в 05:05)
В целом реализация плохая, русский язык ломается, если слишком часто вызывать эту функцию в коде, 4 ночь возился с этой проблемой, нигде не нашел нормальное решение русификации adafruit. Единственное, что помогло, так это выводить русские слова побуквенно: 
void loop(){  
display.setCursor(46 + pos_x, 24);
display.setTextSize(1);
display.print(utf8rus("Т"));
display.print(utf8rus("о"));
display.print(utf8rus("н"));
display.print(utf8rus("а"));
display.print(utf8rus("л"));
display.print(utf8rus("ь"));
display.print(utf8rus("н"));
display.print(utf8rus("о"));
display.print(utf8rus("с"));
display.print(utf8rus("т"));
display.print(utf8rus("ь"));
}
Если писать через такие извращения, то все выглядит прекрасно. Кроме кода.
Тимофей
#7 Гость: Тимофей (22 октября, 2022 в 23:37)

Русский язык вешается если хоть немного нагрузить контроллер

мармок
#1 мармок (2 декабря, 2019 в 13:10)
Вывод текста на русском языке супер.НО у меня вопрос можно ли выводить 1 текст на нескольких экранах сразу?

Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box