"Người dự báo thời tiết" tự chế: Từ màn hình e-paper bỏ xó đến bảng tin cá nhân
Một lập trình viên đã tận dụng màn hình e-paper LILYGO T5 chạy ESP32 đang bỏ không để dựng nên chiếc bảng hiển thị cá nhân: vừa đo nhiệt độ – độ ẩm trong nhà, vừa gom tin công nghệ từ Hacker News, lịch thiên văn và chất lượng không khí. Bài viết kể lại hành trình từ những lần thử nghiệm thất bại, cách sắp xếp giao diện theo mức độ ưu tiên thông tin, cho tới kiến trúc máy chủ Clojure phục vụ dữ liệu JSON cho thiết bị.

"Người dự báo thời tiết" tự chế: Từ màn hình e-paper bỏ xó đến bảng tin cá nhân
Mùa hè ở vùng của tác giả vốn khô, nóng và khó chịu. Để giảm bớt cái nóng trong nhà, anh quyết định bắt đầu bằng việc đo đạc nhiệt độ và độ ẩm trong một khoảng thời gian, từ đó lập đường cơ sở và tính độ lệch chuẩn. Cùng lúc đó, anh cũng muốn thoát dần khỏi vòng xoáy nội dung do thuật toán đề xuất trên YouTube, Instagram hay Reddit.
Ý tưởng nảy ra khi anh nhìn thấy chiếc màn hình e-paper LILYGO T5 phủ bụi ở góc phòng. Với sự hỗ trợ của Claude Code, anh biến nó thành một bảng hiển thị tĩnh, phục vụ đúng những nhu cầu của mình. Bài viết gốc kể lại toàn bộ hành trình đó — từ phần cứng, giao diện cho tới kiến trúc mạng.
Vì sao lại là màn hình e-paper?
Ban đầu, mục tiêu khá rõ ràng: giảm nhiệt độ trong nhà và giành lại quyền kiểm soát nội dung mình tiêu thụ. Anh đã dùng miniflux để đọc tin qua RSS thay vì để thuật toán dẫn dắt, nhưng vẫn hay bỏ lỡ những thông tin công nghệ mới, đặc biệt là các chủ đề AI/LLM xuất hiện liên tục trên Hacker News.
Bên cạnh đó là sở thích thiên văn: anh muốn biết trước các hiện tượng như che khuất sao bởi Mặt Trăng hay nhật thực, nguyệt thực để quyết định có mang kính viễn vọng ra quan sát hay không. Việc này gắn liền với mong muốn theo dõi chất lượng không khí quanh nhà.
Bảng thông tin hiển thị trên màn hình e-paper T5
Chiếc màn hình này là module LILYGO T5 4.7", mua từ hubtronics.in vài năm trước, thời điểm anh còn làm dự án lập trình nhúng trên STM32/MC60. Điểm đáng giá của nó nằm ở chỗ tích hợp sẵn chip ESP32:
- SoC: ESP32, lõi kép Xtensa LX6 @ 240 MHz
- Kết nối: Wi-Fi 2.4 GHz (802.11 b/g/n), Bluetooth 4.2 + BLE
- Bộ nhớ: 520 KB SRAM · 8 MB PSRAM · 16 MB flash
- Màn hình: e-paper 4.7 inch, 960 × 540, 16 mức xám (ED047TC1)
- Khác: cổng USB-C, đầu nối Li-Po, RTC, dòng điện khi ngủ khoảng 170 µA
Mức tiêu thụ điện thấp khi ngủ là yếu tố then chốt: thiết bị có thể chạy pin và thức dậy định kỳ để cập nhật dữ liệu mà không cần cắm điện liên tục.
Hai lần thử và một bài học về bố cục
Lần thử đầu tiên thất bại nhanh chóng. Anh không dành chút thời gian nào cho bố cục, kết quả là toàn bộ nội dung in ra thành một khối chữ căn trái, xấu đến mức không buồn chụp ảnh lại.
Lần thử thứ hai có cấu trúc hơn. Hệ thống gồm một máy chủ HTTP thu thập dữ liệu từ các API bên ngoài rồi trả về JSON theo một schema cố định. ESP32 chỉ việc gọi API, nhận JSON và làm mới màn hình theo chu kỳ.
Giao diện ban đầu là lưới 2×3 (cao × rộng):
- Hàng trên: thời tiết, danh sách việc cần làm (todo), chất lượng không khí kèm số liệu
- Hàng dưới: Hacker News, danh sách đang đọc, ngày giờ
Cách này chạy được, nhưng ô dành cho Hacker News rộng 320 px quá chật để hiển thị tiêu đề, còn ô ngày giờ và danh sách đọc lại quá mỏng để chiếm trọn một ô. Giải pháp là gộp hai ô dưới cùng bên phải thành một vùng HN rộng gấp đôi, đồng thời gom ToDo và danh sách đọc vào một ô ở giữa hàng trên. Thị trường chuyển lên góc phải trên, chất lượng không khí và thông tin Mặt Trăng xuống dưới trái, còn ngày giờ cùng giờ mặt trời mọc/lặn đặt ở đáy vùng HN.
Về mặt trình bày, anh chuyển từ font OpenSans sang Montserrat với nhiều cỡ chữ khác nhau để vừa khít, đồng thời bỏ hẳn ảnh tĩnh, chỉ dùng các hình vẽ nguyên thủy (primitives) và một vài quy ước như tiêu đề viết hoa kèm gạch chân.
Sơ đồ bố cục bảng thông tin được phác thảo
Điểm cốt lõi của thiết kế này là phân cấp thị giác: thông tin quan trọng nhất phải to, ngắn gọn và dễ nắm bắt ngay từ cái liếc mắt đầu tiên.
Kiến trúc mạng và những trục trặc đầu tiên
Trong lúc tinh chỉnh giao diện, firmware ESP32 vẫn đang chạy với một file JSON tĩnh được nạp sẵn. Bước tiếp theo là kết nối thiết bị qua Wi-Fi để lấy dữ liệu từ máy chủ.
Firmware nhanh chóng hoàn thiện với một URL HTTP trỏ tới địa chỉ IP nội bộ của máy chủ. Máy chủ được viết bằng Clojure, phục vụ đúng một file JSON tĩnh. Khi thử nghiệm mDNS với ESPmDNS để phân giải tên miền nội bộ, anh không thể khiến nó hoạt động dù đã nhờ Claude gỡ lỗi vài lần, cuối cùng đành bỏ qua — mọi thứ vẫn chạy ổn với địa chỉ IP.
Tuy nhiên, ba vấn đề xuất hiện:
- Khi cấu hình ESP32 ngủ sau khi render xong và thức dậy sau 10 phút để lấy dữ liệu mới, thiết bị không chịu thức dậy.
- Nếu máy chủ gặp lỗi khi lấy dữ liệu, nó ngừng phục vụ thay vì trả về giá trị tốt cuối cùng.
- Danh sách tính năng mong muốn vẫn còn dài: cảm biến chất lượng không khí trong nhà, tích hợp danh sách todo/đang đọc, và phát hiện thay đổi để bỏ qua việc làm mới màn hình khi dữ liệu không đổi.
Bảng điều khiển nhiệt độ và độ ẩm theo thời gian
Việc phát hiện thay đổi đặc biệt quan trọng với màn hình e-paper: mỗi lần làm mới toàn màn hình đều tốn thời gian và tiêu hao năng lượng, nên chỉ cập nhật khi thực sự có dữ liệu mới là cách tối ưu hợp lý.
Bài học cho người tự làm thiết bị IoT
Câu chuyện này là ví dụ khá tiêu biểu cho hướng tự làm thiết bị IoT tại nhà: tận dụng phần cứng sẵn có, giữ kiến trúc đơn giản, và chấp nhận bỏ qua những tính năng chưa cần thiết để đi tới kết quả chạy được. Với người dùng Việt Nam, mô hình này cũng đáng tham khảo: các module ESP32 có sẵn trên thị trường với giá phải chăng, còn dữ liệu thời tiết, chất lượng không khí hay tin công nghệ đều có thể lấy từ API công khai.
Phần tiếp theo của loạt bài sẽ đi vào các hạng mục còn dang dở: cảm biến chất lượng không khí, tích hợp danh sách công việc, và cơ chế phát hiện thay đổi cho màn hình.

