3.29. Lågeffekts- och viloläge¶
Batteridrivna kameror och sensorer som bara är aktiva ibland behöver inte ha processorn körande på full hastighet hela tiden. machine-modulen exponerar fyra successivt djupare energisparlägen – active, idle(), lightsleep() och deepsleep(). Varje djupare steg stänger av mer av chipet och sparar mer energi, på bekostnad av en längre uppvakning. Att välja rätt läge är en avvägning mellan hur mycket energi kameran sparar och hur snabbt den kan reagera när något händer.
3.29.1. Active¶
Standardläget. Processorn kör Python, all kringutrustning är klockad och strömförbrukningen är som högst – tiotals milliampere på kamerans logikskena, plus vad som helst som anslutna tillbehör drar genom den.
3.29.2. idle()¶
machine.idle() spärrar processorns klocka tills något avbrott utlöses (en kringutrustning, en timer, ett stift-IRQ). RAM-minnet är aktivt, kringutrustningen förblir på, klockorna fortsätter gå – endast själva processorn pausas, och den vaknar inom mikrosekunder när det finns arbete att utföra.
Använd det inuti vilken tät pollningsloop som helst som väntar på att något externt ska hända:
import machine
while not button_pressed():
machine.idle()
Processorn slutar bränna cykler på själva while-kontrollen och vaknar naturligt när nästa händelse anländer – en liten besparing som adderas ihop över en loop som körs miljontals gånger.
3.29.3. lightsleep()¶
machine.lightsleep() är nästa steg ned. Processorn stoppas helt och de flesta av chipets interna klockor stängs av, men RAM-minnet och kringutrustningens tillstånd bevaras. När väckningskällan utlöses återupptas skriptet exakt där det anropade lightsleep – variabler, öppna handtag och väntande data är alla intakta – i storleksordningen millisekunder senare.
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
Väckningskällan – här ett stift-IRQ – måste konfigureras före viloanropet. Strömförbrukningen sjunker betydligt jämfört med aktivt läge; den exakta siffran beror på kortet och vilken kringutrustning som fortfarande är konfigurerad.
3.29.4. deepsleep()¶
machine.deepsleep() är det djupaste läget. Processorn stoppas, kringutrustningen stängs av och RAM-innehållet kan gå förlorat. De enda saker som fortfarande drar ström är väckningskretsen och en liten del alltid-på-logik.
När väckningskällan utlöses startar chipet från början av huvudskriptet – deepsleep returnerar inte. Skriptet skiljer en uppvakning från deepsleep från en ny strömpåslagning eller hård återställning med hjälp av 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
Millisekundargumentet till deepsleep() armerar internt det inbyggda RTC-larmet – RTC:n är det som bär uppvakningstiden genom vilan, eftersom de flesta andra timrar är avstängda. Att anropa deepsleep() utan argument överlåter uppvakningen åt vilken källa du än konfigurerat separat (ett stift-IRQ, ett externt armerat RTC-larm).
Eftersom skriptet startar om måste allt som nästa iteration behöver antingen återskapas högst upp i main.py eller sparas till flashminnet (eller till RTC:ns backup-register, på de delar som har sådana). Deepsleep ger den största energibesparingen men kräver mest omstrukturering av programmet – tillämpningen måste bete sig som en serie korta ”mätskurar” åtskilda av vilolägen, snarare än en långkörande loop med tillstånd i RAM.
3.29.5. Att välja ett läge¶
Rätt läge beror på vad kameran väntar på:
Tät pollningsloop, väntar millisekunder. Använd
idle(). Besparingarna är små per cykel men stora sammantaget, och uppvakningen är osynlig.Inaktiv i sekunder eller minuter mellan händelser. Använd
lightsleep(). Tillståndet bevaras, uppvakningen är snabb och strömförbrukningen är en bråkdel av aktivt läge.Inaktiv i minuter eller längre mellan korta arbetsskurar. Använd
deepsleep(). Chipet är i praktiken avstängt mellan händelser, och skriptstrukturen övergår till en vakna-mäta-vila-loop.
Oavsett läge spelar väckningskällan lika stor roll som själva läget – en deepsleep som bara vaknar på en timer är en arbetscykelstyrd mätloop; en lightsleep som vaknar på ett stift-IRQ är en händelsestyrd sensor. machine-modulens vilofunktioner, RTC-larm och irq() ger tillsammans byggstenarna.