Inhaltsverzeichnis:

Akkulaufzeit mit Tiefschlaf sparen - Gunook
Akkulaufzeit mit Tiefschlaf sparen - Gunook

Video: Akkulaufzeit mit Tiefschlaf sparen - Gunook

Video: Akkulaufzeit mit Tiefschlaf sparen - Gunook
Video: Wieviel Tiefschlaf braucht man? | Schlaf-App | Schlafwissen 2024, Dezember
Anonim
Image
Image
Möglichkeiten zum Aufwecken des ESP32
Möglichkeiten zum Aufwecken des ESP32

Sind Sie daran interessiert, einen Akku mit Ihrem ESP32 zu verwenden? Wenn ja, bespreche ich heute einige wichtige technische Informationen zu diesem Thema. Wir wissen, dass dieser Mikrocontroller viel Energie verbraucht, wenn er Informationen überträgt. Es verbraucht fast 190 Milliampere. In diesem Video zeige ich Ihnen, wie Sie mit der sogenannten „DEEP SLEEP“-Funktion Energie aus dem ESP32 sparen können. Wir stellen den Chip so ein, dass er in diesen Modus wechselt, lernen die Möglichkeiten zum Beenden dieses Modus kennen und erstellen ein Beispiel, das drei verschiedene Möglichkeiten zum Aufwecken des ESP32 zeigt.

Es ist wichtig, sich daran zu erinnern, dass das Radio viel Energie verbraucht und nicht der Prozessor. Energiesparen ist sehr wichtig. Dies liegt daran, dass Endpunkte (die Schaltkreise, die Informationen senden) häufig batteriebetrieben sind und bis zu fünf Jahre halten sollten. Es gibt Hersteller, die eine Laufzeit von bis zu zehn Jahren versprechen, und dies gilt für hochwertige Batterien, die die Endpoints nicht so stark verbrauchen. In allen anderen Fällen empfehle ich Ihnen, Deep Sleep zu verwenden, um Energie aus Ihrem Kreislauf zu sparen.

Schritt 1: Einführung

Der ESP32 verfügt über einen Energiesparmodus namens „Deep Sleep“. In diesem Modus sind CPUs, der größte Teil des Arbeitsspeichers und alle digital getakteten Peripheriegeräte ausgeschaltet. Die einzigen noch anschließbaren Teile des Chips sind der RTC-Controller, RTC-Peripherie (einschließlich ULP-Coprozessor) und RTC-Speicher.

Wir haben mehrere Möglichkeiten, den ESP32 im Schlaf aufzuwecken. Weckquellen können jederzeit vor dem Aufrufen des Deep Sleep-Modus eingerichtet werden.

Schritt 2: Möglichkeiten zum Aufwecken des ESP32

Es gibt fünf Möglichkeiten, ESP32 zu wecken:

• Timer

• Externes Aufwachen (ext0)

• Externes Aufwachen (ext1)

• Aufwachen des ULP-Coprozessors

• Touchpad

Schritt 3: Timer

Der RTC-Controller verfügt über einen eingebauten Timer, mit dem der Chip nach einer vordefinierten Zeit aktiviert werden kann. Die Zeit wird auf Mikrosekunden genau angegeben.

esp_deep_sleep_enable_timer_wakeup(uint64_t time_in_us)

time_in_us> ist die Zeit in Mikrosekunden

Schritt 4: Externes Wakeup (ext0)

Das RTC-IO-Modul enthält eine Logik zum Auslösen des Alarms, wenn einer der RTC-GPIOs einen vordefinierten Logikpegel erreicht. Die RTC IO ist Teil der Stromdomäne der RTC-Peripheriegeräte, sodass die RTC-Peripheriegeräte während des Tiefschlafs am Leben bleiben, wenn diese Aktivierungsquelle angefordert wird.

esp_deep_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int-Ebene)

gpio_num> GPIO-Nummer, die als Aktivierungsquelle verwendet wird. Es können nur RTC-funktionale GPIOs verwendet werden: 0, 2, 4, 12-15, 25-27, 32-39.

level> Eingangspegel, der den Alarm auslöst (0 = LOW, 1 = HIGH)

Schritt 5: Externes Wakeup (ext1)

Der RTC-Controller enthält eine Logik zum Auslösen des Weckers unter Verwendung mehrerer RTC-GPIOs.

esp_deep_sleep_enable_ext1_wakeup(uint64_t-Maske, esp_ext1_wakeup_mode_t-Modus)

mask> Bitmaske der GPIO-Nummern, die eine Aktivierung bewirken. In dieser Bitmap können nur RTC-fähige GPIOs verwendet werden: 0, 2, 4, 12-15, 25-27, 32-39.

mode> Wählen Sie die Logikfunktion aus, mit der die Aktivierungsbedingung bestimmt wird:

• ESP_EXT1_WAKEUP_ALL_LOW: Erwacht, wenn alle ausgewählten GPIOs auf LOW sind

• ESP_EXT1_WAKEUP_ANY_HIGH: Erwacht, wenn einer der ausgewählten GPIOs HIGH ist

Schritt 6: ULP-Coprozessor-Wakeup

Der ULP-Coprozessor kann betrieben werden, während sich der Chip im Tiefschlaf befindet, und kann verwendet werden, um Sensoren zu suchen, ADC- oder kapazitive Berührungssensorwerte zu überwachen und den Chip zu aktivieren, wenn ein bestimmtes Ereignis erkannt wird.

Der ULP-Coprozessor ist Teil der Leistungsdomäne der RTC-Peripheriegeräte und führt das im langsamen RTC-Speicher gespeicherte Programm aus. Daher werden RTC-Peripheriegeräte und langsamer RTC-Speicher während des Deep Sleep aktiviert, wenn dieser Aktivierungsmodus angefordert wird.

Schritt 7: Touchpad

Der RTC-Controller enthält eine Logik zum Auslösen des Alarms mithilfe der kapazitiven Berührungssensoren. Die Definition des Touch-Pins ist jedoch anders. Wir müssen den Touch-Interrupt für jeden der gewünschten Pins verwenden.

Nach dem Einstellen der Interrupts haben wir den Wake-up-Modus aktiviert, um die Sensoren zu verwenden.

//Touchpad als Wakeup-Quelle konfigurieren esp_sleep_enable_touchpad_wakeup();

Schritt 8: Aufrufen des Tiefschlafmodus

Nach dem Einstellen eines Weckmodus reicht ein einziger Befehl, um den ESP32 in den Deep Sleep-Modus zu versetzen (Ausgabe von 2,5 μA oder weniger). Ich betone hier, dass dieser Aufwand vom ESP-Chip kommt und nicht von der Platte, da diese mehr ausgibt.

esp_deep_sleep_start();

Ab diesem Befehl schläft der ESP32 ein und führt beispielsweise die nächsten Codezeilen nicht aus.

Wichtig: Alle Weckeinstellungen müssen vor der Ausführung des obigen Befehls vorgenommen werden.

Schritt 9: Hier sind einige weitere wichtige Informationen

Hier sind einige weitere wichtige Informationen
Hier sind einige weitere wichtige Informationen

Der folgende Aufruf gibt die Ursache des ESP32-Aufweckens zurück.

1: EXT0 2: EXT1 3: TIMER 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause();

Wenn wir das Aufwecken durch das Touchpad einstellen, können wir über den Befehl wiederherstellen, bei welchem GPIO die Berührung aufgetreten ist

esp_sleep_get_touchpad_wakeup_status();

Jedes Mal, wenn der ESP32 aufwacht, wird das Setup erneut durchlaufen. Somit kehren alle Variablen, die nicht im RTC-Speicher definiert sind, in ihren Ausgangszustand zurück.

Um die Variablen auch nach dem Einschlafen im Speicher zu behalten, verwenden Sie die Variablendeklaration im folgenden Beispiel:

//RTC_DATA_ATTR hat eine Speichervariable RTCRTC_DATA_ATTR int bootCount = 0;

Schritt 10: Demonstration

Demonstration
Demonstration

Das Video zeigt das Programm in Übereinstimmung mit dem Bild.

Schritt 11: WiFi NodeMCU-32S ESP-WROOM-32

WLAN-KnotenMCU-32S ESP-WROOM-32
WLAN-KnotenMCU-32S ESP-WROOM-32

Schritt 12: Montage

Montage
Montage

Schritt 13: Programm

Wir werden jetzt ein Programm erstellen, in dem wir den ESP32 so konfigurieren, dass er in den Deep Sleep-Modus wechselt. Dies wird auf drei verschiedene Arten geweckt: eine für externes Aufwachen (ext0), eine für den Timer und eine für das Touchpad. Sie können nicht zusammenarbeiten, daher verwenden wir eine Variable, die ein Zähler dafür ist, wie oft der ESP32 Boot gegeben hat, um die Art und Weise des Aufwachens zu konfigurieren.

Schritt 14: Bibliothek erforderlich

Bibliothek erforderlich
Bibliothek erforderlich

Zur Steuerung des OLED-Displays benötigen wir eine externe Bibliothek. Dazu laden wir die U8g2-Bibliothek herunter.

Gehen Sie in der Arduino IDE zum Sketch-Menü >> Bibliothek einschließen >> Bibliotheken verwalten ….

Schritt 15: Bibliotheken und Variablen

Wir haben die Bibliothek zur Steuerung des OLED-Displays sowie einen Konstruktor der Display-Controller-Instanz eingebunden. Außerdem weisen wir die Variable im RTC-Speicher zu. Wir stellen die Empfindlichkeit für die Berührungsakzeptanz, den Mikrosekunden-Umrechnungsfaktor für Sekunden und die Zeit ein, in der der ESP32 in den Schlafmodus geht (in Sekunden).

#include //biblioteca para controle oled anzeigen

// Konstruktor da instancia do controlador do display //SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); //RTC_DATA_ATTR enthält verschiedene Speicher RTC RTC_DATA_ATTR int bootCount = 0; //sensibilidade para aceitação do toque #define Threshold 40 //fator de conversão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 //Tempo que o ESP32 ficará em modo sleep (em segundos) #define TIME_TO_SLEEP 3

Schritt 16: Einrichtung

Im Setup erhöhen wir die Anzahl der Bootvorgänge. Wir rufen die Funktion zum Drucken des Boot-Motivs auf. Wenn die Boot-Nummer PAR ist, stellen wir den ESP32 so ein, dass er über die (EXT0)-Taste aufwacht. Wenn es ein Vielfaches von 3 ist, stellen wir den ESP32 so ein, dass er nach einer festgelegten Zeit aufwacht. Ansonsten richten wir die kapazitiven Touch-Pins ein, um den ESP32 aufzuwecken. Schließlich stellen wir das Touchpad als Wakeup-Quelle ein und zwingen den ESP32 in den Schlafmodus.

Void setup () { Serial.begin (115200); Verzögerung (1000); //Incrementa oder numero de vezes que o BOOT ocorreu ++bootCount; configureDisplay(); //einen Função für Imprimir oder Motivo do BOOT print_wakeup_reason(); // se o numero de boot for PAR configuramos o ESP32 für despertar através do botão (EXT0) if (bootCount % 2 == 0) { esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = High, 0 = Low } //se for multiplo de 3 configuramos o ESP32 para despertar depois de um tempo definido else if(bootCount % 3 == 0) { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); aufrechtzuerhalten. aufrechtzuerhalten. //Touchpad als Wakeup-Quelle konfigurieren esp_sleep_enable_touchpad_wakeup(); } Serial.println ("entrando em modo sleep"); esp_deep_sleep_start(); // força oder ESP32 entrar em modo SLEEP }

Schritt 17: Loop, Callback & ConfigureDisplay

Im Loop haben wir nichts zu tun. Wir unterbrechen dann den Rückruf, wenn wir etwas zu tun haben, wenn die Unterbrechung auftritt. Bezüglich configureDisplay initialisieren wir das Display und konfigurieren einige Parameter. Wir drucken auf dem Bildschirm aus, wie oft der Bootvorgang aufgetreten ist.

//nada a se fazer no loopvoid loop() { } //callback das interrupções void callback(){ //caso queira fazer algo ao ocorrer a interrupção } void configureDisplay() { //inicializa o display und configura alguns parametros display. Start(); display.setPowerSave(0); // modo powerSave (0-Aus ? 1-Ein) display.setFont (u8x8_font_torussansbold8_u); //Font utilizada //imprime no display os numero de vezes que aconteceu o BOOT display.drawString(0, 0, "BOOT NUM:"); display.drawString(0, 2, String(bootCount).c_str()); display.drawString(0, 4, "MOTIVO:"); }

Schritt 18: Print_wakeup_reason (die Ursache des Erwachens kennen)

Hier haben wir die Funktion, die Ursache des ESP32-Aufwachens zu drucken. Überprüfen Sie den Pin und drucken Sie ihn auf dem Display aus.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () { esp_sleep_wakeup_cause_t wakeup_reason; Zeichenfolgegrund = ""; wakeup_reason = esp_sleep_get_wakeup_cause(); // recupera a causa do despertar switch (wakeup_reason) { Fall 1: Grund = "EXT0 RTC_IO BTN"; brechen; Fall 2: Grund = "EXT1 RTC_CNTL"; brechen; Fall 3: Grund = "TIMER"; brechen; Fall 4: Grund = "TOUCHPAD"; brechen; Fall 5: Grund = "ULP-PROGRAMM"; brechen; default:reason = "KEINE DS-URSACHE"; brechen; } Serial.println (Grund); display.clearLine(6); //apaga a linha 6 do display.drawString(0, 6, Reason.c_str()); //imprime a Cause do despertar no display //se despertou von TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) { print_wakeup_touchpad (); // verifica o pino e imprime keine Anzeige}}

Schritt 19: Print_wakeup_touchpad (kennen Sie den GPIO-Touch)

In diesem Schritt haben wir nun die Funktion, den berührten Pin zu drucken. Wir haben den GPIO, der den ESP32 geweckt hat, wiederhergestellt und auf dem Display ausgedruckt.

// Função para imprimir oder pino que foi tocadovoid print_wakeup_touchpad () { touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status(); //recupera o GPIO que despertou o ESP32 String GPIO = ""; Schalter (TouchPin) { Fall 0: GPIO = "4"; brechen; Fall 1: GPIO = "0"; brechen; Fall 2: GPIO = "2"; brechen; Fall 3: GPIO = "15"; brechen; Fall 4: GPIO = "13"; brechen; Fall 5: GPIO = "12"; brechen; Fall 6: GPIO = "14"; brechen; Fall 7: GPIO = "27"; brechen; Fall 8: GPIO = "33"; brechen; Fall 9: GPIO = "32"; brechen; Standard: Serial.println ("Aufwachen nicht per Touchpad"); brechen; } Serial.println("GPIO: "+GPIO); display.clearLine(7); //apaga a linha 7 do display.drawString(0, 7, "GPIO: "); display.drawString(6, 7, GPIO.c_str()); //imprime oder GPIO}

Schritt 20: Laden Sie die Dateien herunter

PDF

INO

Empfohlen: