Innholdsfortegnelse:

Sparer batterilevetid med dyp søvn: 20 trinn
Sparer batterilevetid med dyp søvn: 20 trinn

Video: Sparer batterilevetid med dyp søvn: 20 trinn

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

Er du interessert i å bruke et batteri med ESP32? I så fall vil jeg i dag diskutere noen viktig teknisk informasjon om dette emnet. Vi vet at denne mikrokontrolleren bruker mye energi når den overfører informasjon. Den bruker nesten 190 milliampere. I denne videoen viser jeg hvordan du sparer energi fra ESP32 med den såkalte "DEEP SLEEP" -funksjonen. Vi setter brikken til å gå inn i denne modusen, lærer hvordan du går ut av denne modusen, og lager et eksempel som viser tre forskjellige måter å vekke ESP32.

Det er viktig å huske at radioen bruker mye energi, i stedet for prosessoren. Energisparing er veldig viktig. Dette er fordi endepunkter (kretsene som sender informasjon) ofte er batteridrevne og skal vare opptil fem år. Det er noen produsenter som lover opptil ti år, og dette gjelder for batterier av høy kvalitet som ikke bruker endepunktene så mye. I alle andre tilfeller anbefaler jeg deg å bruke Deep Sleep for å spare energi fra kretsen din.

Trinn 1: Introduksjon

ESP32 har en strømsparingsmodus, kalt "Dyp søvn". I denne modusen er CPUer, mest RAM og alle digitale klokkeutstyr slått av. De eneste delene av brikken som fremdeles kan kobles til er RTC -kontrolleren, RTC -eksterne enheter (inkludert ULP -coprocessor) og RTC -minner.

Vi har flere måter å vekke ESP32 når du sover. Vekkingskilder kan settes opp når som helst før du går inn i dvalemodus.

Trinn 2: Måter å vekke ESP32

Det er fem måter å vekke ESP32:

• Timer

• Ekstern vekking (ext0)

• Ekstern vekking (ext1)

• ULP coprocessor wakeup

• Berøringsplate

Trinn 3: Timer

RTC-kontrolleren har en innebygd timer som kan brukes til å aktivere brikken etter en forhåndsdefinert periode. Tiden er spesifisert med mikrosekund presisjon.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> er tiden i mikrosekunder

Trinn 4: Ekstern oppvåkning (ext0)

RTC IO -modulen inneholder logikk for å utløse alarmen når en av RTC GPIO -ene går inn på et forhåndsdefinert logisk nivå. RTC IO er en del av strømområdet til RTC -periferienhetene, så RTC -eksterne enheter vil bli holdt i live under dyp søvn hvis denne kilden til aktivering blir forespurt.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int nivå)

gpio_num> GPIO -nummer som brukes som aktiveringskilde. Bare RTC-funksjonelle GPIOer kan brukes: 0, 2, 4, 12-15, 25-27, 32-39.

nivå> inngangsnivå som vil utløse alarmen (0 = LAV, 1 = HØY)

Trinn 5: Ekstern oppvåkning (ext1)

RTC -kontrolleren inneholder logikk for å utløse vekkerklokken ved bruk av flere RTC GPIOer.

esp_deep_sleep_enable_ext1_wakeup (uint64_t maske, esp_ext1_wakeup_mode_t modus)

maske> bitmaske med GPIO -tall som vil forårsake aktivering. Bare RTC-aktiverte GPIO-er kan brukes i dette bitmapet: 0, 2, 4, 12-15, 25-27, 32-39.

modus> velg logikkfunksjonen som brukes for å bestemme aktiveringsbetingelsen:

• ESP_EXT1_WAKEUP_ALL_LOW: våkner når alle valgte GPIO -er er LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: vekker når noen av de valgte GPIO -ene er HIGH

Trinn 6: ULP Coprocessor Wakeup

ULP -prosessoren kan fungere mens brikken er i dyp søvn, og kan brukes til å søke etter sensorer, overvåke ADC- eller kapasitive berøringssensorverdier og aktivere brikken når en bestemt hendelse oppdages.

ULP -coprocessoren er en del av kraftdomenet til RTC -periferienhetene og kjører programmet som er lagret i RTC i sakte minne. Derfor vil RTC -periferiutstyr og RTC -tregt minne bli aktivert under dyp søvn hvis denne aktiveringsmodus er forespurt.

Trinn 7: Pekeplate

RTC -kontrolleren inneholder logikk for å utløse alarmen ved hjelp av de kapasitive berøringssensorene. Definisjonen på berøringsnålen er imidlertid en annen. Vi må bruke berøringsavbruddet for hver av de ønskede pinnene.

Etter å ha angitt avbruddene, aktiverte vi vekking-modus for å bruke sensorene.

// Konfigurer styreflaten som vekkingskilde esp_sleep_enable_touchpad_wakeup ();

Trinn 8: Gå inn i dyp dvalemodus

Etter at du har valgt en oppvåkningsmodus, er det nok med en enkelt kommando for å sette ESP32 i dvalemodus (bruker 2,5 μA eller mindre). Jeg understreker her at denne utgiften er fra ESP -brikken og ikke platen, da sistnevnte bruker mer.

esp_deep_sleep_start ();

Fra denne kommandoen sovner ESP32 og kjører for eksempel ikke de neste kodelinjene.

Viktig: Alle vekkeinnstillinger må gjøres før du utfører kommandoen ovenfor.

Trinn 9: Her er mer viktig informasjon

Her er litt mer viktig informasjon
Her er litt mer viktig informasjon

Samtalen nedenfor returnerer årsaken til ESP32 -vekking.

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

esp_sleep_get_wakeup_cause ();

Hvis vi setter vekkeren med styreplaten, kan vi gjenopprette hvilken GPIO som berøringen skjedde gjennom kommandoen

esp_sleep_get_touchpad_wakeup_status ();

Hver gang ESP32 våkner, vil den gå gjennom oppsettet igjen. Dermed vil alle variabler som ikke er definert i RTC -minnet, gå tilbake til hjemstaten.

For å beholde variablene i minnet selv etter å ha sovnet, bruk variabeldeklarasjonen i eksemplet nedenfor:

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

Trinn 10: Demonstrasjon

Demonstrasjon
Demonstrasjon

Videoen viser programmet som fungerer, i samsvar med bildet.

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

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

Trinn 12: Montering

montering
montering

Trinn 13: Program

Vi lager nå et program der vi konfigurerer ESP32 til å gå i dyp dvalemodus. Dette vil bli vekket på tre forskjellige måter: en for ekstern vekking (ext0), en for Timer og en for Touchpad. De kan ikke fungere sammen, så vi bruker en variabel som vil være en teller for antall ganger ESP32 ga Boot for å konfigurere måten å våkne på.

Trinn 14: Bibliotek påkrevd

Bibliotek påkrevd
Bibliotek påkrevd

For å kontrollere OLED -skjermen trenger vi et eksternt bibliotek. For dette vil vi laste ned U8g2 -biblioteket.

I Arduino IDE, gå til Sketch -menyen >> Inkluder bibliotek >> Administrer biblioteker….

Trinn 15: Biblioteker og variabler

Vi har inkludert biblioteket for å kontrollere OLED -skjermen, samt en konstruktør av skjermkontrollinstansen. Vi tildeler også variabelen i RTC -minnet. Vi angir følsomheten for berøringsaksept, mikrosekundkonverteringsfaktoren i sekunder og tiden ESP32 går i hvilemodus (i sekunder).

#include // biblioteca para control do display oled

// kontrollø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

Trinn 16: Oppsett

I Setup øker vi antall ganger Boot oppstod. Vi kaller funksjonen for å skrive ut Boot -motivet. Hvis oppstartsnummeret er PAR, setter vi ESP32 til å våkne via (EXT0) -knappen. Hvis det er et multiplum av 3, setter vi ESP32 til å våkne etter en bestemt tid. Ellers setter vi opp de kapasitive berøringspinnene for å vekke ESP32. Til slutt setter vi styreplaten som vekkingskilde og tvinger ESP32 til å gå i hvilemodus.

ugyldig oppsett () {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øy, 0 = Lav} // se for multiplo de 3 konfiguramos 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 styreflaten som vekkingskilde esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep”); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Trinn 17: Loop, Callback & ConfigureDisplay

I Loop har vi ingenting å gjøre. Vi fortsetter deretter å avbryte tilbakeringing hvis vi har noe å gjøre når avbruddet oppstår. Når det gjelder configureDisplay, initialiserer vi displayet og konfigurerer noen parametere. Vi skriver ut på skjermen hvor mange ganger oppstarten skjedde.

// 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. begynne(); 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:"); }

Trinn 18: Print_wakeup_reason (å vite årsaken til oppvåkningen)

Her har vi funksjonen til å skrive ut årsaken til at ESP32 våkner. Kontroller pinnen og skriv ut på displayet.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; String reason = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; gå i stykker; case 2: reason = "EXT1 RTC_CNTL"; gå i stykker; case 3: reason = "TIMER"; gå i stykker; sak 4: reason = "TOUCHPAD"; gå i stykker; sak 5: reason = "ULP PROGRAM"; gå i stykker; default: reason = "NO DS CAUSE"; gå i stykker; } Serial.println (grunn); 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}}

Trinn 19: Print_wakeup_touchpad (kjenn GPIO Touch)

Nå, i dette trinnet, har vi funksjonen til å skrive ut pinnen som ble berørt. Vi gjenopprettet GPIO som vekket ESP32 og skrev den ut på skjermen.

// 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"; gå i stykker; sak 1: GPIO = "0"; gå i stykker; sak 2: GPIO = "2"; gå i stykker; sak 3: GPIO = "15"; gå i stykker; sak 4: GPIO = "13"; gå i stykker; sak 5: GPIO = "12"; gå i stykker; sak 6: GPIO = "14"; gå i stykker; sak 7: GPIO = "27"; gå i stykker; sak 8: GPIO = "33"; gå i stykker; sak 9: GPIO = "32"; gå i stykker; standard: Serial.println ("Wakeup not by touchpad"); gå i stykker; } 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}

Trinn 20: Last ned filene

PDF

INO

Anbefalt: