ESP32 kết hợp với màn hình cảm ứng TFT 2.8 inch
Nâng cao10/5/2024

ESP32 kết hợp với màn hình cảm ứng TFT 2.8 inch

Tạo IoT Dashboard đẹp mắt với màn hình cảm ứng TFT ILI9341 và thư viện LVGL.

TFTDisplayLVGLTouchESP32
278 lượt thích189 người đã làm30 phút6 bước4 linh kiện
← Quay lại dự án
Hướng dẫn chi tiết

Phần 3: Lập trình giao diện người dùng với LVGL

1. Giới thiệu về thư viện LVGL, 2. Cấu hình LVGL cho dự án, 3. Tạo một giao diện người dùng cơ bản, 4. Thêm các widget (nút, thanh trượt,...) vào giao diện, 5. Tùy chỉnh giao diện với màu sắc và kiểu dáng, 6. Lưu và tải giao diện

Cập nhật 31/05/2026

Phần 3: Lập trình giao diện người dùng với LVGL

1. Giới thiệu về thư viện LVGL

LVGL (Light and Versatile Graphics Library) là một thư viện mã nguồn mở được thiết kế để tạo giao diện người dùng đồ họa trên các hệ thống nhúng. Thư viện này hỗ trợ nhiều loại màn hình và cảm ứng, giúp lập trình viên dễ dàng tạo ra các giao diện đẹp mắt và thân thiện với người dùng. LVGL được tối ưu hóa cho hiệu suất và bộ nhớ, phù hợp với các vi điều khiển như ESP32.

2. Cấu hình LVGL cho dự án

Để sử dụng LVGL trong dự án của bạn, trước tiên bạn cần cài đặt thư viện này. Dưới đây là các bước để cấu hình LVGL cho dự án ESP32 của bạn:

  1. Truy cập vào thư viện LVGL trên GitHub và tải về mã nguồn:
  2. git clone https://github.com/lvgl/lvgl.git
  3. Thêm thư viện LVGL vào thư mục của dự án ESP32 của bạn.
  4. Mở Arduino IDE và thêm đường dẫn đến thư viện LVGL trong phần Preferences.
  5. Cài đặt các thư viện phụ thuộc như TFT_eSPI hoặc Adafruit_GFX, nếu cần thiết.

Sau khi đã cài đặt, bạn cần cấu hình LVGL trong mã nguồn của dự án:

#include <lvgl.h>
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI(); // Khởi tạo màn hình TFT
lv_disp_buf_t disp_buf; // Buffer cho hiển thị

Tiếp theo, khởi tạo LVGL và cấu hình màn hình:

void setup() {
    lv_init();
    tft.begin();
    tft.setRotation(1);
    lv_disp_buf_init(&disp_buf, buf1, NULL, LV_HOR_RES_MAX * 10);
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.buffer = &disp_buf;
    disp_drv.flush_cb = my_flush; // Hàm vẽ
    lv_disp_drv_register(&disp_drv);
}

3. Tạo một giao diện người dùng cơ bản

Bây giờ, chúng ta sẽ tạo một giao diện người dùng cơ bản. Bạn có thể bắt đầu bằng cách tạo một màn hình đơn giản với một tiêu đề và một văn bản.

void create_basic_ui() {
    lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
    lv_label_set_text(label, "Chào mừng đến với Dashboard IoT!");
    lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
}

Gọi hàm create_basic_ui() trong hàm loop() để hiển thị giao diện.

4. Thêm các widget (nút, thanh trượt,...) vào giao diện

LVGL hỗ trợ nhiều loại widget khác nhau. Bạn có thể thêm nút và thanh trượt vào giao diện như sau:

void create_widgets() {
    lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
    lv_obj_set_size(btn, 120, 50);
    lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 40);
    lv_obj_t * btn_label = lv_label_create(btn, NULL);
    lv_label_set_text(btn_label, "Nhấn tôi!");

    lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
    lv_obj_set_width(slider, 200);
    lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 100);
    lv_slider_set_value(slider, 50, LV_ANIM_OFF);
}

Gọi create_widgets() trong hàm loop() để hiển thị các widget này.

5. Tùy chỉnh giao diện với màu sắc và kiểu dáng

Để tạo một giao diện hấp dẫn hơn, bạn có thể tùy chỉnh màu sắc và kiểu dáng cho các widget. Dưới đây là cách thay đổi màu sắc cho nút và thanh trượt:

void style_widgets() {
    static lv_style_t btn_style;
    lv_style_init(&btn_style);
    lv_style_set_bg_color(&btn_style, LV_STATE_DEFAULT, LV_COLOR_BLUE);
    lv_style_set_text_color(&btn_style, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_add_style(btn, LV_BTN_PART_MAIN, &btn_style);

    static lv_style_t slider_style;
    lv_style_init(&slider_style);
    lv_style_set_bg_color(&slider_style, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_add_style(slider, LV_SLIDER_PART_BG, &slider_style);
}

Gọi style_widgets() trong hàm setup() để áp dụng các kiểu dáng cho widget.

6. Lưu và tải giao diện

Để lưu và tải giao diện, bạn có thể sử dụng chức năng lưu trữ và phục hồi trạng thái của widget. Dưới đây là một ví dụ đơn giản:

void save_ui() {
    lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
    lv_slider_set_value(slider, 50, LV_ANIM_OFF);
    lv_obj_set_user_data(slider, (void*)50); // Lưu giá trị slider
}

void load_ui() {
    lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
    int saved_value = (int)lv_obj_get_user_data(slider); // Tải giá trị slider
    lv_slider_set_value(slider, saved_value, LV_ANIM_OFF);
}

Gọi save_ui()load_ui() tại các thời điểm thích hợp trong mã của bạn.

Lưu ý: Hãy luôn kiểm tra tài liệu của LVGL để hiểu rõ hơn về các widget và cách tùy chỉnh chúng. Điều này sẽ giúp bạn tạo ra giao diện đẹp mắt và hiệu quả hơn.

Với hướng dẫn này, bạn đã có thể tạo ra một giao diện người dùng cơ bản với LVGL trên ESP32. Hãy thử nghiệm và sáng tạo thêm với các widget và kiểu dáng để làm cho dashboard IoT của bạn trở nên độc đáo và thú vị hơn!