3.29. Mode daya rendah dan sleep

Kamera bertenaga baterai dan sensor yang aktif secara berkala tidak membutuhkan CPU berjalan pada kecepatan penuh sepanjang waktu. Modul machine mengekspos empat status hemat daya yang semakin dalam -- active, idle(), lightsleep(), dan deepsleep(). Setiap langkah lebih dalam mematikan lebih banyak chip dan menghemat lebih banyak daya, dengan biaya waktu bangun yang lebih lama. Memilih yang tepat adalah pertimbangan antara seberapa banyak daya yang dihemat kamera dan seberapa cepat kamera dapat bereaksi ketika sesuatu terjadi.

3.29.1. Active

Status default. CPU menjalankan Python, setiap periferal mendapat clock, dan konsumsi arus berada pada level tertinggi -- puluhan miliampere pada rel logika kamera, ditambah apa pun yang ditarik oleh aksesori yang terpasang.

3.29.2. idle()

machine.idle() menghentikan clock CPU hingga interupsi apa pun terpicu (sebuah periferal, timer, atau pin IRQ). RAM tetap aktif, periferal tetap menyala, clock terus berjalan -- hanya CPU itu sendiri yang dijeda, dan CPU bangun dalam hitungan mikrodetik ketika ada pekerjaan yang harus dilakukan.

Gunakan di dalam loop polling ketat mana pun yang sedang menunggu sesuatu dari luar terjadi:

import machine

while not button_pressed():
    machine.idle()

CPU berhenti membuang siklus pada pemeriksaan while itu sendiri dan bangun secara alami ketika event berikutnya tiba -- penghematan kecil yang bertambah selama loop yang berjalan jutaan kali.

3.29.3. lightsleep()

machine.lightsleep() adalah langkah berikutnya. CPU dihentikan sepenuhnya dan sebagian besar clock internal chip dimatikan, tetapi RAM dan status periferal tetap dipertahankan. Ketika sumber bangun terpicu, skrip dilanjutkan tepat dari tempat ia memanggil lightsleep -- variabel, handle terbuka, dan data yang tertunda semuanya utuh -- dalam hitungan milidetik kemudian.

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

Sumber bangun -- sebuah pin IRQ di sini -- harus dikonfigurasi sebelum panggilan sleep. Konsumsi daya turun secara signifikan relatif terhadap mode aktif; angka pastinya tergantung pada board dan periferal apa yang masih dikonfigurasi.

3.29.4. deepsleep()

machine.deepsleep() adalah status paling dalam. CPU berhenti, periferal dimatikan, dan konten RAM mungkin hilang. Satu-satunya hal yang masih menarik daya adalah sirkuit bangun dan sedikit logika always-on.

Ketika sumber bangun terpicu, chip boot dari awal skrip utama -- deepsleep tidak kembali. Skrip membedakan bangun dari deepsleep dari power-on segar atau hard reset menggunakan 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

Argumen milidetik untuk deepsleep() secara internal memprogram alarm RTC on-chip -- RTC adalah yang membawa timing bangun melalui sleep, karena sebagian besar timer lainnya dimatikan. Memanggil deepsleep() tanpa argumen menyerahkan bangun ke sumber apa pun yang Anda konfigurasi secara terpisah (pin IRQ, alarm RTC yang diprogram secara eksternal).

Karena skrip dimulai ulang, apa pun yang dibutuhkan iterasi berikutnya harus direkonstruksi di bagian atas main.py atau disimpan ke flash (atau ke register cadangan RTC, pada bagian yang memilikinya). Deepsleep memberikan penghematan daya terbesar tetapi memerlukan restrukturisasi program paling banyak -- aplikasi harus berperilaku sebagai serangkaian "burst pengukuran" pendek yang dipisahkan oleh sleep, bukan loop yang berjalan lama dengan status di RAM.

3.29.5. Memilih status

Status yang tepat tergantung pada apa yang ditunggu kamera:

  • Loop polling ketat, menunggu milidetik. Gunakan idle(). Penghematan per siklus kecil tetapi besar secara agregat, dan waktu bangun tidak terasa.

  • Idle selama detik atau menit di antara event. Gunakan lightsleep(). Status dipertahankan, bangun cepat, dan konsumsi daya hanya sebagian kecil dari mode aktif.

  • Idle selama menit atau lebih di antara burst pekerjaan singkat. Gunakan deepsleep(). Chip secara efektif mati di antara event, dan struktur skrip beralih ke loop bangun, ukur, tidur.

Apa pun statusnya, sumber bangun sama pentingnya dengan status itu sendiri -- deepsleep yang hanya bangun pada timer adalah loop pengukuran duty-cycle; lightsleep yang bangun pada pin IRQ adalah sensor berbasis event. Fungsi sleep modul machine, alarm RTC, dan irq() bersama-sama memberikan blok pembangun.