Indholdsfortegnelse:

Sparer batterilevetid med dyb søvn: 20 trin
Sparer batterilevetid med dyb søvn: 20 trin

Video: Sparer batterilevetid med dyb søvn: 20 trin

Video: Sparer batterilevetid med dyb søvn: 20 trin
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, November
Anonim
Image
Image
Måder at vække ESP32
Måder at vække ESP32

Er du interesseret i at bruge et batteri til din ESP32? I så fald vil jeg i dag diskutere nogle vigtige tekniske oplysninger om dette emne. Vi ved, at denne mikrokontroller bruger meget energi, når den sender information. Det forbruger tæt på 190 milliampere. I denne video viser jeg, hvordan du sparer energi fra ESP32 med den såkaldte "DEEP SLEEP" -funktion. Vi sætter chippen til at gå ind i denne tilstand, lærer måder at afslutte denne tilstand på og opretter et eksempel, der viser tre forskellige måder at vække ESP32.

Det er vigtigt at huske, at radioen bruger meget energi, frem for processoren. Energibesparelse er meget vigtig. Dette skyldes, at slutpunkter (de kredsløb, der sender oplysninger) ofte er batteridrevne og skal vare op til fem år. Der er nogle producenter, der lover op til ti års varighed, og dette gælder for batterier af høj kvalitet, der ikke bruger slutpunkterne så meget. I alle andre tilfælde anbefaler jeg dig at bruge Deep Sleep til at spare energi fra dit kredsløb.

Trin 1: Introduktion

ESP32 har en strømbesparende tilstand, kaldet "Deep Sleep". I denne tilstand er CPU'er, de fleste RAM og alle digitalurede eksterne enheder slukket. De eneste dele af chippen, der stadig kan tilsluttes, er RTC -controlleren, RTC -periferiudstyr (inklusive ULP -coprocessor) og RTC -hukommelser.

Vi har flere måder at vække ESP32, når du sover. Vågnekilder kan til enhver tid konfigureres, før du går i dyb dvaletilstand.

Trin 2: Måder at vække ESP32

Der er fem måder at vække ESP32 på:

• Timer

• Ekstern opvågning (ext0)

• Ekstern vækning (ext1)

• ULP coprocessor wakeup

• Touchpad

Trin 3: Timer

RTC-controlleren har en indbygget timer, der kan bruges til at aktivere chippen efter en foruddefineret periode. Tiden er specificeret med mikrosekundpræcision.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> er tiden i mikrosekunder

Trin 4: Ekstern opvågning (ext0)

RTC IO -modulet indeholder logik til at udløse alarmen, når en af RTC GPIO'erne indtaster et foruddefineret logisk niveau. RTC IO er en del af RTC -periferienheders strømdomæne, så RTC -periferiudstyret holdes i live under dyb søvn, hvis der anmodes om denne aktiveringskilde.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int niveau)

gpio_num> GPIO -nummer, der bruges som aktiveringskilde. Kun RTC-funktionelle GPIO'er kan bruges: 0, 2, 4, 12-15, 25-27, 32-39.

niveau> inputniveau, der udløser alarmen (0 = LOW, 1 = HIGH)

Trin 5: Ekstern opvågning (ext1)

RTC -controlleren indeholder logik til at udløse vækkeuret ved hjælp af flere RTC GPIO'er.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask, esp_ext1_wakeup_mode_t mode)

maske> bitmaske af GPIO -numre, der forårsager aktivering. Kun RTC-aktiverede GPIO'er kan bruges i denne bitmap: 0, 2, 4, 12-15, 25-27, 32-39.

mode> vælg den logiske funktion, der bruges til at bestemme aktiveringsbetingelsen:

• ESP_EXT1_WAKEUP_ALL_LOW: vågner, når alle valgte GPIO'er er i LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: vågner, når nogen af de valgte GPIO'er er HIGH

Trin 6: ULP Coprocessor Wakeup

ULP -coprocessoren kan fungere, mens chippen er i dyb søvn, og kan bruges til at søge efter sensorer, overvåge ADC- eller kapacitive berøringssensorværdier og aktivere chippen, når en bestemt hændelse detekteres.

ULP -coprocessoren er en del af effektdomænet for RTC -periferienhederne og kører programmet, der er gemt i RTC med langsom hukommelse. Derfor aktiveres RTC -periferiudstyr og RTC langsom hukommelse under dyb søvn, hvis der ønskes denne aktiveringstilstand.

Trin 7: Touchpad

RTC -controlleren indeholder logik til at udløse alarmen ved hjælp af de kapacitive berøringssensorer. Definitionen af berøringsnålen er imidlertid en anden. Vi skal bruge berøringsafbrydelsen for hver af de ønskede stifter.

Efter indstilling af afbrydelser aktiverede vi vågningstilstanden til at bruge sensorerne.

// Konfigurer Touchpad som wakeup source esp_sleep_enable_touchpad_wakeup ();

Trin 8: Gå ind i dyb dvaletilstand

Efter indstilling af en vækningstilstand er en enkelt kommando for at sætte ESP32 i dyb dvaletilstand (bruger 2,5 μA eller mindre) nok. Jeg understreger her, at denne udgift er fra ESP -chippen og ikke pladen, da sidstnævnte bruger mere.

esp_deep_sleep_start ();

Fra denne kommando falder ESP32 i søvn og eksekverer f.eks. Ikke de næste kodelinjer.

Vigtigt: Alle vækkeindstillinger skal foretages, før ovenstående kommando udføres.

Trin 9: Her er nogle mere vigtige oplysninger

Her er nogle mere vigtige oplysninger
Her er nogle mere vigtige oplysninger

Opkaldet nedenfor returnerer årsagen til ESP32 -vågning.

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

esp_sleep_get_wakeup_cause ();

Hvis vi indstiller vækkelsen ved berøringspladen, kan vi gendanne den GPIO, som berøringen fandt sted via kommandoen

esp_sleep_get_touchpad_wakeup_status ();

Hver gang ESP32 vågner, vil den gennemgå opsætningen igen. Således vender alle variabler, der ikke er defineret i RTC -hukommelsen, tilbage til deres hjemlige tilstand.

For at beholde variablerne i hukommelsen, selv efter du er faldet i søvn, skal du bruge variabeldeklarationen i eksemplet herunder:

// RTC_DATA_ATTR aloca a variável on memória RTCRTC_DATA_ATTR int bootCount = 0;

Trin 10: Demonstration

Demonstration
Demonstration

Videoen viser programmet, der fungerer i overensstemmelse med billedet.

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

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

Trin 12: Montering

montage
montage

Trin 13: Program

Vi laver nu et program, hvor vi konfigurerer ESP32 til at gå i dyb dvaletilstand. Dette vil blive vækket på tre forskellige måder: en til ekstern wakeup (ext0), en til Timer og en til Touchpad. De kan ikke fungere sammen, så vi vil bruge en variabel, der vil være en tæller for det antal gange, ESP32 gav Boot til at konfigurere måden at vågne op på.

Trin 14: Bibliotek påkrævet

Bibliotek påkrævet
Bibliotek påkrævet

For at styre OLED -displayet har vi brug for et eksternt bibliotek. Til dette vil vi downloade U8g2 -biblioteket.

I Arduino IDE skal du gå til Skitsemenuen >> Inkluder bibliotek >> Administrer biblioteker….

Trin 15: Biblioteker og variabler

Vi har inkluderet biblioteket for at styre OLED -displayet, såvel som en konstruktør af displaykontrolinstansen. Vi tildeler også variablen i RTC -hukommelsen. Vi indstiller følsomheden for berøringsaccept, mikrosekundkonverteringsfaktoren i sekunder og den tid, ESP32 går i dvaletilstand (i sekunder).

#include // biblioteca para control do display oled

// konstruktør for instans til visning // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria 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

Trin 16: Opsætning

I Setup øger vi antallet af gange Boot opstod. Vi kalder funktionen for at udskrive Boot -motivet. Hvis Boot -nummeret er PAR, indstiller vi ESP32 til at vågne via knappen (EXT0). Hvis det er et multiplum af 3, indstiller vi ESP32 til at vågne op efter en bestemt tid. Ellers konfigurerer vi de kapacitive berøringsnåle til at vække ESP32. Endelig indstiller vi Touchpad som vækkekilde og tvinger ESP32 til at gå i dvaletilstand.

ugyldig opsætning () {Serial.begin (115200); forsinkelse (1000); // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // se o numero de boot for PAR configuramos o ESP32 para despertar através do botão (EXT0) if (bootCount % 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Høj, 0 = Lav} // se til multiplo de 3 konfigurationer 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 configuramos os pinos de touch capacitivo para despertar o ESP32 else {// Setup interrupt on Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Konfigurer Touchpad som wakeup source esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep”); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Trin 17: Loop, Callback & ConfigureDisplay

I Loop har vi intet at gøre. Vi fortsætter derefter med at afbryde tilbagekald, hvis vi har noget at gøre, når afbrydelsen sker. Med hensyn til configureDisplay initialiserer vi displayet og konfigurerer nogle parametre. Vi udskriver på skærmen det antal gange Boot opstod.

// 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 and configura alguns parametros display. begynde(); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) 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:"); }

Trin 18: Print_wakeup_reason (kender årsagen til opvågnen)

Her har vi funktionen til at udskrive årsagen til, at ESP32 vågner. Kontroller nålen, og udskriv på displayet.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; Stringårsag = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; pause; case 2: reason = "EXT1 RTC_CNTL"; pause; case 3: reason = "TIMER"; pause; case 4: reason = "TOUCHPAD"; pause; case 5: reason = "ULP PROGRAM"; pause; default: reason = "INGEN DS ÅRSAG"; pause; } Serial.println (grund); display.clearLine (6); // apaga a linha 6 do display 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 no display}}

Trin 19: Print_wakeup_touchpad (kend GPIO Touch)

Nu, i dette trin, har vi funktionen til at udskrive den nål, der blev rørt. Vi genoprettede GPIO'en, der vækkede ESP32 og udskrev den på displayet.

// função para imprimir o 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 = ""; switch (touchPin) {case 0: GPIO = "4"; pause; sag 1: GPIO = "0"; pause; sag 2: GPIO = "2"; pause; sag 3: GPIO = "15"; pause; sag 4: GPIO = "13"; pause; sag 5: GPIO = "12"; pause; sag 6: GPIO = "14"; pause; sag 7: GPIO = "27"; pause; sag 8: GPIO = "33"; pause; sag 9: GPIO = "32"; pause; standard: Serial.println ("Wakeup not by touchpad"); pause; } Serial.println ("GPIO:"+GPIO); display.clearLine (7); // apaga a linha 7 do display display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Trin 20: Download filerne

PDF

INO

Anbefalede: