ELECTRONICS

TFT дисплей и Arduino: схема подключения ILI9341 по SPI, библиотека и скетч

ДисплеиСкетч проверен компиляцией

ILI9341 — контроллер, на котором собрано большинство недорогих цветных дисплеев с диагональю два и четыре десятых дюйма и разрешением двести сорок на триста двадцать точек. В отличие от монохромного OLED, здесь шестьдесят пять тысяч цветов, и на экран помещается настоящий интерфейс: графики, иконки, крупные цифры.

Расплата за это — количество проводов. Дисплей общается по шине SPI, и кроме питания ему нужны линия данных, тактовый сигнал, выбор устройства, переключатель команда-данные и сброс. Итого до девяти проводов, и в этом главная сложность подключения.

Схема подключения

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
VCCПитание. 5 В у модулей со стабилизатором, иначе только 3,3 В.
GNDЗемля.
CSВыбор устройства. Любой цифровой пин, обычно 10.
RESETСброс. Любой цифровой пин, обычно 8.
DCКоманда или данные. Любой цифровой пин, обычно 9.
MOSI (SDI)Данные в дисплей. На UNO только пин 11.
SCKТактовый сигнал. На UNO только пин 13.
LEDПодсветка. На 3,3 В или на ШИМ-пин для регулировки яркости.
MISO (SDO)Данные из дисплея. Часто не нужен.

Характеристики

Разрешение
240 × 320 точек
Диагональ
2,4–2,8″
Глубина цвета
16 бит, 65 536 цветов
Интерфейс
SPI, до 40 МГц
Логические уровни
3,3 В
Ток с подсветкой
около 100 мА

Главная ловушка: 3,3 вольта против 5

Контроллер ILI9341 рассчитан на логику три и три десятых вольта, а Arduino UNO выдаёт пять. Подключение напрямую иногда работает, но это лотерея: дисплей может сразу заработать, может показывать мусор, а может тихо деградировать неделями и потом умереть.

Правильных решений два. Первое — взять модуль, на котором уже стоят стабилизатор и преобразователь уровней; такие продаются как «5V compatible», у них на плате видна микросхема рядом с разъёмом. Второе — поставить делители из резисторов на каждую линию, идущую от платы к дисплею: две трети на землю, одна треть на сигнал. Линию MISO трогать не нужно, она идёт в обратную сторону.

Если экран остаётся белым, а библиотека не ругается — почти всегда виновато именно несогласование уровней или питание.

Библиотека

Adafruit ILI9341Ставится через менеджер библиотек и тянет за собой Adafruit GFX — общий движок для фигур, шрифтов и картинок. Нужны обе.

Готовый скетч

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>

#define TFT_CS  10
#define TFT_DC   9
#define TFT_RST  8

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  tft.begin();
  tft.setRotation(1);              // 1 — альбомная ориентация

  tft.fillScreen(ILI9341_BLACK);

  tft.setCursor(20, 40);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.println("Privet!");

  tft.setCursor(20, 90);
  tft.setTextColor(ILI9341_GREEN);
  tft.setTextSize(2);
  tft.println("ILI9341 rabotaet");

  // прямоугольник и круг — проверка графики
  tft.drawRect(15, 130, 200, 60, ILI9341_CYAN);
  tft.fillCircle(115, 160, 20, ILI9341_RED);
}

void loop() {
}

Скетч собирается arduino-cli под Arduino UNO

В отличие от OLED, здесь нет буфера в памяти платы и нет отдельной команды «показать»: каждая функция рисует сразу на экране. Оперативной памяти UNO на кадр в 240×320 всё равно не хватило бы.

Частые ошибки

Экран белый, ошибок нет

Классика для этого дисплея. Проверяйте в таком порядке: согласование уровней, питание подсветки, провода CS, DC и RST. Библиотека не умеет сообщать, что дисплей не отвечает, — она пишет вслепую.

Картинка есть, но цвета перевёрнуты

Часть модулей собрана на контроллере ST7789 или ILI9488, внешне неотличимом. Попробуйте библиотеку для другого контроллера — если цвета встанут на место, дело было в этом.

Дисплей работает пару минут, потом гаснет

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

Не хватает памяти при компиляции

Библиотека Adafruit со шрифтами занимает заметную часть флеш-памяти UNO. Для сложных интерфейсов лучше брать плату помощнее — например, ESP32.

Выбраны не те пины для MOSI и SCK

На UNO аппаратная шина SPI жёстко привязана к одиннадцатому и тринадцатому пинам. Переназначить их в скетче нельзя — только через программную реализацию, которая работает в разы медленнее.

Что понадобится