3.29. Düşük güç ve uyku modları

Pille çalışan kameraların ve aralıklı olarak etkin olan sensörlerin CPU’nun sürekli tam hızda çalışmasına ihtiyacı yoktur. machine modülü giderek derinleşen dört güç tasarrufu durumunu açığa çıkarır – active, idle(), lightsleep() ve deepsleep(). Her bir derin adım yonganın daha fazlasını kapatır ve daha fazla güç tasarrufu sağlar, ancak daha uzun bir uyanma süresi pahasına. Doğru olanı seçmek, kameranın ne kadar güç tasarrufu yaptığı ile bir şey olduğunda ne kadar hızlı tepki verebileceği arasında bir dengedir.

3.29.1. Active

Varsayılan durum. CPU Python çalıştırıyor, her çevre birimi saatleniyor ve akım çekişi en yüksek seviyede – kameranın mantık hattında onlarca miliamper, artı bağlı aksesuarların bunun üzerinden çektiği her şey.

3.29.2. idle()

machine.idle(), herhangi bir kesme tetiklenene kadar (bir çevre birimi, bir zamanlayıcı, bir pin IRQ’su) CPU saatini durdurur. RAM canlıdır, çevre birimleri açık kalır, saatler çalışmaya devam eder – yalnızca CPU’nun kendisi duraklatılır ve yapılacak iş olduğunda mikrosaniyeler içinde uyanır.

Harici bir şeyin gerçekleşmesini bekleyen herhangi bir sıkı yoklama döngüsü içinde kullanın:

import machine

while not button_pressed():
    machine.idle()

CPU, while kontrolünün kendisinde döngü harcamayı bırakır ve bir sonraki olay geldiğinde doğal olarak uyanır – milyonlarca kez çalışan bir döngüde birikip toplanan küçük bir tasarruf.

3.29.3. lightsleep()

machine.lightsleep() bir sonraki derin adımdır. CPU tamamen durdurulur ve yonganın dahili saatlerinin çoğu kapatılır, ancak RAM ve çevre birimi durumu korunur. Uyanma kaynağı tetiklendiğinde, betik lightsleep çağrısını yaptığı yerden tam olarak devam eder – değişkenler, açık tutamaçlar ve bekleyen veriler tamamen sağlam – yaklaşık milisaniyeler sonra.

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

Uyanma kaynağı – burada bir pin IRQ’su – uyku çağrısından önce yapılandırılmalıdır. Güç çekişi etkin moda göre önemli ölçüde düşer; tam değer karta ve hâlâ yapılandırılmış olan çevre birimlerine bağlıdır.

3.29.4. deepsleep()

machine.deepsleep() en derin durumdur. CPU durur, çevre birimlerinin gücü kesilir ve RAM içeriği kaybolabilir. Hâlâ güç çeken tek şeyler uyanma devresi ve küçük bir miktar her zaman açık mantıktır.

Uyanma kaynağı tetiklendiğinde yonga ana betiğin başından önyükleme yapardeepsleep geri dönmez. Betik, bir deepsleep uyanmasını yeni bir güç açılışından veya donanım sıfırlamasından machine.reset_cause() kullanarak ayırt eder:

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

deepsleep() fonksiyonuna verilen milisaniye argümanı, dahili olarak yonga üzerindeki RTC alarmını kurar – çoğu diğer zamanlayıcının gücü kesildiğinden, uyanma zamanlamasını uyku boyunca taşıyan şey RTC’dir. deepsleep() fonksiyonunu argümansız çağırmak, uyanmayı ayrıca yapılandırdığınız kaynağa (bir pin IRQ’su, harici olarak kurulmuş bir RTC alarmı) bırakır.

Betik yeniden başladığı için, bir sonraki yinelemenin ihtiyaç duyduğu her şeyin ya main.py dosyasının başında yeniden oluşturulması ya da flash belleğe (veya bunlara sahip parçalarda RTC’nin yedek yazmaçlarına) kalıcı olarak kaydedilmesi gerekir. Deepsleep en büyük güç tasarrufunu sağlar ancak en fazla program yeniden yapılandırmasını dayatır – uygulamanın, RAM’de durumu olan uzun süre çalışan bir döngü yerine, uyku aralarıyla ayrılmış bir dizi kısa “ölçüm patlaması” olarak davranması gerekir.

3.29.5. Bir durum seçmek

Doğru durum, kameranın neyi beklediğine bağlıdır:

  • Sıkı yoklama döngüsü, milisaniyeler bekliyor. idle() kullanın. Tasarruflar çevrim başına küçüktür ancak toplamda büyüktür ve uyanma görünmezdir.

  • Olaylar arasında saniyelerce veya dakikalarca boşta. lightsleep() kullanın. Durum korunur, uyanma hızlıdır ve güç çekişi etkin modun küçük bir kısmıdır.

  • Kısa iş patlamaları arasında dakikalarca veya daha uzun süre boşta. deepsleep() kullanın. Yonga olaylar arasında pratikte kapalıdır ve betik yapısı bir uyan, ölç, uyu döngüsüne kayar.

Durum ne olursa olsun, uyanma kaynağı en az durumun kendisi kadar önemlidir – yalnızca bir zamanlayıcıyla uyanan bir deepsleep, görev döngülü bir ölçüm döngüsüdür; bir pin IRQ’suyla uyanan bir lightsleep ise olay güdümlü bir sensördür. machine modülünün uyku fonksiyonları, RTC alarmları ve irq() birlikte yapı taşlarını sağlar.