Подключение ili9341 к arduino и вывод русского текста

Дисплей ili9341 SPI подключение к Arduino. Русские символы и текст

от автора

в

Мы уже рассматривали подключение этого дисплея к Esp8266, но для ардуино информации по подключению и инициализации при использовании нормальных библиотек почти нет. А дисплей отлично подходит для многих проектов, большой, яркий, с неплохими углами обзора и лёгкий в программировании, благодаря библиотекам Adafruit.

ili9341 к Arduino UNO, русский текст и символы

Так как я собирался использовать библиотеку adafruit, то схему подключения взял с их официального сайта. Правда пин RST Не был здесь описан, а где-то в примере упоминалось (RST is optional). Сначала я его не стал подключать, но дисплей упорно не запускал демо-сцену.

TFT Screen Pins
Digital #13 or ICSP SCLK - This is the hardware SPI clock pin. 
Digital #12 or ICSP MISO - This is the hardware SPI Microcontroller In Serial Out pin.
Digital #11 or ICSP MOSI - This is the hardware SPI Microcontroller Out Serial In pin. 
Digital #10 - This is the TFT CS (chip select pin). 
Digital #9 - This is the TFT DC (data/command select) pin.

Потом вспомнил, что в proteus на таком же дисплее я подкидывал RST к питанию. Пинов питания на arduino не так много, поэтому я подключил его к 8 пину UNO, и вывел туда программно логическую “1”.

Подключение SPI дисплея ili9341 к Arduino UNO

В разрыв управляющих контактов нужно поставить сопротивления от 1 кОм до 2.2 кОм, потому-что логика дисплея не толерантна к 5В, ей нужно 3.3В. Я использую самодельные печатки с сопротивлениями, это всегда удобно.

Сопротивления для согласования 3.3 и 5

Примерами пользоваться не обязательно, для работы дисплея нужно минимум команд и инициализаций. Сначала установим необходимые библиотеки. Находим пункт “Инструменты” -> “Управление библиотеками”. В новых версиях при установке Adafruit ILI9341 система сама предложит вам установить все необходимые зависимости.

Adafruit ili9341 library

Но если этого не произошло, обязательно должна быть установлена библиотека Adafruit GFX.

adafruit GFX library

После установки подключаем эти библиотеки в тексте программы

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

Далее обозначаем выводы. Кстати выбор контактов 9 и 10 для DC и CS обусловлен конструкцией шилда от adafruit. Эти контакты можно заменить на те, которые удобно использовать вам. А вот с 11,12,13 уже ничего не сделать – это аппаратный SPI, но я встречал библиотеки, где и их можно эмулировать программно (естественно, теряя в скорости).

#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

Далее в блоке setup, установим для пина RSP (8) логическую единицу, и инициализируем дисплей.

void setup() {
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  tft.begin();

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

tft.setRotation(1);
tft.fillScreen(ILI9341_WHITE);
tft.setTextColor(ILI9341_BLACK);  tft.setTextSize(3);
tft.println("BITCOIN!");

Проверяем – работает.

Для разных экранов у меня не всегда сразу получалось вывести русские символы. Но в целом алгоритм один. Самое главное нужно заменить файл шрифтов в библиотеке adafruit GFX. Качаем его и заменяем оригинал. Обычно находится в этой папке, в моих документах.

Заменяем glcdfont.c для русского шрифта

Затем добавляем в текст программы (я добавляю в самый конец, после бесконечного цикла) следующую функцию, которая символы с кодами 0x00-0xBF пропускает без изменения, а в оставшихся кодах отбирает русские буквы и перекодирует их (в заменённом файле glcdfont.c)

#define maxString 21
char target[maxString + 1] = "";

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

Также в начале программы нужно добавить команду tft.cp437(true); (добавляю после tft.begin)

void setup() {
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  tft.begin();
  tft.cp437(true);

Ну и теперь командой tft.print(utf8rus(“ТЕКСТ”)); можно вывести русские символы

  tft.print(utf8rus("Биткоин"));

Смотрим результат:

Русский текст на дисплее arduino

В целом всё, кроме одной маленькой детали. Сразу у меня русский текст не заработал, а проблема была в том, что библиотека бралась с временных файлов temp, поэтому я удалил всё оттуда, перезапустил среду arduino IDE и всё заработало.


Комментарии

Один комментарий на ««Дисплей ili9341 SPI подключение к Arduino. Русские символы и текст»»

  1. […] я взял из прошлой статьи, разрешением 320х240, а границы считывания джойстика […]

Добавить комментарий