Kontrolery ESP8266/32 obsługują kilka trybów oszczędzania energii. Tryby te pozwalają wprowadzać układ w tryb hibernacji czy głęboki sen. Moduł może budzić się w celu wysłania danych na serwer, naciśnięciu przycisku lub wykrycia ruchu.
Wyróżniamy 3 tryby oszczędzania energii:
Modem-Sleep
(uśpienie modułu) – wykorzystywany, gdy aplikacja wymaga pracy procesora oraz interfejsów wejściowych oraz wyjściowych. Modem Wi-Fi przechodzi w stan spoczynku podczas braku transmisji. Dostępne są 3 tryby pracy DTIM 1-3.
Light-sleep
(lekki sen) – zawieszana jest praca modułu Wi-Fi, wyłączany jest procesor, gdy jego praca nie jest konieczna.
Deep-Sleep
(głęboki sen) – tryb najbardziej energooszczędny. Procesor jest wybudzany cyklicznie, według wcześniej ustalonej sekwencji, poprzez RTC. Tryb wykorzystuje się często w przypadku zasilania bateryjnego.
Zależności pomiędzy trybami
W zależności od wykorzystanego trybu w projekcie, moduły cechują się innym zapotrzebowaniem na pobieraną energię. Pozwala to na dostosowanie urządzenia do źródła zasilania.
Element | Modem-Sleep | Light-Sleep | Deep-Sleep |
WiFi | Nie | Nie | Nie |
Zegar | Tak | Nie | Nie |
RTC | Tak | Tak | Tak |
CPU | Tak | Czuwanie | Nie |
Zużycie energii | 15mA | 0,4 mA | 20 uA |
DTIM=1 | 16,2 mA | 1.8 mA | - |
DTIM=2 | 15,4 mA | 1 mA | - |
DTIM=3 | 15.2 mA | 0,6 mA | - |
Aktywacja trybu
Tryb jest aktywowany poprzez połączenie pinów D0 (GPIO16) z RST. W tym trybie nie ma możliwość wgrania programu.
Wykorzystanie trybów
Komendy odpowiadające za sterowanie trybami:
ESP.deepsleep (0); // Zawiesza moduł do czasu wybudzenia przez skok na pinie RST
ESP.deepsleep (2 * 1000000); // Budzenie modułu co 2 sekund
ESP.deepsleep (10000000, RF_DISABLED); // Wybudza moduł co 10 sekund bez ponownej aktywacji modemu WiFi
Kod programu
Program odpowiada, za wprowadzenie modułu w 10 sekundowy sen po wykonaniu funkcji tick.
#include <ESP8266WiFi.h>
#include <Ticker.h>
Ticker ticker;
const char* ssid = "WiFiTestESP8266"; // WiFi SSID
const char* password = "rI}M>$a]1y7F("; // WiFi password
#define sleapDuration 10// Czas uśpienia w s
#define numberConnectionAttempts 10 // Próby połączenia WiFi
void tick()
{
// Kod/instrukcje wykonywany w jednym cyklu
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
ticker.attach(0.5, tick);
Serial.begin(9600);
WiFi.begin(ssid, password);
int _try = 0;
while (WiFi.status() != WL_CONNECTED) {
Serial.print("..");
delay(500);
_try++;
if ( _try >= numberConnectionAttempts ) {
Serial.println("WiFi niedostępne");
ESP.deepSleep(sleapDuration * 1000000);// Uśpienie modułu Wi-Fi na 10s
}
}
Serial.println("Połączono z siecią Wifi");
Serial.print ( "IP adres: " );
Serial.println ( WiFi.localIP() );
ESP.deepSleep(sleapDuration * 1000000); // Uśpienie modułu Wi-Fi na 10s
}
void loop() {
}