3 điểm bởi GN⁺ 2025-03-30 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là kho lưu trữ cho một bộ hẹn giờ tập trung vật lý dựa trên ESP32, dùng màn hình ePaper và núm xoay làm thiết bị nhập để triển khai quy trình làm việc-nghỉ theo kiểu Pomodoro
  • Mã nguồn đã bị loại bỏ một số asset và font, nên không thể dùng ngay, nhưng nếu cần thì có thể chỉnh sửa cho phù hợp với mục đích riêng
  • Phần cứng gồm ESP32, WaveShare e-Paper HAT 4.26 inch 800x480, bộ mã hóa xoay KY-040, LED WS2812, đầu nối USB-C, vỏ in 3D, điện trở và tụ điện
  • ePaper không có đèn nền nên giảm xao nhãng khi làm việc, và mẫu 4.26 inch hỗ trợ làm tươi từng phần trong 0.3 giây, giúp tránh hiện tượng nhấp nháy đen-trắng khi làm tươi
  • Phần mềm dùng C++ cùng framework Arduino, PlatformIO và thư viện GxEPD2, đồng thời cung cấp các tính năng như chọn preset, thông báo bằng LED, thống kê thời gian nghỉ và lặp lại nghỉ dài

Tổng quan dự án

  • Kho lưu trữ này chứa mã nguồn và tài liệu thiết kế cho một bộ hẹn giờ tập trung dựa trên ESP32
  • Phần nhập liệu sử dụng núm xoay, còn phần hiển thị được xử lý bằng màn hình ePaper
  • Mã trong kho đã bị loại bỏ một số asset và font nên chưa ở trạng thái có thể dùng ngay
    • Nếu cần, bạn có thể chỉnh sửa mã để dùng theo nhu cầu của mình
  • Có thể xem thành phẩm trên MakerWorld

Linh kiện sử dụng

  • Các thành phần chính gồm:
    • ESP32, ví dụ dùng AZDelivery ESP32 NodeMCU
    • WaveShare 4.26inch e-Paper display HAT, 800x480
      • Các màn hình khác cũng có thể hoạt động, nhưng UI được thiết kế theo độ phân giải này
    • Bộ mã hóa xoay KY-040 và nút bấm
    • 1 LED WS2812
      • Có thể thay bằng LED RGB đơn giản
    • Đầu nối USB-C
      • Nếu dùng đầu nối USB-C 2 dây thì có thể sẽ cần cáp USB-A sang USB-C để cấp nguồn
    • Vỏ in 3D
    • Điện trở cho LED, điện trở pull-up cho công tắc, và tụ điện 0.1uF để làm dịu tín hiệu từ bộ mã hóa xoay
    • Có thể dùng thêm chì cân bằng lốp và chân cao su như linh kiện tùy chọn

Động lực chế tạo và mục tiêu thiết kế

  • Dự án bắt đầu với mục đích tạo một bộ hẹn giờ tập trung cho bạn của tác giả
  • Tác giả thích thử các phương pháp nâng cao năng suất và có thói quen mỗi năm dành khoảng một tháng cho một dự án có ích cho người khác
  • Sau khi mua máy in 3D BambuLab X1C, tác giả muốn tận dụng nó, đồng thời do từng hoàn thành chương trình học nghề điện tử rồi chuyển sang kỹ sư phần mềm nên cũng muốn làm một thiết bị vật lý
  • Có ba mục tiêu thiết kế
    • Phải là một thiết bị vật lý
    • Phải thú vị
    • Phải trực quan khi sử dụng
  • Dù đã có những dự án như Focus Dial by Salim Benbouziyane, tác giả vẫn muốn tự làm từ đầu

Lý do chọn linh kiện

  • ESP32

    • Đây là lần thứ hai tác giả thử làm gì đó với vi điều khiển sau một thời gian dài, và vì đã quen với ESP32 nên thấy dễ bắt đầu lại
    • Tác giả cũng nghiên cứu trước để xác nhận khả năng hỗ trợ màn hình
  • Màn hình ePaper

    • Hướng dẫn đi dây màn hình nằm trong docs/display_wiring.md
    • Một trong những mục tiêu chính của dự án là thiết bị không làm gián đoạn luồng làm việc, nên tác giả muốn dùng màn hình không có đèn nền
    • Cần một màn hình đủ lớn để vẫn đọc được khi đặt trên bàn
    • Sau khi đặt và thử nhiều màn hình ePaper của WaveShare, tác giả chọn mẫu 4.26 inch
    • Độ phân giải tốt
    • Kích thước phù hợp
    • Hỗ trợ làm tươi từng phần với thời gian làm tươi 0.3 giây
    • Không có hiện tượng nhấp nháy đen-trắng gây khó chịu trong lúc làm tươi
    • Ban đầu tác giả muốn dùng màn hình đen-trắng-đỏ, nhưng mẫu ưng ý có thời gian làm tươi 16 giây và không hỗ trợ làm tươi từng phần nên bị loại
    • Vì không có đèn nền, vào ban đêm nếu bàn làm việc không đủ sáng thì sẽ khó đọc màn hình, và tác giả xem đây là “tính năng chứ không phải lỗi”
  • Bộ mã hóa xoay

    • Tác giả cho rằng dùng núm xoay là lựa chọn tự nhiên nhất cho thiết bị nhập liệu
    • Kiểu nhập bằng núm xoay khiến thiết kế menu phức tạp hơn và cần xử lý debounce đầu vào cẩn thận
    • Tác giả thêm tụ 0.1uF vào chân CLK và DT để làm dịu tín hiệu
  • LED

    • Ở các phiên bản lặp đầu tiên, chưa có kế hoạch dùng LED
    • Màn hình không đèn nền có thể khiến thời điểm kết thúc phiên tập trung trở nên quá tinh tế để nhận ra
    • Tác giả đã thử nhiều phương án thông báo khác nhau
    • Buzzer khiến người dùng giật mình nên mang lại trải nghiệm không tốt
    • Loa trong cấu hình đã thử gặp nhiều tiếng ồn và tiếng rít
    • LED WS2812 dễ dùng và có thể tạo hoạt ảnh bằng thư viện NeoPixel
    • LED WS2812 cũng có lợi thế là không cần dùng quá nhiều chân output bổ sung
    • Cuối cùng LED hoạt động tốt để hiển thị nhiều trạng thái khác nhau, và trong vỏ còn thêm một tấm che nhỏ cùng lớp khuếch tán để LED trông đẹp hơn

Vỏ và thiết kế vật lý

  • Vỏ gồm hai phần: đế và nắp
  • Vì khung màn hình được thiết kế in liền như một phần của đế, góc trên bị hơi cong trong quá trình in
  • Việc đặt núm xoay ở mặt trước là một điểm còn tiếc
    • Do bản in và linh kiện điện tử khá nhẹ, khi nhấn công tắc của núm xoay thì cả thiết bị có thể bị đẩy trượt ra sau
    • Tác giả khắc phục bằng cách thêm chân cao su và chì cân bằng lốp ở đáy

Cấu trúc phần mềm

  • Phần mềm được viết bằng C++ và dùng framework Arduino
  • Dự án được quản lý bằng PlatformIO
  • Phần hiển thị phụ thuộc nhiều vào thư viện GxEPD2
  • Mã trong kho hơi thiếu gọn gàng do để kịp thời hạn nên vẫn còn nhiều đoạn sao chép-dán và mã cũ chưa dọn dẹp
  • Một phần mã được tạo bằng AI, chủ yếu là Claude, để kịp hoàn thành đúng hạn dự án
  • Vì đây là dự án làm cho bạn nên cũng có thêm các easter egg và yếu tố vui nhộn
    • Có tính năng hiển thị các sự thật ngẫu nhiên trên màn hình trong lúc tập trung

Luồng sử dụng thiết bị

  • Khi thiết bị khởi động, người dùng có thể thay đổi cài đặt hoặc vào chế độ chọn preset
  • Có thể chọn một trong ba preset
  • Bộ hẹn giờ sẽ bắt đầu, và khi hết thời gian, LED nhấp nháy đồng thời màn hình hiển thị thông báo
  • Người dùng có thể tiếp tục làm việc hoặc bắt đầu nghỉ sau đó
  • Trong lúc nghỉ có thể xem thống kê
  • Theo mặc định, cứ sau 4 lần sẽ có một khoảng nghỉ dài hơn

Phát triển và tùy biến

  • Các công cụ cần cho phát triển:
    • PlatformIO
      • Tác giả dùng extension cho VSCode
    • Python 3.13 trở lên để tái tạo asset
  • Để chuẩn bị ảnh, biểu tượng và font, cần chạy script generate_assets.py
    • Thay đổi kích thước ảnh
    • Chuyển đổi sang đúng định dạng
    • Sinh mã C++ để đưa vào dự án
  • Ví dụ chạy như sau
uv sync

uv run scripts/generate_assets.py
  • Preset được định nghĩa trong src/main.cpp
  • Các preset mặc định ví dụ gồm Emails, Coding và Focus
    • Emails: tập trung 15 phút, nghỉ 5 phút, nghỉ dài 15 phút
    • Coding: tập trung 45 phút, nghỉ 15 phút, nghỉ dài 30 phút, số lần lặp 2
    • Focus: tập trung 25 phút, nghỉ 5 phút, nghỉ dài 20 phút

Ánh xạ chân

  • Bộ mã hóa xoay KY-040:
    • CLK: 32
    • DT: 21
    • SW: 14
  • Màn hình ePaper đen trắng WaveShare 4.26 inch:
    • BUSY: 4
    • RST: 16
    • DC: 17
    • CS: 5
    • CLK: 18
    • DIN: 23
  • LED WS2812:
    • DIN: 25

1 bình luận

 
GN⁺ 2025-03-30
Ý kiến trên Hacker News
  • Bộ đếm Pomodoro vật lý: <https://upload.wikimedia.org/wikipedia/commons/3/34/Il_pomod...>
    • Không nên đánh giá thấp niềm vui khi dùng một món đồ đẹp và do chính tay mình làm. Những niềm vui nhỏ như vậy rốt cuộc sẽ tích tụ lại
      Ít nhất là với tôi thì nó quan trọng. Tôi đã gắn một thiết bị dùng ESP32 và photoresistor để đo các lần nhấp nháy của đồng hồ điện, qua đó làm cho đồng hồ điện trở nên “thông minh”; tuy thô sơ nhưng hoạt động tốt. Mỗi lần vào gara, nhìn thấy thiết bị nhỏ đó nhấp nháy là tôi thấy vui và muốn tiếp tục dự án tiếp theo. Nó cho tôi niềm tin rằng mình có thể tạo ra thứ gì đó, có thể thành công và có thể tiến bộ trong cuộc sống
      Nghe có thể ngớ ngẩn, nhưng tôi cũng nhìn nhận dự án trong bài gốc theo cách đó
    • Đúng vậy. Bộ đếm giờ nào cũng đủ dùng
      Nếu bạn đang lập trình màn hình eInk và vi mạch để sửa thói quen trì hoãn, thì nên dừng dự án đó lại, mua một bộ đếm giờ vật lý và làm việc cần làm
      Nếu trước khi làm việc bạn lại muốn đi mua sắm để chọn bộ đếm giờ, tôi sẽ giúp bạn bớt phải tìm. Cái này cũng hoạt động tốt: https://www.amazon.com/dp/B07TLC9SFZ Dĩ nhiên bộ đếm giờ nào cũng được
      Đi làm việc đó đi. Nó đáng mà
    • Tất nhiên đó là cách dễ hơn để giải quyết vấn đề
      Nhưng bài gốc đã ghi rõ đây là một dự án làm thứ gì đó cho bạn bè và thử dùng công cụ mới
      Một dự án hack thú vị không nhất thiết phải đáp ứng nhu cầu thị trường thực tế. Chỉ cần vui là được
    • Đọc các đánh giá 1 sao thì buồn cười lắm [0]. Vấn đề là bộ đếm giờ cơ học ngày nay làm cẩu thả nên khó mà tin dùng. Có vẻ giờ chẳng còn ai biết cách làm bộ đếm giờ cơ học chất lượng cao nữa
      [0] https://www.amazon.com/product-reviews/B07H59ZL1L/ref=acr_se...
    • Nếu chịu được tiếng tích tắc thì ổn ;)
      Cá nhân tôi thích thiết kế bộ đếm giờ dạng đĩa kiểu này: https://m.media-amazon.com/images/I/618WCXnyfXL.SL1500.jpg
  • Tôi rất thích dự án này. UI trông thú vị và có cảm giác được thiết kế rất chăm chút. Có vẻ tôi lại tìm được một hoạt động cho cuối tuần, hoặc có khi kéo dài vài tuần
    Nếu đang tìm dự án hackathon, hệ sinh thái E-ink đã khá trưởng thành nên dễ lập trình, và các AI như Claude cũng nắm khá rõ bề mặt API. Phần lớn mọi người không biết họ đang nhìn vào cái gì nên phải giải thích là “màn hình giống Kindle”, nhưng có vẻ trong phòng khách thì họ thích màn hình e-ink hơn màn hình có đèn nền. Vì nó đỡ gây khó chịu hơn nhiều
    Nhân tiện, E-ink [0] và Pomodoro [1] đều là những chủ đề tôi khá đào sâu
    [0] https://sambroner.com/posts/raspberry-pi-train
    [1] https://sambroner.com/posts/personal-analytics-2024
  • Những dự án kiểu “thiết bị” như thế này luôn thú vị. Vì dù mục tiêu đơn giản, chúng thường là khó nhất. Giao điểm giữa thiết kế sản phẩm, mạch điện tử và code là một sân chơi tuyệt vời
    Tôi rất thích lựa chọn màn hình, và cũng thích việc README giải thích rõ các cân nhắc về mục đích và khả năng sử dụng
    Tôi có vài suy nghĩ về thiết kế của chính món đồ này. Bản thân tôi cũng thấy phần này rất khó và dành nhiều thời gian để cải tiến lặp lại. Nếu đặt núm vặn rộng và dẹt ở phía trên thiết bị, có thể đặt màn hình ở giữa và làm thiết bị nhỏ hơn, đồng thời giảm khả năng hộp bị xô đi khi xoay. Vát mép và bo góc giúp tăng đáng kể độ hoàn thiện. Khác biệt giữa cạnh sắc và cạnh bo tròn tuy là chi tiết nhỏ nhưng cảm nhận lại khá lớn
    Nếu menu luôn có ba mục, tôi tự hỏi thay vì núm vặn thì đặt ba nút kiểu “snooze” của đồng hồ báo thức ở mặt trên thì sao. Thao tác sẽ ít hơn. Dùng filament bán trong suốt còn có thể tạo các bộ phận “ống dẫn sáng” rất đẹp. Ví dụ, nếu làm nguyên khối hộp LED thì có thể tạo cảm giác như bảng đồng hồ thập niên 80. Hoặc in viền màn hình rồi chiếu sáng phần đó, có thể tạo ra thiết kế tối giản hơn
    Tôi thích nghĩ về những thứ như vậy nên không tránh được. Tôi tò mò núm vặn được thiết kế thế nào. Có phải OpenSCAD không? Phần knurling đẹp, trông như được tạo bằng lập trình
    • Những câu hỏi hay
      Nếu thiết kế lại núm vặn, có lẽ tôi sẽ chuyển nó lên phía trên. Toàn bộ lịch trình dự án này là 4 tuần, và khi vấn đề trọng lượng phát sinh, tôi không đủ tự tin để làm lại vỏ và in prototype, nhưng làm vậy chắc chắn sẽ tốt hơn
      Tôi đã bo/vát gần như mọi cạnh, và vỏ cuối cùng được in bằng fuzzy skin để có cảm giác cao cấp hơn
      Ban đầu núm vặn cũng được tính đến để thay đổi thời lượng hẹn giờ, nên tôi thấy dùng dial là hợp lý. Cuối cùng lại không thành ra vậy, nên với menu hiện tại, ba nút có thể là UX tốt hơn. Thiết bị cũng sẽ nhỏ hơn
      Tấm che ban đầu được làm để chặn rò sáng, về sau tôi in lại bằng màu trắng nhằm tăng khuếch tán LED một chút cùng với tấm phim nhựa khuếch tán. Tôi thích ý tưởng đặt dải LED ở mép màn hình. Tôi chưa nghĩ đến
      Thường thì tôi dùng Blender nhiều hơn, nên đã làm theo một tutorial tạo knurling trong Onshape. Công cụ này không thích kiểu hình học đó cho lắm nên thao tác hơi giật, nhưng bạn cứ thoải mái xem file Onshape được liên kết trong README
  • Việc nhắm đúng ba trường hợp sử dụng, chứ không chỉ là khoảng tập trung 25 phút đơn giản, và còn cung cấp cả thống kê, là một điểm bổ sung rất hay
    Với người mới, sẽ tốt nếu bài viết nhắc rằng Pomodoro vốn được đặt tên theo một bộ hẹn giờ vật lý có bộ mã hóa xoay

https://medium.com/@thejinxes/ditch-the-tomato-timer-d8bbf01...
Một ngày nào đó, nếu dùng được màn hình e-ink màu đỏ như mục tiêu, có vẻ sẽ là một lựa chọn thay thế thú vị cho Pepe

  • Dự án tuyệt vời. Cũng khuyên nên xem LVGL [0], một thư viện đồ họa để tạo UI nhúng. Nó khá đơn giản để dùng và có cảm giác hơi giống HTML. Việc thiết lập giao tiếp phần cứng thì khó hơn một chút, nhưng sau khi cấu hình xong một lần, luồng viết UI và xử lý input sẽ cải thiện rất nhiều
    [0] - https://github.com/lvgl/lvgl
    • Ồ, trông rất hay. Lúc bắt đầu tôi đã dành chút thời gian tìm hiểu, nhưng lại không thấy cái này
  • Rất thú vị. Tôi đã nghĩ đến việc làm một bộ đếm Pomodoro vật lý, hoặc đơn giản là một thiết bị hiển thị, nhưng thích dạng màn hình tròn không hiện chính xác thời gian còn lại. Với tôi, điều đó gây mất tập trung và tạo cảm giác lo lắng
    Tôi đã dùng ứng dụng Visual Timer [0] trên điện thoại Android và nhìn chung nó rất tuyệt, nhưng nếu có thể cất điện thoại đi thì chắc chắn sẽ tốt hơn
    [0] https://play.google.com/store/apps/details?id=at.cwiesner.an...
    • Tôi cũng đã mua một LCD tròn 4 inch vì lý do đó, nhưng cuối cùng lại chuyển sang màn hình giấy điện tử. Tôi chỉ hiển thị theo đơn vị phút để không quá gây phân tâm, và trong phút cuối thì chỉ cập nhật theo khoảng 10 giây
  • Bản thân khái niệm Pomodoro xuất phát từ một chiếc hẹn giờ nhà bếp vật lý, và hình dạng của nó, đúng như dự đoán, là quả cà chua
    Theo tôi, UX tốt nhất cho kỹ thuật Pomodoro có thể tìm thấy ngay ở chiếc hẹn giờ nhà bếp vật lý đó
    • Về mặt chức năng, Focus Dial là một “sản phẩm” tốt hơn nhiều so với thứ tôi làm, và như đã liên kết trong README, nó giữ nguyên đúng UX đó
      Tuy nhiên, để làm được một thứ như vậy thì tôi phải đối mặt với giới hạn kiến thức và kỹ năng của mình, và tôi cũng muốn thử theo cách riêng. Hơn nữa, rốt cuộc tôi thật sự rất thích màn hình giấy điện tử đó
  • Tôi biết tự lắp ráp là một nửa niềm vui, nhưng nếu chỉ cần một thiết bị ESP32 đa dụng có màn hình và nút bấm thì tôi khuyên dùng M5Stack. Rẻ, lập trình được và được dùng rộng rãi
  • Một người tôi biết trước đây từng thử kinh doanh bộ đếm Pomodoro vật lý: https://www.indiegogo.com/projects/timechi-your-smart-produc...
    Với những người dùng trong văn phòng, hoặc những người không muốn nhìn vào màn hình để xem thời gian còn lại, đèn LED chỉ báo ở mặt trên thiết bị có vẻ hữu ích. Nó sẽ bật màu đỏ hoặc xanh dưới dạng một thanh đèn đẹp mắt, để cả người ở phía đối diện, không nhìn được màn hình, cũng biết lúc này có thể làm phiền hay không. Nếu muốn thì cũng có thể làm thành thanh đèn tiến trình
  • Hay thật. Nó khiến tôi cũng muốn chuyển công cụ năng suất của mình sang một thiết bị ngoài đời thực