Màn hình TFT 1.54 inch IPS Driver ST7789 (240×240) là lựa chọn phổ biến cho các dự án IoT, thiết bị hiển thị trạng thái, dashboard nhỏ gọn nhờ màu sắc đẹp, góc nhìn rộng và giao tiếp SPI đơn giản.
Trong bài viết này, chúng ta sẽ kết nối và chạy thành công màn hình TFT 1.54 inch ST7789 với board Waveshare ESP32-S3 Zero, kèm lưu ý quan trọng về chân BLK (Backlight) – nguyên nhân phổ biến khiến nhiều bạn gặp lỗi “màn hình không sáng”.




1. Phần cứng sử dụng
Board điều khiển
- Waveshare ESP32-S3 Zero (SuperMini)
- Chip: ESP32-S3 (dual-core, USB native)
- Điện áp logic: 3.3V
Màn hình
- TFT 1.54 inch IPS
- Độ phân giải: 240 × 240
- Driver: ST7789
- Giao tiếp: SPI
- Điện áp hoạt động: 3.3V
- Không có cảm ứng
2. Sơ đồ chân TFT 1.54 inch ST7789
| Chân TFT | Chức năng |
|---|---|
| VCC | Nguồn 3.3V |
| GND | Mass |
| SCL | SPI Clock |
| SDA | SPI Data (MOSI) |
| RST | Reset màn hình |
| DC | Data / Command |
| CS | Chip Select |
| BLK | Backlight (đèn nền) |
3. Sơ đồ kết nối TFT ↔ Waveshare ESP32-S3 Zero
⚠️ LƯU Ý RẤT QUAN TRỌNG
? Chân BLK BẮT BUỘC phải được cấp 3.3V thì màn hình mới sáng
Nếu BLK để hở → màn hình chạy nhưng không thấy gì.
| TFT 1.54” | ESP32-S3 Zero | GPIO |
|---|---|---|
| VCC | 3V3 | — |
| GND | GND | — |
| SCL | GP12 | GPIO12 |
| SDA (MOSI) | GP11 | GPIO11 |
| CS | GP8 | GPIO8 |
| DC | GP9 | GPIO9 |
| RST | GP10 | GPIO10 |
| BLK | 3V3 (khuyên dùng) | — |
? Khi test ban đầu, nên nối BLK thẳng 3.3V, không cần PWM để tránh lỗi.
4. Thư viện cần cài đặt (Arduino IDE)
Mở Library Manager và cài:
- Adafruit GFX Library
- Adafruit ST7789
5. Code Arduino hoàn chỉnh (đã comment rõ ràng)
/**
* Project: TFT 1.54 inch ST7789 (240x240)
* Board: Waveshare ESP32-S3 Zero (SuperMini)
* Voltage: 3.3V
*
* IMPORTANT:
* - Chân BLK (Backlight) của TFT BẮT BUỘC phải nối 3.3V thì màn hình mới sáng
* - TFT sử dụng giao tiếp SPI, không dùng MISO
*/
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
/* =========================
MAP CHÂN TFT (SPI)
========================= */
#define TFT_SCLK 12 // SPI Clock
#define TFT_MOSI 11 // SPI Data (MOSI)
#define TFT_CS 8 // Chip Select
#define TFT_DC 9 // Data / Command
#define TFT_RST 10 // Reset TFT
// Khởi tạo đối tượng TFT ST7789
Adafruit_ST7789 tft = Adafruit_ST7789(
TFT_CS,
TFT_DC,
TFT_MOSI,
TFT_SCLK,
TFT_RST
);
/* =========================
Test LED RGB onboard
(GPIO48 – có sẵn trên ESP32-S3 Zero)
========================= */
void runBlinkLED() {
#ifdef RGB_BUILTIN
digitalWrite(RGB_BUILTIN, HIGH); // Trắng
delay(1000);
digitalWrite(RGB_BUILTIN, LOW);
delay(1000);
rgbLedWrite(RGB_BUILTIN, 50, 0, 0); // Đỏ
delay(1000);
rgbLedWrite(RGB_BUILTIN, 0, 50, 0); // Xanh lá
delay(1000);
rgbLedWrite(RGB_BUILTIN, 0, 0, 50); // Xanh dương
delay(1000);
rgbLedWrite(RGB_BUILTIN, 0, 0, 0); // Tắt
delay(1000);
#endif
}
/* =========================
Reset cứng TFT
(theo khuyến nghị ST7789)
========================= */
void hardResetTFT() {
pinMode(TFT_RST, OUTPUT);
digitalWrite(TFT_RST, HIGH);
delay(20);
digitalWrite(TFT_RST, LOW);
delay(50);
digitalWrite(TFT_RST, HIGH);
delay(120);
}
/* =========================
Khởi tạo & test TFT 1.54"
========================= */
void setupTFT154Inch() {
tft.init(240, 240); // Độ phân giải ST7789
tft.setRotation(0); // Xoay màn hình (0–3)
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setCursor(10, 10);
tft.println("TFT 1.54 ST7789");
tft.println("ESP32-S3 Zero OK");
}
void setup() {
hardResetTFT();
setupTFT154Inch();
}
void loop() {
runBlinkLED();
}
6. Các lỗi thường gặp & cách khắc phục
❌ Màn hình không sáng
✔ Kiểm tra BLK đã nối 3.3V chưa
✔ Kiểm tra VCC đúng 3.3V (không dùng 5V)
❌ Màn hình đen nhưng code chạy
✔ Chưa reset TFT → cần hardResetTFT()
✔ Nhầm thứ tự chân CS / DC / RST
❌ Màn hình nhiễu, trắng
✔ Dây SPI quá dài
✔ Không chung GND giữa TFT và ESP32
7. Kết luận
- ✔ Waveshare ESP32-S3 Zero + TFT 1.54 inch ST7789 hoạt động rất ổn định
- ✔ Điện áp 3.3V an toàn cho IoT
- ✔ Giao tiếp SPI đơn giản, dễ mở rộng UI
- ⚠️ BLK phải cấp 3.3V thì màn hình mới sáng (rất dễ nhầm)
Gợi ý mở rộng
- Tối ưu SPI tốc độ cao (40–80 MHz)
- Dùng LVGL làm UI
- Điều khiển BLK bằng PWM để giảm tiêu thụ điện
- Hiển thị dữ liệu IoT (WiFi, MQTT, Sensor…)


