X

Kurs ESP - Tryby pracy

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.

Schemat ESP Sleep

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() {
  }