Turinys:

Akumuliatoriaus naudojimo laiko taupymas giliai miegant: 20 žingsnių
Akumuliatoriaus naudojimo laiko taupymas giliai miegant: 20 žingsnių

Video: Akumuliatoriaus naudojimo laiko taupymas giliai miegant: 20 žingsnių

Video: Akumuliatoriaus naudojimo laiko taupymas giliai miegant: 20 žingsnių
Video: Mano darbas – stebėti mišką ir čia vyksta kažkas keisto. 2024, Lapkritis
Anonim
Image
Image
ESP32 pažadinimo būdai
ESP32 pažadinimo būdai

Ar jus domina baterijos naudojimas su ESP32? Jei taip, šiandien aptarsiu svarbią techninę informaciją šia tema. Mes žinome, kad šis mikrovaldiklis praleidžia daug energijos, kai perduoda informaciją. Jis sunaudoja beveik 190 miliamperių. Šiame vaizdo įraše parodysiu, kaip taupyti energiją iš ESP32 naudojant vadinamąją „DEEP SLEEP“funkciją. Mes nustatysime lustą įjungti šį režimą, sužinosime, kaip išeiti iš šio režimo, ir sukursime pavyzdį, parodantį tris skirtingus būdus pažadinti ESP32.

Svarbu prisiminti, kad radijas išleidžia daug energijos, o ne procesorius. Energijos taupymas yra labai svarbus. Taip yra todėl, kad galiniai taškai (grandinės, siunčiančios informaciją) dažnai maitinami baterijomis ir turėtų trukti iki penkerių metų. Kai kurie gamintojai žada, kad jie truks iki dešimties metų, ir tai taikoma aukštos kokybės baterijoms, kurios nenaudoja galutinių taškų. Visais kitais atvejais patariu naudoti „Deep Sleep“, kad sutaupytumėte energijos iš grandinės.

1 žingsnis: Įvadas

ESP32 turi energijos taupymo režimą, vadinamą „Giliu miegu“. Šiuo režimu procesoriai, dauguma RAM ir visi skaitmeniniai laikrodžiai yra išjungti. Vienintelės lusto dalys, kurias vis dar galima prijungti, yra RTC valdiklis, RTC išoriniai įrenginiai (įskaitant ULP koprocesorių) ir RTC atmintis.

Turime kelis būdus, kaip pažadinti ESP32 miegant. Pažadinimo šaltinius galima nustatyti bet kuriuo metu prieš įjungiant gilaus miego režimą.

2 žingsnis: ESP32 pažadinimo būdai

Yra penki būdai pažadinti ESP32:

• Laikmatis

• Išorinis pažadinimas (ext0)

• Išorinis pažadinimas (ext1)

• ULP koprocesoriaus pažadinimas

• Jutiklinė dalis

3 žingsnis: laikmatis

RTC valdiklis turi įmontuotą laikmatį, kuris gali būti naudojamas aktyvuoti lustą po iš anksto nustatyto laiko. Laikas nurodomas mikrosekundės tikslumu.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> yra laikas mikrosekundėmis

4 veiksmas: išorinis pažadinimas (ext0)

RTC IO modulyje yra logika, kuri suaktyvina aliarmą, kai vienas iš RTC GPIO pereina į iš anksto nustatytą logikos lygį. RTC IO yra RTC periferinių įrenginių galios srities dalis, todėl RTC periferiniai įrenginiai bus palaikomi gyvi, kai reikalaujama šio aktyvinimo šaltinio.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int lygis)

gpio_num> GPIO numeris, naudojamas kaip aktyvinimo šaltinis. Galima naudoti tik RTC funkcinius GPIO: 0, 2, 4, 12-15, 25-27, 32-39.

lygis> įvesties lygis, kuris suaktyvins aliarmą (0 = LOW, 1 = HIGH)

5 veiksmas: išorinis pažadinimas (ext1)

RTC valdiklyje yra logika žadintuvui suaktyvinti naudojant kelis RTC GPIO.

esp_deep_sleep_enable_ext1_wakeup (uint64_t kaukė, esp_ext1_wakeup_mode_t režimas)

kaukė> GPIO numerių bitų kaukė, kuri suaktyvins. Šiame bitų žemėlapyje galima naudoti tik RTC palaikančius GPIO: 0, 2, 4, 12-15, 25-27, 32-39.

režimas> pasirinkite loginę funkciją, naudojamą aktyvavimo sąlygai nustatyti:

• ESP_EXT1_WAKEUP_ALL_LOW: atsibunda, kai visi pasirinkti GPIO yra žemi

• ESP_EXT1_WAKEUP_ANY_HIGH: pabunda, kai kuris nors iš pasirinktų GPIO yra AUKŠTAS

6 veiksmas: ULP koprocesoriaus pažadinimas

ULP koprocesorius gali veikti, kai lustas yra gilaus miego režimu, ir gali būti naudojamas jutikliams ieškoti, ADC arba talpinių jutiklių jutiklių vertėms stebėti ir suaktyvinti lustą, kai aptinkamas konkretus įvykis.

ULP koprocesorius yra RTC periferinių įrenginių galios srities dalis ir paleidžia programą, saugomą lėtos atminties RTC. Todėl RTC periferiniai įrenginiai ir lėta RTC atmintis bus suaktyvinti gilaus miego metu, jei prašoma šio aktyvinimo režimo.

7 žingsnis: jutiklinė planšetė

RTC valdiklyje yra logika, kuri suaktyvina aliarmą naudojant talpinius jutiklinius jutiklius. Tačiau jutiklinio kaiščio apibrėžimas skiriasi. Turime naudoti jutiklinį pertraukimą kiekvienam norimam kaiščiui.

Nustatę pertraukas, įgalinome žadinimo režimą, kad galėtume naudoti jutiklius.

// Jutiklinės dalies konfigūravimas kaip pažadinimo šaltinis esp_sleep_enable_touchpad_wakeup ();

8 žingsnis: Įėjimas į gilaus miego režimą

Nustačius žadinimo režimą, pakanka vienos komandos įjungti ESP32 į gilaus miego režimą (išleidžiant 2,5 μA ar mažiau). Čia pabrėžiu, kad šios išlaidos yra iš ESP lusto, o ne plokštelės, nes pastaroji išleidžia daugiau.

esp_deep_sleep_start ();

Iš šios komandos ESP32 užmiega ir, pavyzdžiui, nevykdo kitų kodo eilučių.

Svarbu: prieš vykdant aukščiau nurodytą komandą reikia atlikti visus pažadinimo nustatymus.

9 žingsnis: čia yra dar viena svarbi informacija

Čia yra dar viena svarbi informacija
Čia yra dar viena svarbi informacija

Žemiau pateiktas skambutis grąžina ESP32 pažadinimo priežastį.

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

esp_sleep_get_wakeup_cause ();

Jei nustatysime pažadinimą jutikliniu kilimėliu, per komandą galime atkurti, kuris GPIO palietė

esp_sleep_get_touchpad_wakeup_status ();

Kiekvieną kartą, kai ESP32 atsibunda, jis vėl atliks sąranką. Taigi visi kintamieji, kurie nėra apibrėžti RTC atmintyje, grįš į savo pradinę būseną.

Norėdami išsaugoti kintamuosius atmintyje net ir užmigę, naudokite kintamųjų deklaraciją, pateiktą toliau pateiktame pavyzdyje:

// RTC_DATA_ATTR galima pakeisti ir prisiminti RTCRTC_DATA_ATTR int bootCount = 0;

10 žingsnis: demonstravimas

Demonstracija
Demonstracija

Vaizdo įraše parodyta, kaip programa veikia pagal vaizdą.

11 veiksmas: „WiFi“mazgasMCU-32S ESP-WROOM-32

„WiFi“mazgasMCU-32S ESP-WROOM-32
„WiFi“mazgasMCU-32S ESP-WROOM-32

12 žingsnis: Surinkimas

Surinkimas
Surinkimas

13 žingsnis: programa

Dabar sukursime programą, kurioje sukonfigūruosime ESP32 pereiti į gilaus miego režimą. Tai bus pažadinta trimis skirtingais būdais: vienas skirtas išoriniam pažadinimui (ext0), kitas - laikmačiui ir kitas - jutikliniam kilimėliui. Jie negali dirbti kartu, todėl naudosime kintamąjį, kuris bus skaitiklis, kiek kartų ESP32 suteikė „Boot“, kad sukonfigūruotume būdą pabusti.

14 veiksmas: reikalinga biblioteka

Reikalinga biblioteka
Reikalinga biblioteka

Norėdami valdyti OLED ekraną, mums reikia išorinės bibliotekos. Norėdami tai padaryti, atsisiųsime U8g2 biblioteką.

„Arduino IDE“eikite į eskizų meniu >> Įtraukti biblioteką >> Tvarkyti bibliotekas….

15 žingsnis: bibliotekos ir kintamieji

Įtraukėme biblioteką OLED ekranui valdyti, taip pat ekrano valdiklio egzemplioriaus konstruktorių. Taip pat kintamąjį paskirstome RTC atmintyje. Mes nustatome jautrumą prisilietimui, mikrosekundės konversijos koeficientą sekundėms ir laiką, per kurį ESP32 pereina į miego režimą (sekundėmis).

#include // biblioteca para controle do display oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C ekranas (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR su įvairiais prisiminimais 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

16 veiksmas: sąranka

Sąrankoje mes padidiname įkrovos įvykių skaičių. Mes vadiname funkciją atspausdinti įkrovos motyvą. Jei įkrovos numeris yra PAR, nustatome, kad ESP32 atsibunda paspaudus (EXT0) mygtuką. Jei jis yra 3 kartotinis, nustatome, kad ESP32 atsibustų po nustatyto laiko. Priešingu atveju mes nustatome talpinius jutiklinius kaiščius, kad pažadintume ESP32. Galiausiai mes nustatome jutiklinį kilimėlį kaip pažadinimo šaltinį ir priverčiame ESP32 įjungti miego režimą.

void setup () {Serial.begin (115200); vėlavimas (1000); // padidėjimas arba skaičius de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // se o number 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 = aukštas, 0 = žemas} // se, skirtas daugybei konfigūracijų arba 3 ESP32, skirtos depois de um tempo tempdo, jei 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 {// Sąrankos pertraukimas „Touch Pad 5“(GPIO12) touchAttachInterrupt (T5, atgalinis skambutis, slenkstis); // Jutiklinės dalies konfigūravimas kaip pažadinimo šaltinis esp_sleep_enable_touchpad_wakeup (); } Serial.println („entrando em modo sleep“); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

17 veiksmas: ciklas, atgalinis skambinimas ir konfigūravimas

„Loop“mes neturime ką veikti. Tada mes nutraukiame atgalinį skambinimą, jei turime ką veikti, kai įvyksta pertrauka. Kalbant apie configureDisplay, inicijuojame ekraną ir sukonfigūruojame kai kuriuos parametrus. Ekrane spausdiname tiek kartų, kiek įvyko įkrova.

// 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. pradėti (); 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, eilutė (bootCount).c_str ()); display.drawString (0, 4, "MOTIVO:"); }

18 veiksmas: „Print_wakeup_reason“(žinodami prabudimo priežastį)

Čia mes turime funkciją atspausdinti ESP32 pabudimo priežastį. Patikrinkite kaištį ir atsispausdinkite ekrane.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; Eilutės priežastis = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // atkurti perjungimo priežastį (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; pertrauka; 2 atvejis: priežastis = "EXT1 RTC_CNTL"; pertrauka; 3 atvejis: priežastis = "LAIKMATIS"; pertrauka; 4 atvejis: priežastis = "TOUCHPAD"; pertrauka; 5 atvejis: priežastis = "ULP PROGRAMA"; pertrauka; numatytasis: reason = "NO DS CAUSE"; pertrauka; } Serial.println (priežastis); display.clearLine (6); // apaga ir linha 6 do display.drawString (0, 6, reason.c_str ()); // impime a causa do despertar no display // se despertou por TOUCHPAD, então vamos verificar em quality dos pinos ocorreu if (wakeup_reason == 4) {print_wakeup_touchpad (); // verifica o pino e imprime no display}}

19 veiksmas: „Print_wakeup_touchpad“(žinokite „GPIO Touch“)

Dabar, atlikdami šį veiksmą, turime funkciją atspausdinti paliestą kaištį. Mes atgavome GPIO, kuris pažadino ESP32, ir atspausdinome jį ekrane.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // atkurti arba GPIO que despertou o ESP32 String GPIO = ""; jungiklis („touchPin“) {atvejis 0: GPIO = "4"; pertrauka; 1 atvejis: GPIO = "0"; pertrauka; 2 atvejis: GPIO = "2"; pertrauka; 3 atvejis: GPIO = "15"; pertrauka; 4 atvejis: GPIO = "13"; pertrauka; 5 atvejis: GPIO = "12"; pertrauka; 6 atvejis: GPIO = "14"; pertrauka; 7 atvejis: GPIO = "27"; pertrauka; 8 atvejis: GPIO = "33"; pertrauka; 9 atvejis: GPIO = "32"; pertrauka; numatytasis: Serial.println ("Wakeup not by touchpad"); pertrauka; } Serial.println ("GPIO:"+GPIO); display.clearLine (7); // rodyti liniją 7 rodyti display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

20 veiksmas: atsisiųskite failus

PDF

AŠ NE

Rekomenduojamas: