Модули · статья

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 / ST7735S0,96″, 1,44″, 1,8″80×160, 128×128, 128×160Самый дешёвый вход в цвет. Память контроллера — 132×162 точки, больше стекла: отсюда сдвиг картинки на пару точек.
ST77891,14″, 1,3″, 1,54″, 2,0″135×240, 240×240, 240×320Обычно IPS: цвета не выцветают под углом. Такие панели работают с инверсией цвета, но библиотека Adafruit включает её сама.
ILI93412,2″, 2,4″, 2,8″, 3,2″240×320Рабочая лошадка. Часто идёт со слотом microSD и резистивным сенсором на отдельной микросхеме.
ILI9486, ILI9488, HX83573,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() {
}

С модулем на проводах так не выйдет. Чтобы экран мог ответить, нужна обратная линия, а её обычно не подключают — и правильно делают (почему, ниже). Здесь работают три других способа, по порядку:

  1. Прочитать надпись на самой плате: контроллер почти всегда подписан прямо на ней или на наклейке.
  2. Посмотреть описание товара: у части экранов контроллер назван прямо в характеристиках — строкой «Контроллер: ST7735S» или «Чип: ILI9341». Если такой строки нет, посмотрите ссылку на паспорт микросхемы внизу карточки.
  3. Считать выводы. Восемь-десять контактов в ряд и подпись 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. Остальные три (выбор экрана, «команда или данные», сброс) можно посадить на любые свободные выводы, лишь бы те же номера были записаны в скетче.

Arduino Unoчто между нимиTFT-модуль5 Весли на модуле есть стабилизаторVCCGNDобщая земля обязательнаGND13такт, только этот выводSCK / SCL11данные в дисплейSDA / MOSI10любой вывод, указывается в скетчеCS9команда или данныеDC / A0 / RS8сброс, тоже любой выводRSTотдельные 3,3 Вподсветка: с вывода платы её не питаютBLK / LEDОранжевая перемычка — делитель 1 кОм / 2 кОм: на этих линиях пять вольтнужно понизить до 3,3. MISO дисплея не подключаем: скетч из него ничего не читает.
Пять сигнальных линий идут только в одну сторону — от платы к дисплею, поэтому годится даже простой делитель из двух резисторов. Обратную линию MISO у дисплея лучше не подключать: некоторые модули не отпускают её, даже когда обращаются не к ним, и мешают соседям по шине. А вот у карты памяти и сенсорной панели эта линия рабочая — их подключают.

Про подсветку стоит сказать отдельно. Это самостоятельная цепочка светодиодов, и ест она прилично: у панели 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.

Флеш-память, байт из 32 256ОЗУ, байт из 2 048Индикатор на 4 цифрыTM1637Display1 44230Матрица 8×8LedControl1 35297LCD 1602 напрямуюLiquidCrystal1 66851LCD 1602 по I²CLiquidCrystal I2C3 126255Nokia 5110Adafruit PCD85449 428727TFT 2,4″ ILI9341Adafruit ILI934110 460253TFT 1,8″ ST7735Adafruit ST773511 822424OLED 0,96″Adafruit SSD130613 150350 + 1024 на буфер кадраОдна задача на всех экранах: показать надпись, а где можно — ещё и рамку
Смотрите на правый столбец. Цветной TFT занимает оперативной памяти меньше, чем монохромные OLED и Nokia 5110: картинку хранит сам экран, а их библиотеки держат копию кадра прямо в плате — 1 024 и 504 байта. По флешу цветной экран дороже простых индикаторов и символьного LCD, но не дороже OLED: у того своя графика и шрифты занимают 13 150 байт.

Обратная сторона: раз копии кадра в плате нет, нельзя нарисовать новый кадр «за кулисами» и показать целиком. Всё рисование видно глазу — отсюда мерцание, о котором спрашивают на форумах. Лечится не библиотекой, а приёмом: перерисовывать только то, что изменилось.

Скорость тоже упирается в это. Шина 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 байт флеша.
Экран и карта microSD20 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).
Экран мерцает при обновлении цифрКопии кадра в плате нет: стирание фона и рисование новых цифр видны глазу как отдельные события.Не перерисовывайте весь экран. Печатайте текст с фоном — старые пиксели закрасятся сами, без вспышки.

Про сдвиг картинки стоит сказать подробнее, потому что выглядит он как брак, а брака никакого нет.

Память контроллера ST7735: 132 × 162 точкиСтекло: 128 × 160видно только эту областьСерая кайма по краю — те самые лишние ячейки памяти. Если библиотека начнёт рисовать нес той ячейки, картинка съедет, а по краю пойдёт полоса мусора.Завод решает,с какой ячейки памятиначинается первыйвидимый пиксель.GREENTAB → 2 и 1BLACKTAB и REDTAB → 0 и 0MINI160x80 → 24 и 0
Полоса мусора по краю и сдвиг картинки на пару точек — не брак. У контроллера ST7735 памяти на 132 × 162 точки, а стекло меньше; какой кусок памяти виден, решает производитель модуля. Библиотека называет эти варианты «цветом ярлычка» на плёнке экрана.

Ошибки сборки: что мы видим в своей статистике

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 нужны делители или преобразователь уровней. Тот самый экран, для которого написан первый скетч и собрана отправная строка таблицы памяти.

482 ₽
В магазин
арт. 823 · цена и наличие на 22.08.2026

Наш дисплей 2,8″ 320×240 со шлейфами

Разработан нашей компанией. Главное отличие: по описанию товара преобразователь уровней уже стоит на плате — заявлена работа и с трёхвольтовой, и с пятивольтовой логикой, без делителей. Есть регулировка яркости подсветки, сенсорная панель и шлейфы в комплекте, а корпус собирается из ПВХ-конструктора.

1 080 ₽
В магазин
арт. 1143 · цена и наличие на 22.08.2026

Ещё варианты, все с подтверждённым наличием:

Плату, если её ещё нет: 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, модули и шилды.