ESP32 WebTable Example Hướng Dẫn Giao Diện Bảng Dữ Liệu
Tổng Quan
Ví dụ WebTable cung cấp giao diện bảng dữ liệu hai cột dựa trên web để hiển thị thông tin thời gian thực từ các dự án ESP32 của bạn. Được thiết kế cho ESP32 với nền tảng giáo dục có khả năng trực quan hóa dữ liệu tiên tiến, làm nổi bật thay đổi giá trị thông minh, và tích hợp liền mạch với hệ sinh thái giáo dục.

Tính Năng Chính
Chức Năng Cốt Lõi
- Bảng Dữ Liệu Hai Cột: Cặp thuộc tính-giá trị sạch sẽ cho việc hiển thị dữ liệu có tổ chức
- Cập Nhật Giá Trị Thời Gian Thực: Làm mới dữ liệu tức thì dựa trên WebSocket mà không cần tải lại trang
- Thiết Kế Tiết Kiệm Bộ Nhớ: Không lưu trữ giá trị trong bộ nhớ ESP32 - tất cả được theo dõi trong giao diện web
- Cấu Hình Động: Thiết lập cấu trúc bảng một lần trong hàm setup() của ESP32
- Điều Khiển Tương Tác: Nút làm mới để yêu cầu dữ liệu thủ công và khả năng kết nối lại tự động
Hệ Thống Làm Nổi Bật Thông Minh
- Phát Hiện Thay Đổi Thông Minh: Tự động phát hiện giá trị nào thực sự thay đổi theo thời gian
- Theo Dõi Giá Trị Tự Động: Tự động so sánh giá trị hiện tại với giá trị trước đó
- Làm Nổi Bật Hai Cấp:
- Làm nổi bật màu đỏ: Cho các giá trị đang thay đổi tích cực
- Làm nổi bật màu xanh: Cho các giá trị ổn định theo thời gian
- Không Cần Thiết Lập: Hệ thống tự động học những giá trị nào thay đổi mà không cần cấu hình gì
- Phản Hồi Trực Quan: Hiệu ứng mượt mà cung cấp phản hồi trực quan rõ ràng cho việc cập nhật giá trị
Giao Diện Web Hiện Đại
- Thiết Kế Responsive: Hoạt động liền mạch trên desktop, tablet và thiết bị di động
- Kiểu Dáng Chuyên Nghiệp: Bố cục dạng thẻ với hiệu ứng hover và thẩm mỹ hiện đại
- Trạng Thái Kết Nối: Chỉ báo trực quan cho trạng thái kết nối WebSocket
- Tích Hợp Footer: Kiểu dáng nhất quán phù hợp với các web app DIYables khác
- Xử Lý Trạng Thái Rỗng: Thông báo thân thiện với người dùng khi không có dữ liệu
Phần Cứng Cần Thiết
| 1 | × | mô-đun phát triển ESP-WROOM-32 | ||
| 1 | × | Alternatively, ESP32 Uno-form board | ||
| 1 | × | Alternatively, ESP32 S3 Uno-form board | ||
| 1 | × | Cáp USB Type-C | ||
| 1 | × | (Khuyến nghị) Screw Terminal Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Breakout Expansion Board for ESP32 | ||
| 1 | × | (Khuyến nghị) Power Splitter for ESP32 |
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Hướng Dẫn Thiết Lập
Các Bước Nhanh
Làm theo các hướng dẫn này từng bước:
- Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy tham khảo hướng dẫn ESP32 - Cài Đặt Phần Mềm.
- Kết nối board ESP32 với máy tính của bạn bằng cáp USB.
- Khởi động Arduino IDE trên máy tính của bạn.
- Chọn board ESP32 phù hợp (ví dụ: ESP32 Dev Module) và COM port.
- Điều hướng đến biểu tượng Libraries trên thanh bên trái của Arduino IDE.
- Tìm kiếm "DIYables ESP32 WebApps", sau đó tìm DIYables ESP32 WebApps Library by DIYables
- Nhấp nút Install để cài đặt thư viện.

- Bạn sẽ được hỏi về việc cài đặt một số thư viện phụ thuộc khác
- Nhấp nút Install All để cài đặt tất cả thư viện phụ thuộc.

- Trên Arduino IDE, Vào File Examples DIYables ESP32 WebApps WebTable example, hoặc copy code và paste vào editor của Arduino IDE
Cấu Hình WiFi
Cấu hình thông tin đăng nhập WiFi trong code bằng cách cập nhật những dòng này:
- Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
- Mở Serial Monitor
- Kiểm tra kết quả trên Serial Monitor. Nó trông giống như bên dưới
- Nếu bạn không thấy gì, hãy khởi động lại board ESP32.
Sử Dụng Giao Diện Web
- Mở trình duyệt web trên máy tính hoặc thiết bị di động kết nối với cùng mạng WiFi
- Nhập địa chỉ IP hiển thị trong Serial Monitor vào trình duyệt web
- Ví dụ: http://192.168.1.100
- Bạn sẽ thấy trang chủ như hình bên dưới:

- Nhấp vào link Web Table, bạn sẽ thấy giao diện của Web Table app như bên dưới:

- Hoặc bạn cũng có thể truy cập trang trực tiếp bằng địa chỉ IP theo sau bởi /web-table. Ví dụ: http://192.168.1.100/web-table
- Bạn sẽ thấy giao diện Web Table hiển thị:
- Bảng Dữ Liệu Thời Gian Thực: Bảng hai cột với các thuộc tính và giá trị hiện tại của chúng
- Làm Nổi Bật Thông Minh: Tự động mã hóa màu sắc các giá trị thay đổi so với ổn định
- Trạng Thái Kết Nối: Chỉ báo trực quan hiển thị trạng thái kết nối WebSocket
- Nút Làm Mới: Khả năng làm mới thủ công cho dữ liệu mới nhất
- Cập Nhật Tự Động: Giá trị cập nhật thời gian thực qua WebSocket
Hệ Thống Làm Nổi Bật Thông Minh
Cách Hoạt Động
WebTable có một hệ thống làm nổi bật tiên tiến tự động phát hiện giá trị nào thay đổi theo thời gian mà không cần cấu hình gì trong code ESP32 của bạn.
Phát Hiện Thay Đổi Tự Động
Giao diện web tự động theo dõi dữ liệu của bạn và cung cấp phản hồi trực quan:
- Làm nổi bật màu đỏ: Áp dụng cho các giá trị thay đổi thường xuyên (như số liệu cảm biến, bộ đếm, timer)
- Làm nổi bật màu xanh: Áp dụng cho các giá trị ổn định (như tên thiết bị, địa chỉ IP, cài đặt cấu hình)
- Không cần thiết lập: Hệ thống học tự động khi ESP32 của bạn gửi cập nhật
Những Gì Bạn Thấy
- Các giá trị thay đổi theo thời gian (nhiệt độ, uptime, số liệu cảm biến) sẽ được làm nổi bật bằng màu đỏ
- Thông tin tĩnh (tên thiết bị, WiFi SSID, địa chỉ IP) sẽ được làm nổi bật bằng màu xanh
- Điều này giúp bạn nhanh chóng xác định dữ liệu nào đang thay đổi so với thông tin ổn định
Lợi Ích Chính
- Không Cần Cấu Hình: Chỉ cần sử dụng sendValueUpdate() và làm nổi bật hoạt động tự động
- Học Trực Quan: Dễ dàng xem phần nào của hệ thống đang hoạt động
- Thân Thiện Với Người Mới Bắt Đầu: Hoạt động mà không cần kiến thức lập trình web
- Tiết Kiệm Bộ Nhớ: Tất cả làm nổi bật xảy ra trong trình duyệt web, không phải trên Arduino
- Cập Nhật Thời Gian Thực: Làm nổi bật thay đổi ngay lập tức khi giá trị cập nhật
Cấu Hình Cấu Trúc Bảng
Cấu trúc bảng được cấu hình một lần trong hàm setup() sử dụng phương thức addRow():
Cập Nhật Giá Trị Thời Gian Thực
Giá trị được cập nhật trong thời gian chạy sử dụng phương thức sendValueUpdate():
Phương Thức Cập Nhật Trực Tiếp (Khuyến Nghị)
Lợi Ích Của Cập Nhật Trực Tiếp
- Tiết Kiệm Bộ Nhớ: Không lưu trữ giá trị trong bộ nhớ ESP32
- Thời Gian Thực: Cập nhật tức thì đến giao diện web
- Làm Nổi Bật Tự Động: Giao diện web tự động phát hiện thay đổi
- Code Đơn Giản: Không cần quản lý lưu trữ giá trị cục bộ
Giải Thích Code
Các Thành Phần Chính
Hàm Setup
Cập Nhật Thời Gian Thực Trong Loop
Hàm Callback
Hàm Cập Nhật Giá Trị
Phương Thức API
Phương Thức Class DIYablesWebTablePage
addRow(attribute, initialValue)
- Thêm hàng mới vào cấu trúc bảng
- Tham số:
- attribute: String - Tên thuộc tính (cột trái)
- initialValue: String - Giá trị ban đầu (cột phải, tùy chọn)
- Sử dụng: Được gọi trong setup() để cấu hình cấu trúc bảng
updateValue(attribute, value)
- Cập nhật giá trị theo tên thuộc tính (chỉ lưu trữ cục bộ)
- Tham số:
- attribute: String - Tên thuộc tính cần cập nhật
- value: String - Giá trị mới cần đặt
- Sử dụng: Cập nhật dữ liệu bảng cục bộ
updateValue(index, value)
- Cập nhật giá trị theo chỉ số hàng (chỉ lưu trữ cục bộ)
- Tham số:
- index: int - Chỉ số hàng (bắt đầu từ 0)
- value: String - Giá trị mới cần đặt
- Sử dụng: Cập nhật dữ liệu bảng cục bộ theo vị trí
sendValueUpdate(attribute, value)
- Gửi cập nhật giá trị đến web client theo tên thuộc tính
- Tham số:
- attribute: String - Tên thuộc tính cần cập nhật
- value: String - Giá trị mới cần gửi
- Sử dụng: Cập nhật thời gian thực đến giao diện web
sendValueUpdate(index, value)
- Gửi cập nhật giá trị đến web client theo chỉ số hàng
- Tham số:
- index: int - Chỉ số hàng (bắt đầu từ 0)
- value: String - Giá trị mới cần gửi
- Sử dụng: Cập nhật thời gian thực đến giao diện web theo vị trí
sendTableData()
- Gửi dữ liệu bảng hoàn chỉnh đến web client
- Sử dụng: Làm mới toàn bộ bảng trên giao diện web
clearTable()
- Xóa tất cả dữ liệu bảng và reset số hàng
- Sử dụng: Reset cấu trúc bảng (hiếm khi cần)
getRowCount()
- Trả về số hàng trong bảng
- Trả về: int - Số hàng hiện tại
- Sử dụng: Lấy thông tin kích thước bảng
getAttribute(index)
- Lấy tên thuộc tính theo chỉ số hàng
- Tham số: index: int - Chỉ số hàng (bắt đầu từ 0)
- Trả về: String - Tên thuộc tính
- Sử dụng: Truy cập thông tin cấu trúc bảng
getValue(index)
- Lấy giá trị theo chỉ số hàng
- Tham số: index: int - Chỉ số hàng (bắt đầu từ 0)
- Trả về: String - Giá trị hiện tại
- Sử dụng: Truy cập giá trị bảng hiện tại
onTableValueRequest(callback)
- Thiết lập hàm callback cho yêu cầu dữ liệu từ web client
- Tham số: void (*callback)() - Hàm cần gọi khi dữ liệu được yêu cầu
- Sử dụng: Xử lý yêu cầu dữ liệu từ web client
Giao Tiếp WebSocket
Tin Nhắn Từ Web Đến Arduino
- TABLE:GET_DATA - Yêu cầu dữ liệu bảng hoàn chỉnh
- TABLE:UPDATE:attribute:value - Cập nhật giá trị cho thuộc tính cụ thể
Tin Nhắn Từ ESP32 Đến Web
- TABLE_DATA:attr1:val1|attr2:val2|... - Gửi dữ liệu bảng hoàn chỉnh
- VALUE_UPDATE:attribute:value - Gửi cập nhật giá trị đơn
Khắc Phục Sự Cố
Các Vấn Đề Thường Gặp
1. Bảng Không Hiển Thị Dữ Liệu
- Vấn đề: Bảng trống hoặc thông báo "No Data Available"
- Nguyên nhân: Cấu trúc bảng chưa được cấu hình hoặc vấn đề kết nối WiFi
- Giải pháp:
- Xác minh setupTableStructure() được gọi trong setup()
- Kiểm tra trạng thái kết nối WiFi
- Nhấp nút refresh để yêu cầu dữ liệu thủ công
- Kiểm tra Serial Monitor để biết thông báo lỗi
- Vấn đề: Bảng hiển thị giá trị cũ mặc dù ESP32 đã cập nhật
- Nguyên nhân: Kết nối WebSocket bị mất hoặc hàm cập nhật không được gọi
- Giải pháp:
- Kiểm tra chỉ báo trạng thái kết nối trên trang web
- Làm mới trang web
- Xác minh sendValueUpdate() được gọi đúng cách
- Kiểm tra tính ổn định của mạng
- Vấn đề: Giá trị không hiển thị màu đỏ hoặc xanh làm nổi bật
- Nguyên nhân: JavaScript không phát hiện thay đổi giá trị đúng cách
- Giải pháp:
- Làm mới trang web để reset phát hiện thay đổi
- Đảm bảo giá trị thực sự thay đổi (kiểm tra Serial Monitor)
- Xóa cache trình duyệt nếu làm nổi bật có vẻ bị kẹt
- Giá trị cần nhiều cập nhật để kích hoạt hệ thống làm nổi bật
- Vấn đề: Lỗi khi nhấp nút refresh
- Nguyên nhân: Kết nối WebSocket thất bại
- Giải pháp:
- Xác minh địa chỉ IP của ESP32 là chính xác
- Kiểm tra ESP32 có trên cùng mạng WiFi không
- Khởi động lại ESP32 và làm mới trang web
- Kiểm tra cài đặt firewall
- Vấn đề: Lỗi khi nhấp nút refresh
- Nguyên nhân: Kết nối WebSocket thất bại
- Giải pháp:
- Xác minh địa chỉ IP của ESP32 là chính xác
- Kiểm tra ESP32 có trên cùng mạng WiFi không
- Khởi động lại ESP32 và làm mới trang web
- Kiểm tra cài đặt firewall
- Vấn đề: Các hàng được thêm/xóa không xuất hiện trên giao diện web
- Nguyên nhân: Cấu trúc bảng chỉ được cấu hình trong setup()
- Giải pháp:
- Khởi động lại ESP32 để áp dụng thay đổi cấu trúc
- Sử dụng clearTable() và addRow() nếu cần thay đổi động
- Làm mới trang web sau khi khởi động lại ESP32
2. Giá Trị Không Cập Nhật Thời Gian Thực
3. Làm Nổi Bật Không Hoạt Động
4. Lỗi "Not connected to Arduino"
3. Lỗi "Not connected to Arduino"
4. Thay Đổi Cấu Trúc Bảng Không Phản Ánh
Mẹo Debug
Bật Debug Serial:
Theo Dõi Cập Nhật Giá Trị:
Kiểm Tra Trạng Thái Kết Nối: