Inhoudsopgave:

Levensduur van de batterij besparen met diepe slaap: 20 stappen
Levensduur van de batterij besparen met diepe slaap: 20 stappen

Video: Levensduur van de batterij besparen met diepe slaap: 20 stappen

Video: Levensduur van de batterij besparen met diepe slaap: 20 stappen
Video: Veerkracht aflevering 2: Diepe Hersenstimulatie 2024, November
Anonim
Image
Image
Manieren om de ESP32 te wekken
Manieren om de ESP32 te wekken

Bent u geïnteresseerd in het gebruik van een batterij met uw ESP32? Als dat zo is, zal ik vandaag enkele belangrijke technische informatie over dit onderwerp bespreken. We weten dat deze microcontroller veel energie verbruikt bij het verzenden van informatie. Het verbruikt bijna 190 milliampère. In deze video laat ik zien hoe je energie kunt besparen met de ESP32 met de zogenaamde "DEEP SLEEP"-functie. We zullen de chip instellen om naar deze modus te gaan, de manieren leren om deze modus te verlaten en een voorbeeld maken met drie verschillende manieren om de ESP32 te wekken.

Het is belangrijk om te onthouden dat de radio veel energie verbruikt, in plaats van de processor. Energiebesparing is erg belangrijk. Dit komt omdat eindpunten (de circuits die informatie verzenden) vaak op batterijen werken en tot vijf jaar mee moeten gaan. Sommige fabrikanten beloven een levensduur van maximaal tien jaar, en dit geldt voor batterijen van hoge kwaliteit die de eindpunten niet zo vaak gebruiken. In alle andere gevallen raad ik je aan om Deep Sleep te gebruiken om energie uit je circuit te besparen.

Stap 1: Inleiding

De ESP32 heeft een energiebesparende modus, genaamd "Deep Sleep". In deze modus zijn CPU's, de meeste RAM en alle digitaal geklokte randapparatuur uitgeschakeld. De enige onderdelen van de chip die nog aangesloten kunnen worden zijn de RTC-controller, RTC-randapparatuur (inclusief ULP-coprocessor) en RTC-geheugens.

We hebben verschillende manieren om de ESP32 wakker te maken als hij slaapt. Wekbronnen kunnen op elk moment worden ingesteld voordat u naar de diepe slaapmodus gaat.

Stap 2: Manieren om de ESP32 te wekken

Er zijn vijf manieren om ESP32 te wekken:

• Timer

• Externe activering (ext0)

• Externe wekfunctie (ext1)

• ULP-coprocessor-activering

• Touchpad

Stap 3: Timer

De RTC-controller heeft een ingebouwde timer die kan worden gebruikt om de chip na een vooraf gedefinieerde tijdsperiode te activeren. De tijd wordt gespecificeerd met een precisie van microseconden.

esp_deep_sleep_enable_timer_wakeup(uint64_t time_in_us)

time_in_us> is de tijd in microseconden

Stap 4: Externe activering (ext0)

De RTC IO-module bevat logica om het alarm te activeren wanneer een van de RTC GPIO's een vooraf gedefinieerd logisch niveau binnengaat. De RTC IO maakt deel uit van het vermogensdomein van de RTC-randapparatuur, dus de RTC-randapparatuur wordt tijdens Deep Sleep in leven gehouden als deze activeringsbron wordt gevraagd.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int-niveau)

gpio_num> GPIO-nummer gebruikt als activeringsbron. Alleen RTC-functionele GPIO's kunnen worden gebruikt: 0, 2, 4, 12-15, 25-27, 32-39.

niveau> ingangsniveau dat het alarm activeert (0 = LAAG, 1 = HOOG)

Stap 5: Externe activering (ext1)

De RTC-controller bevat logica om de wekker te activeren met behulp van meerdere RTC GPIO's.

esp_deep_sleep_enable_ext1_wakeup (uint64_t masker, esp_ext1_wakeup_mode_t modus)

mask> bit mask van GPIO-nummers die activering veroorzaken. Alleen RTC-compatibele GPIO's kunnen in deze bitmap worden gebruikt: 0, 2, 4, 12-15, 25-27, 32-39.

mode> selecteer de logische functie die wordt gebruikt om de activeringsvoorwaarde te bepalen:

• ESP_EXT1_WAKEUP_ALL_LOW: ontwaakt wanneer alle geselecteerde GPIO's op LAAG staan

• ESP_EXT1_WAKEUP_ANY_HIGH: ontwaakt wanneer een van de geselecteerde GPIO's HOOG is

Stap 6: ULP Coprocessor Wakeup

De ULP-coprocessor kan werken terwijl de chip zich in Deep Sleep bevindt en kan worden gebruikt om sensoren te zoeken, ADC- of capacitieve aanraaksensorwaarden te bewaken en de chip te activeren wanneer een specifieke gebeurtenis wordt gedetecteerd.

De ULP-coprocessor maakt deel uit van het vermogensdomein van de RTC-randapparatuur en voert het programma uit dat is opgeslagen in het trage geheugen RTC. Daarom worden RTC-randapparatuur en langzaam RTC-geheugen geactiveerd tijdens Deep Sleep als deze activeringsmodus wordt gevraagd.

Stap 7: Touchpad

De RTC-controller bevat logica om het alarm te activeren met behulp van de capacitieve aanraaksensoren. De definitie van de aanraakpin is echter anders. We moeten de touch-interrupt gebruiken voor elk van de gewenste pinnen.

Na het instellen van de interrupts hebben we de wekmodus ingeschakeld om de sensoren te gebruiken.

// Configureer Touchpad als ontwaakbron esp_sleep_enable_touchpad_wakeup ();

Stap 8: In de diepe slaapmodus gaan

Na het instellen van een wekmodus is een enkele opdracht om de ESP32 in de diepe slaapmodus te zetten (2,5 μA of minder) voldoende. Ik benadruk hier dat deze uitgave afkomstig is van de ESP-chip en niet van de plaat, omdat deze meer uitgeeft.

esp_deep_sleep_start();

Vanuit dit commando valt de ESP32 in slaap en voert bijvoorbeeld de volgende coderegels niet uit.

Belangrijk: Alle wake-up-instellingen moeten worden gemaakt voordat de bovenstaande opdracht wordt uitgevoerd.

Stap 9: Hier is wat meer belangrijke informatie

Hier is wat meer belangrijke informatie
Hier is wat meer belangrijke informatie

De onderstaande oproep retourneert de oorzaak van ESP32-activering.

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

esp_sleep_get_wakeup_cause();

Als we de activering door het touchpad instellen, kunnen we via de opdracht herstellen welke GPIO de aanraking heeft plaatsgevonden

esp_sleep_get_touchpad_wakeup_status();

Elke keer dat de ESP32 ontwaakt, doorloopt hij de instellingen opnieuw. Alle variabelen die niet in het RTC-geheugen zijn gedefinieerd, keren dus terug naar hun thuisstatus.

Gebruik de variabeledeclaratie in het onderstaande voorbeeld om de variabelen in het geheugen te bewaren, zelfs nadat u in slaap bent gevallen:

//RTC_DATA_ATTR heeft verschillende herinneringen aan RTCRTC_DATA_ATTR int bootCount = 0;

Stap 10: Demonstratie

Demonstratie
Demonstratie

De video toont het programma werkend, in overeenstemming met de afbeelding.

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

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Stap 12: Montage

samenkomst
samenkomst

Stap 13: Programmeren

We gaan nu een programma maken waarin we de ESP32 configureren om naar de diepe slaapmodus te gaan. Dit wordt op drie verschillende manieren gewekt: een voor extern wekken (ext0), een voor timer en een voor touchpad. Ze kunnen niet samenwerken, dus we zullen een variabele gebruiken die een teller zal zijn voor het aantal keren dat de ESP32 Boot heeft gegeven om de manier te configureren om wakker te worden.

Stap 14: Bibliotheek vereist

Bibliotheek vereist
Bibliotheek vereist

Om het OLED-scherm te bedienen, hebben we een externe bibliotheek nodig. Hiervoor downloaden we de U8g2-bibliotheek.

Ga in de Arduino IDE naar het Sketch-menu >> Bibliotheek opnemen >> Bibliotheken beheren ….

Stap 15: Bibliotheken en variabelen

We hebben de bibliotheek toegevoegd om het OLED-scherm te besturen, evenals een constructor van de weergavecontroller-instantie. We wijzen de variabele ook toe aan het RTC-geheugen. We hebben de gevoeligheid ingesteld voor aanraakacceptatie, de microseconde conversiefactor voor seconden en de tijd dat de ESP32 naar de slaapstand gaat (in seconden).

#include //biblioteca para controle do display oled

// constructor 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 heeft een verscheidenheid aan herinneringen RTC RTC_DATA_ATTR int bootCount = 0; //gevoel voor 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

Stap 16: Instellen

In Setup verhogen we het aantal keren dat Boot heeft plaatsgevonden. We noemen de functie om het Boot-motief af te drukken. Als het Boot-nummer PAR is, stellen we de ESP32 in om wakker te worden via de (EXT0)-knop. Als het een veelvoud van 3 is, stellen we de ESP32 in om na een ingestelde tijd wakker te worden. Anders hebben we de capacitieve aanraakpinnen ingesteld om de ESP32 te wekken. Ten slotte stellen we het Touchpad in als de wekbron en dwingen we de ESP32 om naar de slaapmodus te gaan.

void setup() { Serial.begin(115200); vertraging (1000); //incrementa o numero de vezes o BOOT ocorreu ++bootCount; configureDisplay(); //chama a função para imprimir of motivo do BOOT print_wakeup_reason(); // Se o numero de boot voor PAR-configuraties o ESP32 voor despertar através do botão (EXT0) if (bootCount % 2 == 0) { esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); //1 = Hoog, 0 = Laag} // se voor multiplo de 3 configuraties 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); } //caso contrario configuraties voor touch capacitivo para despertar o ESP32 else { // Setup-onderbreking op Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Configureer Touchpad als ontwaakbron esp_sleep_enable_touchpad_wakeup (); } Serial.println ("entrando em modo sleep"); esp_deep_sleep_start(); //força o ESP32 entrar em modo SLEEP }

Stap 17: Loop, terugbellen en configurerenDisplay

In de Loop hebben we niets te doen. We gaan dan over tot het onderbreken van terugbellen als we iets te doen hebben wanneer de onderbreking optreedt. Met betrekking tot configureDisplay initialiseren we het display en configureren we enkele parameters. We printen op het scherm het aantal keren dat het opstarten plaatsvond.

//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 en configuratie alguns parametros display. beginnen(); display.setPowerSave(0); //modo powerSave (0-uit ? 1-aan) display.setFont(u8x8_font_torussansbold8_u); //fonte 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:"); }

Stap 18: Print_wakeup_reason (de oorzaak van het ontwaken kennen)

Hier hebben we de functie om de oorzaak van het wakker worden van de ESP32 af te drukken. Controleer de pin en print op het display.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason(){ esp_sleep_wakeup_cause_t wakeup_reason; String reden = ""; wakeup_reason = esp_sleep_get_wakeup_cause(); // recupera a causa do despertar switch (wakeup_reason) { case 1: reden = "EXT0 RTC_IO BTN"; pauze; geval 2: reden = "EXT1 RTC_CNTL"; pauze; geval 3: reden = "TIMER"; pauze; geval 4: reden = "TOUCHPAD"; pauze; geval 5: reden = "ULP-PROGRAMMA"; pauze; standaard:reason = "GEEN DS OORZAAK"; pauze; } Serial.println(reden); display.clearLine(6); //apaga a linha 6 display.drawString(0, 6, reason.c_str()); //Imprime a causa do despertar no display //se despertou por TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) { print_wakeup_touchpad (); // verifica o pino e imprime geen weergave } }

Stap 19: Print_wakeup_touchpad (ken de GPIO Touch)

Nu, in deze stap, hebben we de functie om de pin af te drukken die is aangeraakt. We hebben de GPIO teruggevonden die de ESP32 heeft gewekt en op het scherm afgedrukt.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () { touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status(); // recupera of GPIO que despertou of ESP32 String GPIO = ""; schakelaar (touchPin) {geval 0: GPIO = "4"; pauze; geval 1: GPIO = "0"; pauze; geval 2: GPIO = "2"; pauze; geval 3: GPIO = "15"; pauze; geval 4: GPIO = "13"; pauze; geval 5: GPIO = "12"; pauze; geval 6: GPIO = "14"; pauze; geval 7: GPIO = "27"; pauze; geval 8: GPIO = "33"; pauze; geval 9: GPIO = "32"; pauze; standaard: Serial.println ("Wakeup niet door touchpad"); pauze; } Serial.println("GPIO: "+GPIO); display.clearLine(7);//apaga a linha 7 display.drawString(0, 7, "GPIO: "); display.drawString(6, 7, GPIO.c_str()); //imprimeren of GPIO}

Stap 20: Download de bestanden

PDF

INO

Aanbevolen: