В этом руководстве вы узнаете, как начать работу с сенсорным TFT дисплеем на контроллере ESP32. Он отлично подходит для создания графических пользовательских интерфейсов для ваших проектов Интернета вещей.
Дисплей, который мы используем в этом руководстве, имеет размер 2.8 дюйма и выполнен в технологии TFT LCD, а также обладает сенсорным экраном. Для обмена данными с дисплеем используется протокол SPI, а для управления им – драйвер ILI9341. Вы можете писать текст, рисовать фигуры и отображать изображения. Сенсорный экран также использует протокол SPI.




















18 комментариев. Оставить новый
товарищи, ваш setup не верный, проверьте пины MOSI и MISO
Здравствуйте, мы не видим ошибки.
Setup Правильный, а вот в указаном подключении ошибка: SDO(MISO) и Reset перепутаны местами. Да и если Reset подключили на 16 GPIO а не к ресету, тогда и в User_Setup.h Reset надо указать не -1 а 16
Сколько смотрю примеры подключения, но все просто игнорируют подключение SD карты …Это такая не нужная вещь ?????
Здравствуйте!
В этом примере мы рассматривали подключение именно дисплея. Процесс подключения SD карты является стандартным и не отличается от подключения других SD модулей для Arduino, поэтому мы не стали углубляться в эту тему. Чтобы подключить SD карту, необходимо использовать интерфейс SPI, для чего на дисплее предусмотрены специальные контакты.
Для работы с SD картой в среде Arduino IDE вы можете воспользоваться библиотекой SD.
Что насчёт sd карты или что там? Где об этом узнать?
Доброго! В скетче и вообще нигде не вижу определение пинов для тачскрина кроме cs и irq. Остальные где настраиваются? Можно ли подключить и тач и дисплей на одну шину SPI? у нас же еще и sd есть, а шин всего две
Здравствуйте!
Настройка пинов происходит в файле User_Setup.h.
MOSI, MISO и CLK можно запараллелить.
Понятное и минимально необходимое описание принципов программирования подобных устройств. Благодарю. Остальное нужно брать из примеров по ссылкам к приобретаемому гаджету, т.к. драйверы/протоколы/шины могут отличаться
Здравствуйте. У меня есть экран TFT SPI 480×320 с чипом ST7796S
Не могли бы вы мне помочь настроить User_Setup.h?
Я пытался весь день, но выдает только белый экран, и больше ничего.
Здравствуйте. Да, помочь можно, но для начала нужно прояснить несколько вещей, иначе будем стрелять вслепую.
Что нужно уточнить
Ответьте, пожалуйста, на 4 пункта:
1. Какой контроллер/плата:
– Arduino Uno / Mega / ESP8266 / ESP32 / STM32 / RP2040 и т.п.?
2. Какой именно модуль:
– Это “голая” плата 4.0″ ST7796 SPI (часто 480×320, 4‑wire SPI) вроде модулей с LCDWiki или AliExpress?
– Есть ли на плате отдельный чип тач‑контроллера (XPT2046, GT911 и т.п.)?
3. Какие пины подключены:
– SCK / MOSI / MISO (если есть)
– CS (TFT_CS), DC (TFT_DC / RS), RST
– Подсветка (LED / BL / BKL) – на что посажена (GPIO, через транзистор, напрямую на 3.3/5 В)?
4. Какую библиотеку и версию используете:
– Bodmer TFT_eSPI (из Library Manager Arduino IDE / PlatformIO)?
– Или другая (Adafruit GFX, Arduino_GFX и т.д.)?
Сразу после этого можно будет написать вам конкретный кусок
User_Setup.hименно под вашу плату, например в стиле:#define ST7796_DRIVER
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5
#define TFT_DC 2
#define TFT_RST 4
//#define TFT_MISO 19 // если реально подключен
и проверить, что:
– выбран только один драйвер (
#define ST7796_DRIVER, остальные закомментированы);– размеры 320×480 стоят именно так, а ориентацию потом задаёте
tft.setRotation(1/3);– подсветка реально запитана (часто белый экран = есть подсветка, но инициализации нет из‑за неверных пинов CS/DC/RST или неправильного драйвера).
## Минимальный тестовый скетч
Параллельно подготовьте простой пример на TFT_eSPI:
#include
TFT_eSPI tft;
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.fillRect(10, 10, 100, 50, TFT_RED);
}
void loop() {}
После того как вы пришлёте:
– тип платы;
– схему (хотя бы текстом, какие пины куда);
– ваш текущий
User_Setup.h(илиtft_setup.h, если так делаете),сделаем вам готовый, проверенный вариант настроек и укажем, что именно могло давать белый экран (драйвер, размеры, пины, питание или уровень логики).
1. esp32 devmodule c-S1
2. плата модуль 480×320 TFT SPI с алиэкспресса
3. CS – 11 | RESET – 10 | DC/RS – 9 | SDI(MOSI) – 13 | SCK – 12| LED – 14
4. TFT_eSPI Arduino IDE
Написал на гитхабе разработчикам, не помогли. В чем проблема – не знаю. Экран точно рабочий
XPT2046 контроллер есть, забыл написать
Здравствуйте, я решил свою проблему. Дело в том, что у не ESP32 devmodule c-s1, а NodeMCU-32 S1 v1.3
Я не правильно определял слоты.
можно поподробней про:
x = map(p.x, 200, 3700, 1, SCREEN_WIDTH);
y = map(p.y, 240, 3800, 1, SCREEN_HEIGHT);
200, 3700 и 240, 3800 – откуда цифры?
Цифры 200 и 3700 в коде — это эмпирически определённые границы диапазона «сырых» значений, которые сенсорный экран выдаёт по оси X при физическом касании в крайних точках (слева и справа).
Откуда они берутся
Эти числа не являются стандартными — они специфичны для:
конкретной модели сенсорного экрана/контроллера;
способа подключения и калибровки;
аппаратной нелинейности сенсора.
Как их получают
Обычно такие границы находят экспериментально:
Проводят серию касаний в крайне левой точке экрана и фиксируют минимальное значение p.x (в данном случае ≈ 200).
Проводят касания в крайне правой точке и фиксируют максимальное значение p.x (здесь ≈ 3700).
Эти эмпирические минимумы и максимумы используют как in_min и in_max в функции map().
Почему именно такие числа
200 — не ноль, потому что:
у сенсора есть «мёртвая зона» у края;
АЦП (аналого-цифровой преобразователь) контроллера имеет смещение;
калибровка завода-изготовителя задаёт ненулевой старт.
3700 — значение выше, чем разрешение экрана, потому что:
сенсор физически больше видимой области;
АЦП имеет разрядность, дающую большой диапазон (например, 12 бит → 0…4095);
нелинейность сенсора «растягивает» координаты.
Как проверить/изменить
Если калибровка неточна, нужно:
Вывести на экран маркеры крайних точек.
Записать реальные p.x при касании этих точек.
Обновить границы в map():
cpp
x = map(p.x, NEW_MIN_X, NEW_MAX_X, 1, SCREEN_WIDTH);