3.29. Načini rada s niskom potrošnjom i spavanjem

Kamere napajane baterijom i senzori koji su povremeno aktivni ne trebaju da CPU stalno radi punom brzinom. machine modul izlaže četiri sve dublja stanja štednje energije – active, idle(), lightsleep() i deepsleep(). Svaki dublji korak isključuje više dijelova čipa i štedi više energije, po cijenu duljeg buđenja. Odabir pravog stanja je kompromis između toga koliko energije kamera uštedi i koliko brzo može reagirati kada se nešto dogodi.

3.29.1. Active

Zadano stanje. CPU izvršava Python, svaka periferija ima takt, a potrošnja struje je na svom najvišem nivou – desetci miliampera na logičkoj naponskoj liniji kamere, plus sve što priključeni dodaci kroz nju povuku.

3.29.2. idle()

machine.idle() zaustavlja takt CPU-a dok ne okine bilo koji prekid (periferija, mjerač vremena, IRQ pina). RAM je aktivan, periferije ostaju uključene, taktovi i dalje rade – samo je sam CPU pauziran, a budi se u mikrosekundama kada ima posla.

Koristite ga unutar bilo koje uske petlje za ispitivanje (polling) koja čeka da se nešto vanjsko dogodi:

import machine

while not button_pressed():
    machine.idle()

CPU prestaje trošiti cikluse na samu while provjeru i budi se prirodno kada stigne sljedeći događaj – mala ušteda koja se zbroji kroz petlju koja se izvršava milijune puta.

3.29.3. lightsleep()

machine.lightsleep() je sljedeći korak naniže. CPU je potpuno zaustavljen i većina internih taktova čipa je isključena, ali RAM i stanje periferija su sačuvani. Kada okine izvor buđenja, skripta se nastavlja točno odande gdje je pozvala lightsleep – varijable, otvoreni rukovatelji i podaci na čekanju ostaju netaknuti – milisekundu kasnije.

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

Izvor buđenja – ovdje IRQ pina – mora biti konfiguriran prije poziva za spavanje. Potrošnja struje značajno pada u odnosu na aktivni način rada; točan broj ovisi o ploči i o tome koje su periferije još konfigurirane.

3.29.4. deepsleep()

machine.deepsleep() je najdublje stanje. CPU se zaustavlja, periferije se isključuju, a sadržaj RAM-a može biti izgubljen. Jedino što i dalje troši energiju jest sklop za buđenje i mali dio logike koji je uvijek uključen.

Kada okine izvor buđenja, čip podiže sustav od početka glavne skriptedeepsleep se ne vraća. Skripta razlikuje buđenje iz deepsleepa od svježeg uključivanja ili tvrdog resetiranja pomoću 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

Argument u milisekundama za deepsleep() interno postavlja RTC alarm na čipu – RTC je ono što prenosi vrijeme buđenja kroz spavanje, budući da je većina drugih mjerača vremena isključena. Pozivanje deepsleep() bez argumenta prepušta buđenje izvoru koji ste zasebno konfigurirali (IRQ pina, izvana postavljen RTC alarm).

Budući da se skripta ponovno pokreće, sve što sljedeća iteracija treba mora se ili rekonstruirati na vrhu main.py ili pohraniti u flash memoriju (ili u RTC-ove sigurnosne registre, na dijelovima koji ih imaju). Deepsleep daje najveću uštedu energije, ali nameće najviše preuređivanja programa – aplikacija se mora ponašati kao niz kratkih „naleta mjerenja” odvojenih spavanjima, umjesto dugotrajne petlje sa stanjem u RAM-u.

3.29.5. Odabir stanja

Pravo stanje ovisi o tome na što kamera čeka:

  • Uska petlja za ispitivanje, čeka milisekunde. Koristite idle(). Uštede su male po ciklusu, ali velike u zbroju, a buđenje je nevidljivo.

  • Neaktivnost u trajanju sekundi ili minuta između događaja. Koristite lightsleep(). Stanje je sačuvano, buđenje je brzo, a potrošnja struje je djelić aktivnog načina rada.

  • Neaktivnost u trajanju minuta ili dulje između kratkih naleta rada. Koristite deepsleep(). Čip je između događaja praktički isključen, a struktura skripte prelazi na petlju buđenje, mjerenje, spavanje.

Kakvo god stanje bilo, izvor buđenja je jednako važan kao i samo stanje – deepsleep koji se budi samo na mjerač vremena je petlja mjerenja s radnim ciklusom; lightsleep koji se budi na IRQ pina je senzor vođen događajima. Funkcije za spavanje machine modula, RTC alarmi i irq() zajedno daju gradivne blokove.