RisalDash RisalDash

Гайд · Дисплеи · Подключение

Как подключить дисплей к ESP32

Почти любой любительский дисплей работает и с Arduino (5 В), и с ESP32 (3.3 В) — причём ESP32 лучше подходит для графики, сенсора и Wi-Fi. На практике вы встретите четыре типа: монохромный OLED, цветной TFT, сенсорный TFT и панель E-Ink. Ниже — как каждый подключается и первые строки кода, чтобы его оживить.

ДисплеиOLEDTFTСенсорныеE-InkESP32
Четыре типа дисплеев для ESP32 и Arduino: OLED, цветной TFT, сенсорный TFT и E-Ink
Четыре экрана — четыре задачи. Выбор по шине, цвету, скорости и питанию.

Пока только выбираете? Соседний гайд сравнивает их лоб в лоб — OLED vs TFT vs E-Paper vs Nextion. А эта страница — практическая половина: схема и рабочий скетч для каждого.

ТипЧипыШинаЦветОбновлениеЛучше для
OLEDSSD1306 · SH1106I²Cмонобыстрочасы, статус, мини-UI
Цветной TFTST7789 · ILI9341 · ST7735SPI65kбыстропанели, графики, картинки
Сенсорный TFTILI9341 + XPT2046SPI (+тач)65kбыстроумный дом, пульты
E-InkWaveshare · GDEHSPIмоно / маломедленноценники, таблички, часы

1. OLED (SSD1306 / SH1106) — два провода, настоящий чёрный

Классический 0.96" OLED работает по I²C, поэтому нужны всего два сигнальных провода — SDA и SCL плюс питание. Высокая контрастность (пиксель реально выключен, подсветки нет), крохотное потребление и копеечная цена. 128×64 пикселя хватает на пару строк текста или маленький график — идеально для часов, погоды и строки статуса Wi-Fi/IP. SH1106 — почти полный аналог (небольшой сдвиг колонок библиотека учитывает сама).

OLED SSD1306 подключён к ESP32 по I²C: SDA, SCL, 3V3 и GND
Два провода плюс питание. Стандартный I²C на ESP32 — SDA = GPIO21, SCL = GPIO22. Собрано в BoardLab.
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128, 64, &Wire);   // I2C, address 0x3C (SH1106 is near-identical)

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(SSD1306_WHITE);
  oled.setCursor(0, 0);
  oled.println("24.7 C");
  oled.display();                        // push the frame to the panel
}

2. Цветной TFT (ST7789 / ILI9341 / ST7735) — полный цвет по SPI

Цветной TFT по SPI даёт 65 000 цветов и обновление, достаточное для живых графиков, меню и картинок — рабочая лошадка, когда нужна настоящая панель. Он требует больше пинов, чем I²C (SCK, MOSI, DC, CS, RES + подсветка), а подсветка постоянно потребляет ток, зато вы получаете полноценный UI. Основная библиотека — TFT_eSPI, пины задаются один раз в User_Setup.h. Дешёвые модули часто подписывают SCK/MOSI как SCL/SDA — это тот же SPI, просто путаная маркировка.

Цветной TFT ST7789 подключён к ESP32 по SPI: SCL, SDA, RES, DC, подсветка, 3V3 и GND
SPI-дисплей: тактовый, данные, DC и RES на GPIO; подсветка на 3V3.
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();               // SPI pins are set once in User_Setup.h

void setup() {
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_CYAN, TFT_BLACK);
  tft.setTextSize(3);
  tft.drawString("24.7 C", 20, 20);      // a full 65k-colour UI
}

3. Сенсорный TFT (ILI9341 + XPT2046) — экран, который нажимают

Добавьте сенсорный слой — и TFT превращается в панель управления: умный дом, термостаты, ручные пульты. Важный нюанс: дисплей и контроллер касаний XPT2046 делят одну шину SPI (SCK/MOSI/MISO); тач-чипу нужны только собственный T_CS (chip-select) и опциональный T_IRQ (прерывание). Так число пинов остаётся вменяемым. Знаменитый Cheap Yellow Display — ровно это: ESP32 + 2.8" ILI9341 + XPT2046 на одной плате.

Сенсорный TFT ILI9341 на ESP32: дисплей и тач XPT2046 на одной шине SPI, отдельные T_CS и T_IRQ
Одна шина SPI на оба чипа — лишние только T_CS и T_IRQ.
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();               // screen + XPT2046 touch share one SPI bus

void loop() {
  uint16_t x, y;
  if (tft.getTouch(&x, &y)) {            // T_CS + T_IRQ report the press
    tft.fillCircle(x, y, 4, TFT_CYAN);   // draw where the finger landed
  }
}

4. E-Ink (E-Paper) — питание только при обновлении

E-Ink — чемпион по автономности: ток нужен только пока меняется изображение, затем картинка держится бесплатно — и она прекрасно читается на прямом солнце, как бумага. Идеально для ценников, табличек, календарей и медленных часов, что работают месяцами от одной батарейки. Минус — скорость: полное обновление занимает от сотен миллисекунд до пары секунд и часто мигает, поэтому анимация исключена. Подключается по SPI почти как TFT, плюс линия BUSY, которую панель отдаёт обратно в микроконтроллер. Частая библиотека — GxEPD2.

Панель E-Paper подключена к ESP32 по SPI: DIN, CLK, CS, DC, RST и вход BUSY
SPI плюс пин BUSY, который панель держит, пока перерисовывается.
#include <GxEPD2_BW.h>
// 2.9" panel, pins: CS=5, DC=2, RST=4, BUSY=27
GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> epd(GxEPD2_290(5, 2, 4, 27));

void setup() {
  epd.init();
  epd.setFullWindow();
  epd.firstPage();
  do {
    epd.fillScreen(GxEPD_WHITE);
    epd.setCursor(10, 40);
    epd.print("+23 C");                  // then it holds the image on zero power
  } while (epd.nextPage());
}

Перед пайкой

Две вещи экономят больше всего нервов. Первое — уровень логики: GPIO ESP32 это 3.3 В, большинство модулей это устраивает, но дисплей строго на 5 В от Arduino в обратную сторону требует внимания. Второе — пины: цветной или сенсорный экран может занять половину GPIO, поэтому распланируйте их до пайки — особенно на плате «всё в одном», где дисплей уже забрал бóльшую часть гребёнки. Набросайте подключение в BoardLab, чтобы увидеть, какие пины остаются свободными.

Соберите схему экрана визуально и посмотрите, какие GPIO остаются под сенсоры.