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 жёстко привязана к одиннадцатому и тринадцатому пинам. Переназначить их в скетче нельзя — только через программную реализацию, которая работает в разы медленнее.
Что понадобится
- TFT дисплей 2,4″ на ILI9341, лучше с поддержкой 5 В
- Arduino UNO
- Провода «папа-мама»
- Резисторы для делителей — если модуль только на 3,3 В