Модули · статья
TFT-дисплей и Arduino: ST7735, ST7789 и ILI9341 без белого экрана
Цветной экран — первое, что превращает поделку в прибор. И первое, что встречает новичка белым прямоугольником вместо картинки. Разбираем по порядку: чем эти экраны отличаются друг от друга, почему пять вольт Arduino для них опасны, какая библиотека сколько занимает — числа мы измерили сборкой, а не переписали, — и что делать, когда экран белый, картинка съехала, а красный стал синим.
Чем TFT отличается от 1602 и от OLED
Экран 1602 умеет показывать только буквы и цифры: у него внутри готовая таблица знаков, и каждое знакоместо — отдельная ячейка. OLED рисует уже точками, но точки только двух состояний: светится или нет. TFT — это матрица точек, и каждая может быть любого из 65 тысяч цветов (столько передают библиотеки; сам контроллер умеет и 262 тысячи, но по проводам их обычно не гоняют). Отсюда и фотографии, и графики, и кнопки.
Второе отличие важнее для программы. У OLED картинка маленькая, и библиотека держит её копию прямо в памяти платы; у 1602 копии нет вовсе — знаки хранит сам экран, а плата шлёт ему только коды букв. У цветного экрана копия кадра — это сотни килобайт, и держать её в Arduino негде. Поэтому TFT работает иначе: картинка живёт в памяти самого экрана, а плата только отправляет команды «закрась вот этот прямоугольник таким цветом». Из этого следуют почти все особенности, о которых пойдёт речь ниже — и приятные, и не очень.
Если цвет не нужен, посмотрите соседние разборы: LCD 1602 по I2C — четыре провода и три килобайта на всё, OLED 0.96″ — графика без цвета. А если вы ещё выбираете, что вообще брать, начните с обзора какой дисплей выбрать.
Какой у вас экран: контроллер решает всё
Диагональ и цена — не главное. Главное — какая микросхема-контроллер стоит на плате экрана: от неё зависит и библиотека, и строка инициализации в скетче. Название обычно напечатано на самой плате или указано в описании товара.
| Контроллер | Диагонали | Точек | Что важно знать |
|---|---|---|---|
| ST7735 / ST7735S | 0,96″, 1,44″, 1,8″ | 80×160, 128×128, 128×160 | Самый дешёвый вход в цвет. Память контроллера — 132×162 точки, больше стекла: отсюда сдвиг картинки на пару точек. |
| ST7789 | 1,14″, 1,3″, 1,54″, 2,0″ | 135×240, 240×240, 240×320 | Обычно IPS: цвета не выцветают под углом. Такие панели работают с инверсией цвета, но библиотека Adafruit включает её сама. |
| ILI9341 | 2,2″, 2,4″, 2,8″, 3,2″ | 240×320 | Рабочая лошадка. Часто идёт со слотом microSD и резистивным сенсором на отдельной микросхеме. |
| ILI9486, ILI9488, HX8357 | 3,5″ | 320×480 | Обычно приходит шилдом на Mega. Под одной диагональю выпускают разные контроллеры, поэтому определяйте свой скетчем ниже, а не по размеру экрана. |
Отдельная порода — шилды: экран сразу с гребёнкой, надевается на плату сверху, проводов нет вовсе. Такие работают не по SPI, где к экрану идут пять сигнальных линий, а по широкой параллельной шине и занимают почти все выводы Uno, зато собираются за десять секунд: переходники и делители им не нужны, экран рассчитан на конкретную плату.
Как узнать, какой контроллер у вас
У шилда можно просто спросить. По параллельной шине экран умеет назвать свой номер: 0x9341 — это ILI9341, 0x9486 — ILI9486, и так далее. Загрузите этот скетч и посмотрите в монитор порта:
// Определитель контроллера для шилда, надетого на Uno.
// Шилд отвечает своим номером по параллельной шине — этого достаточно,
// чтобы понять, что за экран вам достался. Ответ появится в мониторе
// порта на скорости 9600.
// Нужны библиотеки MCUFRIEND_kbv и Adafruit GFX Library.
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
void setup() {
Serial.begin(9600);
uint16_t id = tft.readID(); // спросить у экрана, кто он
Serial.print("ID = 0x");
Serial.println(id, HEX); // 0x9341, 0x9486, 0x8357 и так далее
// ведущие нули не печатаются:
// 0x154 — это на самом деле 0x0154
// Часть шилдов отвечать не умеет и выдаёт 0xD3D3. Это не поломка:
// спросить у них нельзя, номер подставляем сами.
if (id == 0xD3D3) {
id = 0x9486;
}
tft.begin(id); // и сразу проверить: экран должен посинеть
tft.fillScreen(0x001F);
// Экран остался белым — этот номер библиотеке незнаком.
// Посмотрите наклейку на плате и подставьте номер оттуда.
}
void loop() {
}
С модулем на проводах так не выйдет. Чтобы экран мог ответить, нужна обратная линия, а её обычно не подключают — и правильно делают (почему, ниже). Здесь работают три других способа, по порядку:
- Прочитать надпись на самой плате: контроллер почти всегда подписан прямо на ней или на наклейке.
- Посмотреть описание товара: у части экранов контроллер назван прямо в характеристиках — строкой «Контроллер: ST7735S» или «Чип: ILI9341». Если такой строки нет, посмотрите ссылку на паспорт микросхемы внизу карточки.
- Считать выводы. Восемь-десять контактов в ряд и подпись SCK/SDA — это SPI-модуль; два ряда по два десятка — шилд с параллельной шиной.
Ошибиться контроллером не страшно: экран не сгорит, а просто останется белым. Страшно ошибиться с напряжением — об этом следующий раздел.
Три вольта против пяти — та самая ловушка
Все перечисленные контроллеры рассчитаны на логику 3,3 вольта. В даташите ILI9341 сказано прямо: предельное напряжение на любом входе — питание плюс 0,3 вольта, то есть 3,6 В, а выше «прибор может быть повреждён безвозвратно». У Arduino Uno на выводах ровно пять вольт.
При этом «единицу» контроллер видит уже с 2,31 вольта. То есть пять вольт не нужны ни для чего — они только вредят.
Модули бывают трёх видов, и различить их можно по самой плате:
- С преобразователем уровней. Рядом с гребёнкой стоит микросхема на 8–20 ножек. Такой модуль честно работает и от 5 В, и от 3,3 В. Пример из нашего магазина — дисплей 2,8″ со шлейфами: в описании так и написано, что преобразователь уровней на борту.
- Только со стабилизатором питания. Есть маленькая деталь на три ножки — она делает из 5 В питания 3,3 В. Питание подать можно, а вот сигналы — нет: они идут прямо на контроллер. Так устроены наши экраны 1,8″ и 2,4″ — в описании товара честно сказано, что уровень единицы на входах не выше 3,3 В и при пятивольтовой плате нужны делители. Свой модуль проверяйте по этому же признаку: есть рядом с гребёнкой микросхема-буфер или нет.
- Без всего. И питание, и сигналы строго 3,3 В.
Понизить пять вольт до трёх с небольшим можно двумя способами.
Делитель из двух резисторов на каждой сигнальной линии: 1 кОм от вывода Arduino и 2 кОм с этой же точки на землю — получается 3,33 вольта. Подойдут и 1,8 кОм с 3,3 кОм (3,24 В), и 2,2 кОм с 3,3 кОм (3,0 В) — все три варианта выше порога единицы и ниже опасной границы. Ток при этом меньше 1,7 мА при разрешённых двадцати.
Микросхема-буфер — аккуратнее и быстрее. Годятся 74HC4050 (её входы по паспорту терпят до 15 вольт) или 74LVC245. Или готовый модуль преобразователя уровней — 53 ₽ на 22.08.2026. У него четыре канала, а понижать нужно пять линий: берите два модуля либо оставьте сброс на простом делителе — он срабатывает один раз при запуске.
Обратную линию MISO у экрана подключать не нужно. Во-первых, скетч почти никогда ничего из экрана не читает. Во-вторых, понижать её нельзя: Arduino ждёт на входе не меньше 3 вольт, а после делителя осталось бы 2,2 — и связь бы не заработала. В-третьих, некоторые экраны не отпускают эту линию, даже когда обращаются не к ним, и мешают соседям на той же шине — об этом предупреждает комментарий в файле настроек библиотеки TFT_eSPI.
Важная оговорка: сказанное относится к MISO самого экрана. У карты памяти и у сенсорной панели MISO — рабочая линия: по ней они отвечают, и её подключать обязательно.
Как подключить к Uno: восемь проводов
Данные идут по шине SPI. Два вывода на ней жёстко закреплены за платой: у Uno и Nano это 13 — такт и 11 — данные, у Mega — 52 и 51. Остальные три (выбор экрана, «команда или данные», сброс) можно посадить на любые свободные выводы, лишь бы те же номера были записаны в скетче.
Про подсветку стоит сказать отдельно. Это самостоятельная цепочка светодиодов, и ест она прилично: у панели 2,8 дюйма паспортные 60 мА, максимум 80. А вывод 3,3 вольта на Uno и Mega по документации отдаёт всего 50 мА — и с него же должна питаться логика экрана, а иногда и карта памяти. Отсюда правило: подсветку экрана 2,4 дюйма и крупнее не вешайте на вывод 3,3 В самой платы. Сам вывод LED у таких модулей рассчитан на 3,3 вольта, так что питать его нужно от отдельного источника на 3,3 В — или от пяти вольт, но через транзистор либо свой резистор, подобранный под конкретный модуль.
Сколько выводов останется. Экран по SPI занимает пять: два общих для всей шины и три своих. Карта памяти добавляет свой выбор и обратную линию — семь; сенсор — столько же или на один больше. У Uno цифровых выводов четырнадцать, так что место под кнопки и датчик остаётся. А вот шилд с параллельной шиной забирает почти все выводы сразу — под ним свободными остаются считанные штуки.
Если проводов не хочется совсем, есть готовые шилды. Наш 2,8″ шилд для Uno с сенсором надевается на плату сверху, а 3,5″ шилд — на Mega. Ни делителей, ни проводов, но выводы платы под ними почти все заняты.
Библиотеки и сколько они стоят в байтах
Мы собрали один и тот же скетч — рамка по краю экрана и слово Hello — с каждой из библиотек и записали, что показал компилятор. Плата Arduino Uno: 32 256 байт флеша под программу и 2 048 байт оперативной памяти. Дата замера — 22 августа 2026 года, сборка через arduino-cli с ядром arduino:avr 1.8.8, библиотеки из нашего каталога.
| Связка библиотек | Флеш | ОЗУ | Замечания |
|---|---|---|---|
| Adafruit GFX + ILI9341 (2,4″) | 10 460 (32 %) | 253 (12 %) | Самая экономная из связок Adafruit. |
| Adafruit GFX + ST7735 (1,8″) | 11 822 (36 %) | 424 (20 %) | На 171 байт ОЗУ дороже соседней строки. Почему — ниже. |
| Adafruit GFX + ST7789 (240×240) | 11 574 (35 %) | 429 (20 %) | Тот же пакет, что у ST7735. |
| TFT_eSPI, настройки по умолчанию | 34 678 — не влезает | 256 (12 %) | 107 % флеша Uno: скетч слишком большой. |
| TFT_eSPI, лишние шрифты отключены | 11 578 (35 %) | 216 (10 %) | Влезает, но настройка живёт внутри библиотеки. |
| MCUFRIEND_kbv (шилд на Uno) | 14 606 (45 %) | 232 (11 %) | Для шилдов. Adafruit GFX ставится отдельно. |
| MCUFRIEND_kbv + сенсор | 16 798 (52 %) | 252 (12 %) | Сенсор добавил 2 192 байта флеша и 20 байт ОЗУ. |
Вывод простой: цветной экран стоит примерно треть флеша Uno. Это много, но терпимо — места хватит и на датчик, и на кнопки. А вот дальше начинается интересное.
Две находки, которых нет в документации
Мы посмотрели не только итоговые цифры, но и то, из чего они складываются — разобрали готовую прошивку по именам переменных. Нашлись две вещи, за которые платит каждый.
Первая: 175 байт памяти уходят на Serial, которого в скетче нет. В нашем примере со ST7735 связь с компьютером не используется ни разу, но в прошивке лежит объект Serial на 157 байт плюс служебная таблица на 18. Причина — одна отладочная строка в файле для совсем другого экрана (ST7796S) внутри той же библиотеки: Arduino собирает все файлы библиотеки подряд. Мы проверили: если этот файл убрать, скетч худеет с 11 822 до 11 084 байт флеша и с 424 до 249 байт ОЗУ. Это 8,5 % всей памяти Uno, потерянные ни за что. У соседней библиотеки ILI9341 такого файла нет — вот почему она в таблице экономнее.
Вторая: 112 байт занимает шина I2C, которой вы не пользуетесь. Графическое ядро Adafruit подключает вспомогательную библиотеку BusIO, а та тянет за собой I2C — вместе с тремя буферами по 32 байта. Цветной экран работает по SPI и к I2C отношения не имеет, но буферы всё равно в прошивке.
Практический смысл: если на Uno не хватает считанных сотен байт, не переписывайте программу — сначала посмотрите, что в неё попало без спроса. Почти две сотни байт можно вернуть, ничего не меняя в своём коде.
Первый скетч: рамка и надпись
Этот код мы собрали перед публикацией — он компилируется как есть. Нужны три библиотеки: Adafruit GFX Library (общая графика), Adafruit BusIO (её обязательная спутница) и Adafruit ST7735 and ST7789 Library (драйвер экрана). Ставятся из менеджера библиотек по названию.
// Первый скетч для цветного экрана на ST7735 (1,8 дюйма, 128×160).
// Собран и проверен: 11 822 байта флеша и 424 байта ОЗУ на Arduino Uno.
// Нужны три библиотеки: Adafruit GFX Library, Adafruit BusIO
// (без неё GFX не собирается) и Adafruit ST7735 and ST7789 Library.
//
// ВНИМАНИЕ: сигналы этого экрана — 3,3 вольта. На линиях 13, 11, 10, 9
// и 8 между Arduino Uno и модулем обязательны делители 1 кОм / 2 кОм
// или преобразователь уровней, иначе модуль выйдет из строя.
#include <Adafruit_GFX.h> // общая графика: линии, рамки, текст
#include <Adafruit_ST7735.h> // драйвер именно этого контроллера
#include <SPI.h> // шина, по которой идут данные
#define TFT_CS 10 // выбор экрана
#define TFT_DC 9 // команда или данные
#define TFT_RST 8 // сброс
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup() {
// BLACKTAB — вариант по цвету ярлычка на защитной плёнке экрана.
// Картинка съехала на пару точек — попробуйте INITR_GREENTAB.
// Если после этого красный стал синим, вернитесь на BLACKTAB:
// от варианта зависит и сдвиг, и порядок цветовых каналов.
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST77XX_BLACK); // залить экран чёрным
tft.drawRect(0, 0, 128, 160, ST77XX_RED); // рамка по краю
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2); // 2 — двойной размер букв
tft.setCursor(12, 70);
tft.print("Hello");
}
void loop() {
}
Если цифры на экране меняются, не стирайте экран целиком — именно из-за этого он и мерцает. Достаточно печатать текст сразу с фоном:
// Цифры, которые меняются, без мерцания.
// Секрет в одной строке: setTextColor с ДВУМЯ цветами печатает текст
// вместе с фоном, поэтому старая цифра закрашивается сама.
// Стирать экран через fillScreen на каждом шаге — как раз и есть
// причина мигания, на которое жалуются чаще всего.
//
// Оговорка: фон под текстом умеет рисовать только встроенный шрифт.
// Для крупных шрифтов и для русских букв через U8g2 старое значение
// стирают вручную: tft.fillRect(x, y, ширина, высота, ST77XX_BLACK).
//
// И то же предупреждение: сигналы экрана — 3,3 вольта, с Arduino Uno
// нужны делители или преобразователь уровней.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int seconds = 0;
void setup() {
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST77XX_BLACK);
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK); // текст и фон под ним
tft.setCursor(10, 20);
tft.print("Sekundy:");
}
void loop() {
tft.setCursor(10, 60);
tft.print(seconds);
tft.print(" "); // хвост пробелов затирает лишние цифры
seconds++;
delay(1000);
}
TFT_eSPI на Uno: 107 процентов флеша
Про библиотеку TFT_eSPI в интернете пишут, что она самая быстрая. Это правда — но не для Uno. Мы собрали ею тот же скетч с настройками по умолчанию: получилось 34 678 байт при 32 256 доступных, то есть 107 %. Компилятор отвечает «Скетч слишком большой».
Это не случайность: автор пишет в описании прямо — библиотека сделана для 32-разрядных процессоров, а оптимизирована под RP2040, STM32, ESP8266 и ESP32. Восьмибитная Uno в эту рамку не попадает. При этом формально библиотека помечена как совместимая со всеми платами — поэтому и ставится без предупреждений, а падает уже на размере.
Если очень нужно, влезть можно: мы отключили лишние встроенные шрифты и получили 11 578 байт флеша и 216 байт ОЗУ — по оперативной памяти это самый экономный вариант из всех проверенных, хотя по флешу связка Adafruit с ILI9341 всё равно легче. Точное число зависит от того, какие именно шрифты вы отключите. Но есть неприятность: настройки этой библиотеки живут не в скетче, а внутри самой библиотеки, в файле User_Setup.h. Их правят вручную, и при обновлении библиотеки правки теряются. Для первого экрана это плохой выбор; для ESP32 — отличный.
Отсюда же растут ошибки, которые изредка попадают в нашу статистику: «TFT_RAMWR was not declared in this scope» и «unterminated #ifndef». Обе означают одно: в настройках библиотеки не выбран драйвер экрана. Лечится правкой того же файла, а не скетча.
Память: кадр не помещается, а экран всё равно работает
Полная копия картинки для экрана 240×320 занимает 153 600 байт — это в 75 раз больше всей оперативной памяти Uno. Для 1,8-дюймового 128×160 — 40 960 байт, больше даже флеша. Кажется, что цветной экран на Uno невозможен. Но он работает — и вот почему.
Копию кадра держит сам экран: у ILI9341 внутри 172 800 байт собственной памяти — он хранит по 18 бит на точку, а библиотека шлёт по два байта, отсюда и разница между 172 800 и 153 600. Плата туда только пишет. Поэтому цветной экран съедает оперативной памяти меньше, чем монохромный OLED, чья библиотека честно хранит копию кадра в Arduino.
Обратная сторона: раз копии кадра в плате нет, нельзя нарисовать новый кадр «за кулисами» и показать целиком. Всё рисование видно глазу — отсюда мерцание, о котором спрашивают на форумах. Лечится не библиотекой, а приёмом: перерисовывать только то, что изменилось.
Скорость тоже упирается в это. Шина SPI на Arduino Uno работает максимум на 8 МГц. Полный кадр 240×320 — это 1 228 800 бит, то есть около 0,15 секунды: не больше шести-семи кадров в секунду. Это деление объёма данных на частоту, то есть верхняя граница; на деле выйдет меньше — мы её на живом экране не мерили и цифру из головы брать не будем. Для приборов и меню этого хватает, для анимации — нет. У ESP32 частота обмена выше в несколько раз, и там кадр уходит за десятки миллисекунд.
Русский текст, картинки и что ещё влезет
Своих русских букв у графики Adafruit нет: встроенный шрифт латинский, и «Привет» выйдет мусором. Рабочее решение — библиотека-переходник U8g2_for_Adafruit_GFX: она приносит сотни шрифтов, среди которых есть кириллические, и понимает русский текст прямо из скетча.
// Русские буквы на цветном экране.
// Своих кириллических шрифтов у графики Adafruit нет, зато есть
// библиотека-переходник U8g2_for_Adafruit_GFX: она приносит сотни
// шрифтов U8g2 и понимает текст в UTF-8 прямо из скетча.
// Измерено: 18 122 байта флеша (56 %) и 500 байт ОЗУ на Uno —
// то есть кириллица стоит 6 300 байт флеша.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
U8G2_FOR_ADAFRUIT_GFX u8g2;
void setup() {
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST77XX_BLACK);
u8g2.begin(tft); // рисовать поверх этого экрана
u8g2.setFontMode(1); // 1 — фон под буквами не трогать
u8g2.setFontDirection(0);
u8g2.setForegroundColor(ST77XX_WHITE);
u8g2.setFont(u8g2_font_6x12_t_cyrillic); // шрифт с русскими буквами
u8g2.setCursor(12, 70);
u8g2.print("Привет");
}
void loop() {
}
Дальше — таблица, ради которой мы собирали скетчи по одному. Каждая строка — это экран плюс одна добавка, а не всё сразу: мы собрали и всё сразу — экран, датчик, русские буквы и запись на карту: вышло 29 664 байта флеша (91 %) и 1 192 байта ОЗУ (58 %). В Uno это уже впритык.
| Что в скетче | Флеш | ОЗУ | Комментарий |
|---|---|---|---|
| Экран ST7735 — отправная точка | 11 822 (36 %) | 424 (20 %) | Рамка и слово Hello. |
| Экран и датчик DHT11: термометр | 14 280 (44 %) | 453 (22 %) | Готовый прибор — меньше половины платы. |
| Экран и русские буквы | 18 122 (56 %) | 500 (24 %) | Кириллица стоит 6 300 байт флеша. |
| Экран и карта microSD | 20 032 (62 %) | 1 073 (52 %) | Скетч читает файл с карты; половина ОЗУ уходит на её буфер. |
Про картинки. Маленькую можно зашить в саму программу массивом точек. Но арифметика беспощадна: картинка во весь экран 1,8 дюйма — это 40 960 байт, и такой массив просто не соберётся, компилятор скажет, что переменная слишком велика. Большие изображения читают с карты памяти — и тогда смотрите последнюю строку таблицы: карта забирает половину оперативной памяти под свой буфер.
Если скетч не влез
Компилятор написал «Скетч слишком большой» — не переписывайте программу сразу. Сначала отдайте то, что занимает место молча. Порядок — по возрастанию хлопот: начните с того, что делается за минуту.
- Уберите лишний файл из библиотеки ST7735 — тот самый, из-за которого в прошивку попадает Serial. Это 738 байт флеша и 175 байт ОЗУ даром. Оговорка та же, что у TFT_eSPI: правка живёт внутри библиотеки и пропадёт при её обновлении, а экраны ST7796S после неё собираться перестанут.
- Откажитесь от красивого шрифта. Один графический шрифт — это тысячи байт; встроенный мелкий уже входит в библиотеку.
- Оберните тексты в F(). Каждая строка в кавычках без этого лежит в оперативной памяти постоянно, а с F() — во флеше и читается по мере надобности.
- Откажитесь от карты памяти или вынесите её в отдельный проект: она забирает 8 килобайт флеша и половину ОЗУ.
- Смените плату. У Mega памяти в восемь раз больше по флешу и в четыре по ОЗУ, у ESP32 — в сотню раз по флешу и в две с лишним сотни по ОЗУ. Ни один приём экономии столько не даст.
Что именно тратит память и как её считать, разобрано отдельно: память Arduino.
Белый экран и другие странности: что проверять
Белый прямоугольник вместо картинки — вопрос номер один на форумах. Он означает ровно одно: подсветка работает, а контроллер не получил ни одной понятной команды. Дальше — таблица симптомов; она покрывает почти всё, о чём спрашивают.
| Что видно | Почему так | Что делать |
|---|---|---|
| Белый экран, подсветка горит | Контроллер не получил ни одной команды: перепутаны такт и данные, не подключён сброс, нет 3,3 В на логике или в скетче выбран не тот драйвер. | Проверьте по очереди: питание → земля → вывод 13 (такт) и 11 (данные) → DC и RST → строку инициализации. |
| Чёрный экран, ничего не светится | Не запитана подсветка. Это отдельная цепь, к контроллеру отношения не имеет. | Подайте питание на вывод LED или BLK. Если экран заработал — дело было только в подсветке. |
| Картинка сдвинута, по краю полоса мусора | У контроллера памяти больше, чем точек на стекле, и завод сам решает, откуда начинается видимая область. | Попробуйте INITR_GREENTAB вместо INITR_BLACKTAB: сдвиг задаётся только у зелёного варианта. Если при этом красный станет синим — вернитесь обратно, у этих вариантов разный порядок цветов. |
| Цвета вывернуты наизнанку | Панель ждёт инверсии, а библиотека её не включила — или наоборот. | Вызовите invertDisplay(true) или invertDisplay(false) после инициализации. |
| Красный показывается синим | Разный порядок цветовых каналов в партиях модулей: RGB против BGR. | Порядок каналов привязан к варианту инициализации: только у INITR_BLACKTAB он прямой, у остальных обратный. Верните BLACKTAB. |
| Изображение зеркальное или вверх ногами | Так стоит поворот. Один регистр контроллера переставляет строки, столбцы и их порядок. | Подберите setRotation(0), (1), (2) или (3) — все четыре положения экрана перебираются за минуту. |
| Рябь, случайные точки, мусор при движении | Срыв обмена: слишком высокая частота для длинных проводов, нет общей земли или сигнал ослаблен делителями. | Укоротите провода, соедините земли, снизьте частоту обмена. У ST7735 и ST7789 её задают после запуска: tft.setSPISpeed(4000000). У ILI9341 это параметр запуска: tft.begin(4000000). |
| Экран мерцает при обновлении цифр | Копии кадра в плате нет: стирание фона и рисование новых цифр видны глазу как отдельные события. | Не перерисовывайте весь экран. Печатайте текст с фоном — старые пиксели закрасятся сами, без вспышки. |
Про сдвиг картинки стоит сказать подробнее, потому что выглядит он как брак, а брака никакого нет.
Ошибки сборки: что мы видим в своей статистике
Trema IDE присылает нам обезличенные отчёты о неудачных сборках. За последний месяц почти каждая пятая группа ошибок (18,6 %) связана с экранами, а среди ошибок «библиотека не найдена» экранные составляют больше трети. И почти все они — с плат на ATmega: Uno и Nano, 90,6 %. То есть на тех самых 32 килобайтах, о которых шла речь выше. Вот что ломается чаще всего — и что с этим делать.
- Adafruit_GFX.h: No such file or directory. Второй по частоте пропавший заголовок во всей нашей базе. Графика Adafruit — это две библиотеки: сама Adafruit GFX Library и Adafruit BusIO. Без второй первая не собирается, и ошибка приходит уже из её недр — «Adafruit_I2CDevice.h не найден». Ставьте обе.
- UTFT.h: No such file or directory. Библиотеку UTFT часто советуют в старых статьях и инструкциях, но в менеджере библиотек её нет — мы проверили по каталогу. Её ставят архивом вручную. Если не хочется возиться, тот же экран прекрасно работает с библиотеками Adafruit из примеров выше.
- begin() is protected within this context. У экранов ST7735 и ST7789 команда tft.begin() спрятана внутрь библиотеки — снаружи её вызвать нельзя. Правильные — tft.initR(INITR_BLACKTAB) для ST7735 и tft.init(240, 240) для ST7789. Скетч, скопированный из статьи про другой экран, спотыкается именно здесь.
- ST7789_GREEN was not declared. В статистике это единичный случай, но спотыкаются об него регулярно: цвета в этой библиотеке называются с приставкой ST77XX_ — ST77XX_GREEN, ST77XX_WHITE. Старые примеры из интернета написаны под прежние имена.
- TFT_ILI9341 does not name a type; did you mean Adafruit_ILI9341? Это две разные библиотеки для одного и того же экрана, с разными командами. Подсказка компилятора здесь не предлагает исправление — она сообщает, что установлена не та библиотека.
Разбор остальных ошибок сборки — в справочнике ошибок, а про установку библиотек есть отдельная страница с таблицей «файл .h → библиотека».
Сенсорный экран: что нужно знать заранее
Сенсорный слой — это отдельное устройство, приклеенное поверх стекла. Он бывает двух видов, и различить их можно на ощупь.
Резистивный — плёнка, которая слегка прогибается; работает ногтем и стилусом, срабатывает от нажатия. Такой стоит на наших экранах 2,4″ и 2,8″ на 240×320: там он управляется отдельной микросхемой (HR2046, она же XPT2046 или ADS7843) по той же шине SPI, но со своим выводом выбора. Отдаёт не координаты, а сырые числа с датчика, поэтому его обязательно калибруют: без этого нажатие «уезжает» в сторону. У шилда с аналоговым сенсором библиотека добавила 2 192 байта флеша — и это ещё до меню и калибровки; у модулей с отдельной микросхемой к этому добавится её библиотека.
Ёмкостный — гладкое стекло, как у телефона, работает только пальцем. Общается по двум проводам I2C, выводов меньше, зато адрес у популярной микросхемы GT911 зависит от того, как дёрнулись выводы при включении — отсюда жалобы «то видится, то нет».
Сенсор питайте от тех же 3,3 вольт, что и экран. Сама микросхема по паспорту работает от 2,7 до 5,25 вольта, и предельно допустимое для неё — 6, так что пять вольт её не сожгут. Опасно другое: сенсор сидит на общей с дисплеем шине, и, запитанный от пяти вольт, он выставит пятивольтовые уровни на линиях, которые идут к трёхвольтовому контроллеру экрана. Поэтому сенсор питают от тех же 3,3 В, что и дисплей, а не «отдельно».
Честный совет: сенсор нужен, только если в проекте есть меню или ввод. Две кнопки и крутилка решают ту же задачу дешевле, надёжнее и без калибровки — а сэкономленную память лучше потратить на что-то полезное.
Что купить и с чего начать
Цены и наличие — с карточек товаров на 22 августа 2026 года; каждую мы открыли отдельно и проверили, что товар действительно готов к отправке.
Цветной TFT 1,8″ 128×160 на ST7735S
Самый дешёвый вход в цветную графику: 128 на 160 точек, шина SPI, на обороте слот для карты памяти. Питание 3,3–5 В, но сигналы строго 3,3 — с Uno нужны делители или преобразователь уровней. Тот самый экран, для которого написан первый скетч и собрана отправная строка таблицы памяти.
Наш дисплей 2,8″ 320×240 со шлейфами
Разработан нашей компанией. Главное отличие: по описанию товара преобразователь уровней уже стоит на плате — заявлена работа и с трёхвольтовой, и с пятивольтовой логикой, без делителей. Есть регулировка яркости подсветки, сенсорная панель и шлейфы в комплекте, а корпус собирается из ПВХ-конструктора.
Ещё варианты, все с подтверждённым наличием:
- TFT 2,4″ 240×320 на ILI9341 с сенсором и слотом карты — 890 ₽. Обратите внимание на перемычку J1 на обороте: её замыкают при питании 3,3 В и оставляют разомкнутой при 5 В.
- TFT 2,8″ 240×320 на ILI9341, сенсорный — 1 132 ₽, то же самое крупнее.
- Шилд 2,8″ прямо на Uno, с сенсором и стилусом — 1 575 ₽. Разработан под Uno и надевается на неё без единого провода.
- Шилд 3,5″ 480×320 для Mega — 1 860 ₽. Плата помощнее и экран покрупнее: у Mega флеша в восемь раз больше, а оперативной памяти — в четыре.
- Преобразователь уровней 5 В → 3,3 В — 53 ₽ за четыре канала. Линий пять, так что берите два модуля или оставьте сброс на делителе.
Плату, если её ещё нет: Piranha Uno R3 (860 ₽) — наш аналог Uno российского производства, полностью совместимый по выводам и скетчам; у него мощнее встроенные стабилизаторы, а это как раз про подсветку экрана. Но памяти в нём ровно столько же, сколько у Uno: если планируете экран вместе с картой памяти и русскими шрифтами, берите плату другого класса — Mega или ESP32. Подробнее про платы — на странице платы Arduino, а про модули Trema — на странице модули для Arduino.
Цветной экран в Trema IDE
Всё, о чём написано выше, мы собирали в Trema IDE и в её консоли. Что она берёт на себя в этой теме:
- Библиотеки ставятся из окна ошибки. Скетч не собрался из-за Adafruit_GFX.h — программа сама предложит нужную библиотеку и поставит её вместе с зависимостями, чтобы не повторилась история с забытой BusIO.
- Каталог работает из России. Официальный сервер Arduino отвечает нашим пользователям 403; библиотеки приходят из нашего каталога. Замеры для этой статьи мы делали ровно так же.
- Ошибки объясняются по-русски. Вместо простыни английского текста — карточка с объяснением и подсказкой. Разборы мы дописываем по этой же статистике: экранные ошибки из списка выше — ближайшие в очереди.
- Видно, сколько осталось памяти. После сборки прямо в консоли написано, сколько байт заняла программа — те самые числа, что в таблицах выше.
Частые вопросы про TFT-дисплеи
Почему TFT-дисплей показывает белый экран?
Белый прямоугольник означает, что подсветка работает, а контроллер не получил ни одной понятной команды. Проверяйте по порядку: питание и общая земля, вывод такта (у Uno это 13) и данных (11), выводы DC и RST, и только потом строку инициализации в скетче.
Можно ли подключить TFT к Arduino Uno напрямую?
Питание — можно, сигналы — нет. Контроллеры этих экранов рассчитаны на 3,3 вольта, а Uno выдаёт пять; по паспорту ILI9341 напряжение выше 3,6 вольта может вывести микросхему из строя. Нужен делитель из двух резисторов на каждую линию (1 кОм и 2 кОм), микросхема-буфер вроде 74HC4050 или модуль, где преобразователь уровней уже стоит на плате.
Сколько памяти занимает TFT-дисплей на Arduino Uno?
Мы измерили сборкой: скетч с рамкой и надписью на экране ST7735 занял 11 822 байта флеша (36 процентов) и 424 байта оперативной памяти. Тот же экран вместе с картой памяти — уже 20 032 байта флеша и 1 073 байта ОЗУ, то есть больше половины памяти платы.
Работает ли библиотека TFT_eSPI на Arduino Uno?
С настройками по умолчанию — нет: скетч собирается в 34 678 байт при 32 256 доступных, компилятор отвечает, что скетч слишком большой. Если отключить лишние встроенные шрифты, влезает в 11 578 байт, но настройки правятся внутри самой библиотеки и теряются при её обновлении. Эта библиотека рассчитана на ESP32, ESP8266, STM32 и RP2040.
Почему картинка сдвинута на пару точек и по краю полоса мусора?
Это не брак. У контроллера ST7735 памяти на 132 на 162 точки, а стекло меньше — 128 на 160, и производитель модуля сам решает, какой кусок памяти видно. Библиотека называет заводские варианты цветом ярлычка: переберите INITR_BLACKTAB, INITR_GREENTAB и INITR_REDTAB.
Почему красный цвет на экране показывается синим?
У разных партий модулей отличается порядок цветовых каналов — RGB против BGR. В библиотеке он привязан к тому же варианту инициализации, что и смещение картинки, поэтому лечится сменой варианта. Если же наизнанку вывернуты все цвета сразу, помогает вызов invertDisplay.
Как вывести русские буквы на TFT-дисплей?
Встроенный шрифт графической библиотеки Adafruit латинский, и русский текст выйдет мусором. Рабочее решение — библиотека-переходник U8g2_for_Adafruit_GFX: она приносит шрифты с кириллицей и понимает текст прямо из скетча. В нашем замере это добавило 6 300 байт флеша.
Какая библиотека нужна для ST7735 и почему скетч не собирается?
Нужны Adafruit ST7735 and ST7789 Library вместе с Adafruit GFX Library, а к ней обязательна Adafruit BusIO: без неё сборка падает с сообщением, что не найден файл Adafruit_I2CDevice.h. Вторая частая причина — команда tft.begin: у экранов ST7735 и ST7789 она закрыта внутри библиотеки, и компилятор отвечает, что begin is protected within this context. Вместо неё вызывают tft.initR или tft.init.
Соберите первый цветной экран в Trema IDE
Библиотеки ставятся в один клик и работают из России, ошибки объясняются по-русски, а сколько осталось памяти — видно сразу после сборки. Дома бесплатно: через неделю попросит бесплатную регистрацию по почте — и всё. Дальше по теме: какой дисплей выбрать, OLED 0.96″, LCD 1602 по I2C, память Arduino, модули и шилды.
