Гайд · Дисплеи · Подключение
Как подключить дисплей к ESP32
Почти любой любительский дисплей работает и с Arduino (5 В), и с ESP32 (3.3 В) — причём ESP32 лучше подходит для графики, сенсора и Wi-Fi. На практике вы встретите четыре типа: монохромный OLED, цветной TFT, сенсорный TFT и панель E-Ink. Ниже — как каждый подключается и первые строки кода, чтобы его оживить.
Пока только выбираете? Соседний гайд сравнивает их лоб в лоб — OLED vs TFT vs E-Paper vs Nextion. А эта страница — практическая половина: схема и рабочий скетч для каждого.
| Тип | Чипы | Шина | Цвет | Обновление | Лучше для |
|---|---|---|---|---|---|
| OLED | SSD1306 · SH1106 | I²C | моно | быстро | часы, статус, мини-UI |
| Цветной TFT | ST7789 · ILI9341 · ST7735 | SPI | 65k | быстро | панели, графики, картинки |
| Сенсорный TFT | ILI9341 + XPT2046 | SPI (+тач) | 65k | быстро | умный дом, пульты |
| E-Ink | Waveshare · GDEH | SPI | моно / мало | медленно | ценники, таблички, часы |
1. OLED (SSD1306 / SH1106) — два провода, настоящий чёрный
Классический 0.96" OLED работает по I²C, поэтому нужны всего два сигнальных провода — SDA и SCL плюс питание. Высокая контрастность (пиксель реально выключен, подсветки нет), крохотное потребление и копеечная цена. 128×64 пикселя хватает на пару строк текста или маленький график — идеально для часов, погоды и строки статуса Wi-Fi/IP. SH1106 — почти полный аналог (небольшой сдвиг колонок библиотека учитывает сама).
#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, просто путаная маркировка.
#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 на одной плате.
#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.
#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 остаются под сенсоры.