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 skripte – deepsleep 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.