Подключение дисплея ST7789V (2.4″ TFT LCD 320×240) к ESP8266
В этом посте мы рассмотрим, как подключить цветной дисплей 2.4″ TFT LCD с разрешением 320×240 на базе контроллера ST7789V к микроконтроллеру ESP8266 через SPI интерфейс.

Необходимые компоненты:
- Дисплей 2.4″ TFT LCD ST7789V (на изображении выше).
- ESP8266 (например, NodeMCU или ESP-12E/ESP-12F).
- Провода для соединений.
Характеристики дисплея ST7789V:
- Разрешение: 320×240 пикселей.
- Интерфейс: SPI.
- Напряжение питания: 3.3V.
- Поддержка SD-карты (слот на задней стороне платы).
- Контактный интерфейс (обычно обозначения:
VCC
,GND
,CS
,RESET
,DC
,SDA
,SCL
,LED
).
Подключение
Подключение дисплея к ESP8266 требует согласования выводов. Вот стандартное соответствие:
Вывод дисплея | Вывод ESP8266 | Назначение |
---|---|---|
VCC | 3.3V | Питание дисплея |
GND | GND | Земля |
CS | GPIO0 | Выбор устройства |
RESET | GPIO16 | Сброс дисплея |
DC (RS) | GPIO2 | Управление данными/командами |
SDA (MOSI) | D7 (GPIO13) | Передача данных SPI |
SCL (SCK) | D5 (GPIO14) | Сигнал синхронизации SPI |
LED | 3.3V (или через резистор) | Подсветка дисплея |
Важно: Дисплей работает на напряжении 3.3V. Убедитесь, что вы не подключаете его к 5V, чтобы избежать повреждения.
#include <Adafruit_ST7735.h>
#include <Adafruit_ST7789.h>
#include <Adafruit_ST77xx.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_HTU21DF.h>
#include <Fonts/TimesNewRoman18.h>
// HTU21D (I2C) подключение
#define SDA_PIN D2 // GPIO4
#define SCL_PIN D1 // GPIO5
// ST7789 (SPI) подключение
#define TFT_CS 0
#define TFT_RST 16
#define TFT_DC 2
#define ST7789_SWRESET 0x01 //SWRESET: Software reset
// Инициализация дисплея и датчика
// For 1.44" and 1.8" TFT with ST7735 use:
// Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789:
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
void setup() {
Serial.begin(115200);
// Инициализация дисплея (SPI)
tft.init(240, 320);
tft.invertDisplay(false); // Инверсия цветов
tft.setRotation(0); // Ориентация экрана
tft.fillScreen(ST77XX_BLACK); // Установка черного фона
tft.setFont(&TimesNewRoman18);
// Инициализация датчика (I2C)
Wire.begin(SDA_PIN, SCL_PIN);
if (!htu.begin()) {
Serial.println("Ошибка инициализации HTU21D!");
while (1);
}
// Вывод сообщения о состоянии датчика
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(1);
tft.setCursor(10, 20);
tft.println("Datcik: OK");
delay(5000);
}
void loop() {
// Чтение данных с HTU21D
float temperature = htu.readTemperature();
float humidity = htu.readHumidity();
// Очистка всего экрана
tft.fillScreen(ST77XX_BLACK);
// Перерисовка всех данных
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(1);
tft.setCursor(10, 20);
tft.print("Temp: ");
tft.print(temperature);
tft.println(" S");
tft.setCursor(10, 50);
tft.print("Vlaj: ");
tft.print(humidity);
tft.println(" %");
delay(30000); // Обновление данных каждые 30 секунды
}
Особенности кода:
- Использование библиотеки Adafruit:
- Используется библиотека
Adafruit_ST7789
для работы с дисплеем иAdafruit_HTU21DF
для работы с датчиком HTU21D. - Это удобный и популярный выбор для управления такими устройствами.
- Используется библиотека
- Подключение:
- I2C (HTU21D): SDA (D2, GPIO4) и SCL (D1, GPIO5). Убедитесь, что они совпадают с вашей схемой.
- SPI (ST7789): CS (GPIO0), RST (GPIO16), DC (GPIO2). Эти пины также должны совпадать с реальным подключением.
- Инициализация:
- Дисплей ST7789 инициализируется с разрешением 240×320.
- Добавил красивый шрифт
TimesNewRoman18
для вывода текста.
- Обновление данных:
- Обновление данных с HTU21D происходит каждые 30 секунд (
delay(30000)
). - Каждый раз экран очищается, и информация перерисовывается.
- Обновление данных с HTU21D происходит каждые 30 секунд (
Изначально цвета были инвертированы, пришлось прописать команду что бы отменить инверсию
Инвертированные цвета на дисплеях с контроллером ST7789 могут быть вызваны настройками контроллера по умолчанию. По стандарту ST7789 иногда включается в инверсированном режиме. Чтобы это исправить, вы правильно добавили команду:
tft.invertDisplay(false);
Объяснение:
invertDisplay(true)
: включает инверсию цветов (например, чёрный становится белым, белый — чёрным).invertDisplay(false)
: отключает инверсию цветов (восстанавливает естественную цветовую гамму).
Почему инверсия может быть включена по умолчанию?
- Прошивка контроллера: Некоторые производители дисплеев устанавливают инвертированный режим по умолчанию.
- Аппаратная реализация: Это может зависеть от особенностей конкретной модели дисплея или прошивки ST7789, установленной на заводе.
- Несоответствие настроек библиотеки и дисплея: Иногда библиотека не учитывает такие параметры для конкретной версии дисплея.
Как определить проблему?
Если вы заметили, что цвета на дисплее неестественные (например, белый фон выглядит чёрным, а текст — светлым), скорее всего, включён режим инверсии.
Альтернативный подход:
Вместо команды invertDisplay(false)
можно использовать прямую отправку команды к ST7789, если это требуется:
tft.writecommand(ST7789_SWRESET); // Сброс дисплея
tft.writecommand(0x20); // Отключение инверсии (команда NORON - Normal Display Mode)