Bỏ qua, đến nội dung chính
Nastrotek
Bài viếtFirmware

Tối ưu thời lượng pin cho robot ESP32 có màn hình

Phân tích thời lượng pin cho robot ESP32 có màn hình: backlight, Wi-Fi, audio, ngoại vi, sleep mode, wake-up và runtime.

Chia sẻ

LinkedInFacebookX
Diagram of active, idle and sleep states used to reduce ESP32 display power consumption

Trong bài này, mình sẽ cùng bạn ước lượng pin từ dòng tiêu thụ thực tế, rồi tìm đúng phần cần tối ưu trước khi sửa phần cứng.

ESP32, màn hình, Wi-Fi và loa đều có thể tiêu thụ khá nhiều điện nếu hoạt động liên tục. Với một thiết bị nhỏ như robot Mochi, việc chỉ tăng dung lượng pin thường chưa đủ. Muốn thời lượng sử dụng tốt hơn, cần tối ưu cả phần cứng, firmware và cách thiết bị chuyển đổi giữa các trạng thái hoạt động.

Bài viết này tập trung vào những cách thực tế nhất để giảm điện năng tiêu thụ cho thiết bị ESP32 có màn hình.

1. Xác định các thành phần tiêu thụ điện

Trước khi tối ưu, cần biết điện đang được tiêu thụ ở đâu.

Trong một thiết bị ESP32 có màn hình, các thành phần thường tiêu thụ điện nhiều nhất gồm:

  • ESP32 khi Wi-Fi hoặc Bluetooth hoạt động.
  • Đèn nền của màn hình TFT.
  • Mạch khuếch đại âm thanh và loa.
  • Cảm biến, microphone và LED trạng thái.
  • Mạch nguồn và các linh kiện luôn được cấp điện.

Ví dụ, trong lúc thiết bị hoạt động đầy đủ, dòng tiêu thụ có thể đến từ nhiều khối cùng lúc:

Thành phầnDòng tiêu thụ tham khảo
ESP32-S3 hoạt động40–120 mA
Wi-Fi truyền dữ liệuCó thể tăng cao theo từng thời điểm
Đèn nền màn hình20–100 mA
Mạch khuếch đại âm thanhPhụ thuộc âm lượng và loa
Cảm biến, LED, microphoneVài mA đến vài chục mA

Các giá trị trên chỉ mang tính tham khảo. Nên đo trực tiếp trên thiết bị thật thay vì chỉ dựa vào datasheet.

Sơ đồ các khối tiêu thụ điện của robot ESP32 gồm chip, Wi-Fi, màn hình, audio, microphone và cảm biến.

Chỉ đo toàn board mới cho biết khối nào thực sự chi phối dòng trung bình và dòng đỉnh.

2. Chia thiết bị thành các trạng thái hoạt động

Một thiết bị không cần chạy toàn bộ chức năng ở mức công suất cao trong mọi thời điểm.

Có thể chia hệ thống thành ba trạng thái chính:

Active

Thiết bị đang được sử dụng:

  • Màn hình sáng.
  • Wi-Fi hoạt động.
  • ESP32 xử lý giao diện.
  • Loa hoặc microphone có thể đang hoạt động.

Đây là trạng thái tiêu thụ nhiều điện nhất.

Idle

Người dùng không tương tác trong một khoảng thời gian ngắn:

  • Giảm độ sáng màn hình.
  • Dừng animation không cần thiết.
  • Tắt amplifier nếu không phát âm thanh.
  • Giảm tần suất cập nhật cảm biến.
  • Duy trì khả năng phản hồi nhanh.

Sleep

Thiết bị không được sử dụng trong thời gian dài:

  • Tắt đèn nền màn hình.
  • Tắt amplifier và cảm biến không cần thiết.
  • Đưa ESP32 vào light sleep hoặc deep sleep.
  • Chỉ giữ lại nguồn đánh thức cần thiết.

Việc thiết kế rõ ba trạng thái này thường mang lại hiệu quả tốt hơn nhiều so với chỉ tối ưu từng dòng code nhỏ.

Sơ đồ chuyển trạng thái Active, Idle, Sleep và Wake-up của robot ESP32.

Tiết kiệm lớn nhất thường đến từ việc rời Active sớm và chỉ đánh thức đúng lúc.

3. Giảm độ sáng và tắt đèn nền màn hình

Với màn hình TFT, đèn nền thường là một trong những thành phần tiêu thụ điện nhiều nhất.

Không nên nối chân đèn nền trực tiếp vào nguồn nếu muốn tối ưu pin. Thay vào đó, nên điều khiển đèn nền bằng:

  • Một GPIO hỗ trợ PWM.
  • Transistor hoặc MOSFET.
  • Mạch LED driver nếu màn hình yêu cầu dòng lớn hơn.

Có thể áp dụng các mức sáng theo trạng thái:

  • Active: 60–100%.
  • Idle: 10–30%.
  • Sleep: tắt hoàn toàn.

Trong nhiều trường hợp, giảm độ sáng từ 100% xuống khoảng 50% gần như không ảnh hưởng nhiều đến trải nghiệm, nhưng giúp giảm đáng kể dòng tiêu thụ.

Không nên chỉ chuyển giao diện sang màu đen rồi cho rằng màn hình đã tiết kiệm điện. Với phần lớn màn hình TFT dùng backlight, đèn nền vẫn tiêu thụ điện nếu chưa được tắt.

ESP32 điều khiển đèn nền màn hình qua PWM và MOSFET với ba mức Active, Idle và Off.

Giao diện màu đen không làm TFT tiết kiệm nếu backlight vẫn được cấp nguồn.

4. Chỉ bật Wi-Fi khi thực sự cần

Wi-Fi có thể tạo ra các đỉnh dòng lớn khi truyền và nhận dữ liệu. Nếu thiết bị không cần kết nối liên tục, không nên giữ Wi-Fi ở trạng thái hoạt động toàn thời gian.

Một số hướng tối ưu:

  • Chỉ bật Wi-Fi khi đồng bộ dữ liệu.
  • Ngắt kết nối sau khi hoàn thành tác vụ.
  • Gom nhiều request thành một lần gửi.
  • Tránh polling server liên tục.
  • Tăng khoảng thời gian giữa các lần kiểm tra dữ liệu.
  • Sử dụng modem sleep khi cần duy trì kết nối.

Ví dụ, thay vì gửi trạng thái lên server mỗi giây, có thể chỉ gửi khi trạng thái thay đổi hoặc theo chu kỳ vài phút.

Với robot Mochi, Wi-Fi có thể được bật khi cần gọi API, tải nội dung hoặc đồng bộ cấu hình. Trong thời gian chỉ hiển thị biểu cảm offline, Wi-Fi không nhất thiết phải hoạt động.

Nếu cần giữ kết nối, modem sleep là lựa chọn khác với việc tắt Wi-Fi hoàn toàn. Radio có thể ngủ giữa các mốc beacon trong khi kết nối vẫn được duy trì. Hiệu quả phụ thuộc access point, chu kỳ listen interval và lưu lượng nền; một kết nối liên tục nhận broadcast hoặc polling dày vẫn khó tiết kiệm.

So sánh Wi-Fi luôn bật với chiến lược gom tác vụ và bật radio theo từng khoảng ngắn.

Duty cycle radio thấp giúp giảm dòng trung bình mà vẫn hoàn thành cùng lượng công việc.

5. Tắt amplifier khi không phát âm thanh

Mạch khuếch đại âm thanh vẫn có thể tiêu thụ điện dù loa không phát tiếng.

Nếu amplifier có chân EN, SHDN hoặc SD, nên kết nối chân này với GPIO của ESP32.

Quy trình đơn giản:

  1. Bật amplifier trước khi phát âm thanh.
  2. Chờ mạch ổn định trong thời gian ngắn.
  3. Phát âm thanh.
  4. Tắt amplifier sau khi phát xong.

Cách này vừa tiết kiệm điện, vừa có thể giảm tiếng nhiễu hoặc tiếng nền khi loa không hoạt động.

Nếu dùng mạch như MAX98357A, cần kiểm tra cách điều khiển chế độ shutdown theo datasheet và thiết kế thực tế.

ESP32 điều khiển chân shutdown của amplifier theo trình tự bật, phát audio và tắt.

Điều khiển shutdown vừa giảm dòng tĩnh vừa hạn chế nhiễu loa khi không phát âm thanh.

6. Giảm tần suất cập nhật giao diện

Không phải phần tử giao diện nào cũng cần cập nhật liên tục ở 30 hoặc 60 FPS.

Một số cách giảm tải:

  • Chỉ redraw khi nội dung thay đổi.
  • Giảm FPS của animation ở trạng thái idle.
  • Tạm dừng GIF khi người dùng không nhìn hoặc không tương tác.
  • Không cập nhật đồng hồ, cảm biến hoặc trạng thái quá thường xuyên.
  • Giảm số lượng hiệu ứng chuyển động đồng thời.

Ví dụ, biểu cảm mắt chớp có thể chỉ cập nhật trong vài trăm mili giây rồi dừng, thay vì chạy animation liên tục.

Với LVGL, nên hạn chế gọi invalidate hoặc cập nhật widget khi dữ liệu không thay đổi. Điều này giúp ESP32 có thêm thời gian rảnh để chuyển sang chế độ tiết kiệm điện.

7. Sử dụng light sleep và deep sleep đúng trường hợp

ESP32 hỗ trợ nhiều chế độ tiết kiệm điện, trong đó phổ biến nhất là light sleep và deep sleep.

Light sleep

Phù hợp khi thiết bị cần:

  • Thức dậy nhanh.
  • Giữ lại trạng thái chương trình.
  • Tiếp tục phản hồi trong thời gian ngắn.
  • Được đánh thức bởi timer hoặc GPIO.

Light sleep phù hợp với trạng thái idle kéo dài vài giây đến vài phút.

ESP-IDF còn hỗ trợ dynamic frequency scaling và automatic Light Sleep qua esp_pm_configure(). Automatic Light Sleep dựa trên FreeRTOS Tickless Idle và chỉ xảy ra khi không có power-management lock nào đang giữ CPU/APB ở mức cao hoặc cấm sleep. Khi tối ưu thực tế, nên kiểm tra lock bị giữ quên bằng các API profiling của ESP-IDF thay vì chỉ nhìn cấu hình sdkconfig.

Deep sleep

Phù hợp khi thiết bị không cần hoạt động trong thời gian dài:

  • Mức tiêu thụ thấp hơn light sleep.
  • Phần lớn hệ thống bên trong được tắt.
  • Khi thức dậy, chương trình thường khởi động lại.
  • Có thể đánh thức bằng timer, GPIO hoặc touch tùy cấu hình.

Deep sleep phù hợp với thiết bị cảm biến, thiết bị chỉ hoạt động theo lịch hoặc Mochi ở trạng thái tắt dài hạn.

Trong Light Sleep và Deep Sleep, Wi-Fi/Bluetooth không tự duy trì kết nối như modem sleep. Deep Sleep cũng tắt CPU cùng phần lớn RAM và ngoại vi số; sau wake-up, firmware đi lại qua luồng khởi động, dù một phần RTC memory có thể được giữ nếu cần. Nguồn wake-up hỗ trợ phụ thuộc họ ESP32 và chân được chọn, vì vậy cần đối chiếu đúng tài liệu của chip đang dùng trước khi chốt nút, touch hoặc timer.

Cần lưu ý rằng deep sleep chỉ thực sự hiệu quả nếu các ngoại vi như màn hình, amplifier, LED và cảm biến cũng được tắt. Nếu ESP32 ngủ nhưng màn hình vẫn sáng, tổng dòng tiêu thụ vẫn còn cao.

So sánh Active, Modem Sleep, Light Sleep và Deep Sleep theo kết nối, trạng thái RAM và thời gian wake-up.

Chế độ phù hợp phụ thuộc vào kết nối cần giữ và thời gian phản hồi chấp nhận được.

8. Ngắt nguồn các ngoại vi không cần thiết

Một số module vẫn tiêu thụ dòng tĩnh ngay cả khi không được sử dụng.

Có thể dùng load switch hoặc MOSFET để tắt nguồn cho:

  • Màn hình.
  • Amplifier.
  • Microphone.
  • Cảm biến.
  • LED trang trí.
  • Module mở rộng.

Không nên cắt nguồn tùy ý nếu ngoại vi vẫn đang kết nối với GPIO ở mức cao. Dòng điện có thể đi ngược qua chân tín hiệu và làm module không tắt hoàn toàn.

Khi ngắt nguồn ngoại vi, nên:

  • Đưa các GPIO liên quan về trạng thái phù hợp.
  • Tránh cấp điện ngược qua SPI, I2C hoặc UART.
  • Kiểm tra trình tự bật và tắt nguồn.
  • Chờ module ổn định trước khi giao tiếp lại.

MOSFET load switch ngắt nguồn riêng cho display, sensors và amplifier, kèm lưu ý chống back-power qua GPIO.

Cắt rail ngoại vi chỉ hiệu quả khi các chân tín hiệu cũng được đưa về trạng thái an toàn.

9. Chọn mạch nguồn có dòng tĩnh thấp

Không chỉ ESP32 và màn hình tiêu thụ điện. Bản thân LDO, charger, LED và các mạch bảo vệ cũng tiêu thụ một lượng dòng nhất định.

Khi thiết bị hoạt động liên tục, vài trăm microamp có thể không đáng kể. Nhưng trong deep sleep, dòng tĩnh của mạch nguồn có thể trở thành phần tiêu thụ chính.

Khi chọn linh kiện nguồn, nên quan tâm đến:

  • Quiescent current.
  • Dropout voltage.
  • Hiệu suất ở tải thấp.
  • Dòng tối đa.
  • Khả năng ổn định với tụ đầu vào và đầu ra.
  • Dòng tiêu thụ khi shutdown.

Nếu thiết bị chủ yếu hoạt động ở tải thấp, nên chọn regulator có dòng tĩnh thấp thay vì chỉ nhìn vào dòng đầu ra tối đa.

Ngoài ra, LED nguồn luôn sáng cũng có thể tiêu thụ vài mA liên tục. Với sản phẩm chạy pin, nên bỏ LED không cần thiết hoặc điều khiển LED bằng GPIO.

10. Đo dòng tiêu thụ theo từng trạng thái

Tối ưu pin mà không đo dòng sẽ rất khó đánh giá hiệu quả.

Nên đo ít nhất các trạng thái sau:

  • Khởi động.
  • Màn hình sáng tối đa.
  • Wi-Fi kết nối.
  • Wi-Fi truyền dữ liệu.
  • Phát âm thanh.
  • Idle.
  • Light sleep.
  • Deep sleep.

Có thể dùng:

  • Đồng hồ đo dòng.
  • USB power meter.
  • Power profiler.
  • Điện trở shunt và oscilloscope.

Đồng hồ đo thông thường phù hợp để kiểm tra dòng trung bình. Tuy nhiên, để quan sát các đỉnh dòng ngắn của Wi-Fi hoặc audio, power profiler hoặc oscilloscope sẽ cho kết quả tốt hơn.

Sơ đồ đo dòng board ESP32 bằng shunt và power profiler để quan sát dòng trung bình cùng xung Wi-Fi và audio.

Multimeter cho số trung bình; profiler hoặc oscilloscope cho biết rail có chịu được xung tải hay không.

11. Ước tính thời lượng pin

Công thức đơn giản:

Battery life ≈ Battery capacity / Average current

Ví dụ:

  • Pin: 1000 mAh.
  • Dòng trung bình: 200 mA.
1000 / 200 = 5 giờ

Trong thực tế, thời lượng thường thấp hơn do:

  • Tổn hao của mạch nguồn.
  • Dung lượng pin không đạt đúng giá trị công bố.
  • Pin bị giảm dung lượng theo thời gian.
  • Các đỉnh dòng của Wi-Fi, màn hình và loa.
  • Điện áp pin giảm khiến regulator hoạt động kém hiệu quả.

Có thể dùng hệ số an toàn khoảng 70–85% khi ước tính ban đầu.

Ví dụ:

Thời lượng thực tế ≈ 5 giờ × 0,8 = 4 giờ

Quan trọng hơn, cần tính theo dòng trung bình của toàn bộ chu kỳ hoạt động, không chỉ dòng ở trạng thái active.

Ví dụ thiết bị hoạt động theo chu kỳ:

  • Active 10% thời gian: 250 mA.
  • Idle 30% thời gian: 80 mA.
  • Sleep 60% thời gian: 2 mA.

Dòng trung bình:

Iavg = 250 × 0,1 + 80 × 0,3 + 2 × 0,6
Iavg = 50,2 mA

Với pin 1000 mAh:

Battery life ≈ 1000 / 50,2 ≈ 19,9 giờ

Công thức tính dòng trung bình theo chu kỳ Active, Idle, Sleep và ước tính thời lượng pin 1.000 mAh.

Ví dụ cho Iavg 50,2 mA và runtime lý tưởng 19,9 giờ trước hệ số suy giảm thực tế.

12. Cấu hình gợi ý cho robot Mochi

Một cấu hình quản lý năng lượng thực tế có thể như sau:

Khi đang sử dụng

  • Màn hình sáng 70%.
  • Wi-Fi chỉ bật khi cần gọi API.
  • Amplifier chỉ bật khi phát âm thanh.
  • Animation chạy theo trạng thái.

Sau 30 giây không tương tác

  • Giảm độ sáng màn hình còn 20%.
  • Giảm FPS animation.
  • Tắt amplifier.
  • Giảm tần suất đọc cảm biến.

Sau 2–5 phút

  • Tắt backlight.
  • Dừng animation.
  • Ngắt nguồn các ngoại vi không cần thiết.
  • Chuyển sang light sleep.

Sau thời gian dài hơn

  • Lưu trạng thái cần thiết.
  • Tắt màn hình và ngoại vi.
  • Chuyển sang deep sleep.
  • Đánh thức bằng nút nhấn, cảm ứng hoặc timer.

Các khoảng thời gian này nên cho phép cấu hình, vì hành vi phù hợp còn phụ thuộc vào mục đích sử dụng của sản phẩm.

Nếu Mochi đã có state machine cảm xúc, power state nên là một lớp riêng nhưng nhận cùng event người dùng. Có thể xem thiết kế state machine cảm xúc cho Mochi để tránh buộc animation trực tiếp vào lệnh sleep. Phần phần cứng nguồn, dropout và power-path được phân tích riêng trong bài thiết kế nguồn pin cho ESP32-S3.

Kết luận

Tối ưu thời lượng pin cho ESP32 không nằm ở một thay đổi duy nhất. Hiệu quả tốt nhất đến từ việc kết hợp nhiều giải pháp:

  • Giảm hoặc tắt đèn nền khi không cần.
  • Không giữ Wi-Fi hoạt động liên tục.
  • Tắt amplifier và ngoại vi khi rảnh.
  • Giảm tần suất cập nhật giao diện.
  • Sử dụng light sleep và deep sleep.
  • Chọn regulator có dòng tĩnh thấp.
  • Đo dòng thực tế theo từng trạng thái.

Thay vì cố làm cho trạng thái active tiêu thụ ít hơn một chút, hãy tập trung giảm thời gian thiết bị nằm trong trạng thái active. Đây thường là cách đơn giản và hiệu quả nhất để kéo dài thời lượng pin.

Tham khảo

Chia sẻ

LinkedInFacebookX

Tiếp tục khám phá

Đọc tiếp

Bài viết liên quan

Xem thêm trong Bài viết

Nastrotek sử dụng cookie để phân tích truy cập và cá nhân hóa quảng cáo, giúp hiểu cách website được sử dụng. Bạn có thể chấp nhận hoặc từ chối các cookie không thiết yếu.