3.29. Các chế độ tiết kiệm điện và ngủ¶
Camera chạy bằng pin và các cảm biến hoạt động không liên tục không cần CPU chạy ở tốc độ tối đa mọi lúc. Module machine cung cấp bốn trạng thái tiết kiệm điện ngày càng sâu hơn -- active, idle(), lightsleep(), và deepsleep(). Mỗi bước sâu hơn tắt nhiều phần hơn của chip và tiết kiệm điện hơn, nhưng đổi lại là thời gian thức dậy lâu hơn. Chọn trạng thái phù hợp là sự cân bằng giữa mức độ tiết kiệm điện của camera và tốc độ phản hồi khi có sự kiện xảy ra.
3.29.1. Hoạt động (Active)¶
Đây là trạng thái mặc định. CPU đang chạy Python, mọi ngoại vi đều được cấp xung nhịp, và mức tiêu thụ dòng điện ở mức cao nhất -- hàng chục milliampe trên đường nguồn logic của camera, cộng thêm bất kỳ thiết bị phụ kiện nào được kết nối.
3.29.2. idle()¶
machine.idle() chặn xung nhịp CPU cho đến khi có bất kỳ ngắt nào được kích hoạt (một ngoại vi, một bộ định thời, hoặc IRQ của chân). RAM vẫn hoạt động, các ngoại vi tiếp tục bật, các xung nhịp vẫn chạy -- chỉ có CPU bị tạm dừng, và nó thức dậy trong vài micro giây khi có công việc cần làm.
Sử dụng nó bên trong bất kỳ vòng lặp thăm dò chặt chẽ nào đang chờ điều gì đó bên ngoài xảy ra:
import machine
while not button_pressed():
machine.idle()
CPU dừng tiêu tốn chu kỳ cho việc kiểm tra while và thức dậy tự nhiên khi sự kiện tiếp theo xảy ra -- tiết kiệm nhỏ cộng dồn qua một vòng lặp chạy hàng triệu lần.
3.29.3. lightsleep()¶
machine.lightsleep() là bước tiếp theo. CPU bị dừng hoàn toàn và hầu hết các xung nhịp nội bộ của chip bị tắt, nhưng RAM và trạng thái ngoại vi được giữ nguyên. Khi nguồn thức dậy kích hoạt, tập lệnh tiếp tục từ đúng nơi nó đã gọi lightsleep -- các biến, handle đang mở và dữ liệu đang chờ đều còn nguyên -- sau khoảng vài mili giây.
import machine
from machine import Pin
wake_pin = Pin("P0", Pin.IN, Pin.PULL_UP)
wake_pin.irq(lambda _: None, trigger=Pin.IRQ_FALLING, wake=machine.SLEEP)
while True:
do_work()
machine.lightsleep() # wakes on a falling edge on P0
Nguồn thức dậy -- IRQ của chân ở đây -- phải được cấu hình trước lệnh gọi ngủ. Mức tiêu thụ điện giảm đáng kể so với chế độ hoạt động; con số chính xác phụ thuộc vào board và các ngoại vi vẫn được cấu hình.
3.29.4. deepsleep()¶
machine.deepsleep() là trạng thái sâu nhất. CPU dừng, các ngoại vi bị ngắt nguồn, và nội dung RAM có thể bị mất. Chỉ có mạch thức dậy và một phần logic luôn bật nhỏ vẫn tiêu thụ điện.
Khi nguồn thức dậy kích hoạt, chip khởi động lại từ đầu tập lệnh chính -- deepsleep không trả về. Tập lệnh phân biệt thức dậy từ deepsleep với khởi động nguồn mới hoặc reset cứng bằng cách sử dụng machine.reset_cause():
import machine
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
# Woke from deepsleep -- restore state from non-volatile storage,
# take a measurement, etc.
pass
else:
# Fresh boot
pass
do_work()
machine.deepsleep(60_000) # arm RTC wake for 60 s, sleep, then restart
Đối số mili giây cho deepsleep() kích hoạt báo thức RTC trên chip nội bộ -- RTC là thứ duy trì thời gian thức dậy qua giấc ngủ, vì hầu hết các bộ định thời khác đã bị ngắt nguồn. Gọi deepsleep() không có đối số để lại việc thức dậy cho bất kỳ nguồn nào bạn đã cấu hình riêng (IRQ chân, báo thức RTC được kích hoạt bên ngoài).
Vì tập lệnh khởi động lại, bất kỳ thứ gì vòng lặp tiếp theo cần đều phải được xây dựng lại ở đầu main.py hoặc được lưu vào bộ nhớ flash (hoặc vào các thanh ghi sao lưu của RTC, trên các phần có chúng). Deepsleep cho tiết kiệm điện lớn nhất nhưng đòi hỏi tái cấu trúc chương trình nhiều nhất -- ứng dụng phải hoạt động như một loạt "cụm đo lường" ngắn được tách bởi các giấc ngủ, thay vì một vòng lặp chạy dài với trạng thái trong RAM.
3.29.5. Chọn trạng thái¶
Trạng thái phù hợp phụ thuộc vào việc camera đang chờ gì:
Vòng lặp thăm dò chặt chẽ, chờ mili giây. Sử dụng
idle(). Tiết kiệm nhỏ mỗi chu kỳ nhưng lớn tổng thể, và thức dậy không thể nhận thấy.Không hoạt động vài giây hoặc phút giữa các sự kiện. Sử dụng
lightsleep(). Trạng thái được giữ nguyên, thức dậy nhanh, và mức tiêu thụ điện chỉ bằng một phần nhỏ chế độ hoạt động.Không hoạt động vài phút hoặc lâu hơn giữa các đợt làm việc ngắn. Sử dụng
deepsleep(). Chip thực sự tắt giữa các sự kiện, và cấu trúc tập lệnh chuyển sang vòng lặp thức dậy, đo lường, ngủ.
Dù ở trạng thái nào, nguồn thức dậy quan trọng không kém bản thân trạng thái -- một deepsleep chỉ thức dậy theo bộ định thời là vòng lặp đo lường theo chu kỳ; một lightsleep thức dậy theo IRQ chân là cảm biến điều khiển theo sự kiện. Các hàm ngủ của module machine, báo thức RTC, và irq() cùng nhau cung cấp các khối xây dựng.