- Zahteve
- Shema vezja v načinu spanja ESP32
- Pregled načinov spanja v ESP32
- Programiranje ESP32 za način globokega spanja
- Testiranje sistema ESP32 v načinu globokega spanja
ESP32 je eden izmed najbolj priljubljenih modulov mikrokrmilnika, ki temelji na Wi-Fi, in je priljubljena izbira v številnih prenosnih IoT aplikacijah. Je zmogljiv krmilnik, ki podpira dvojedrno programiranje in ima vgrajeno podporo za nizkoenergijsko tehnologijo Bluetooth (BLE), zato je dobra izbira za prenosne aplikacije, kot so naprave iBeacon, GPS sledilci itd., glavna skrb je varnostno kopiranje baterij. To varnostno kopijo baterije lahko povečate s pametnejšim nadzorom nad mikrokrmilnikom, tako kot lahko v idealnem stanju programirate ESP32 v načinu spanja, da povečate varnostno kopijo baterije.
V tem projektu bomo preverili trenutno porabo široko priljubljene mikrokrmilne enote ESP32, ki podpira Wi-Fi in Bluetooth, v običajnem delovnem načinu in načinu globokega spanja. Prav tako bomo preizkusili razliko in preverili, kako preklopiti ESP32 v način globokega spanja. V članku o tem, kako zmanjšati porabo energije v mikrokrmilnikih, si lahko ogledate tudi druge nasvete, s katerimi lahko svojo zasnovo naredite veliko bolj učinkovito. Če vas zanima način mirovanja drugih mikrokrmilnikov, lahko preverite tudi način spanja Arduino in način spanja ESP8266 NodeMCU.
Zahteve
Za to bomo uporabili Devkit V4.0 na osnovi ESP32 podjetja Espressif, ki ima most USB do UART, pa tudi druge izvlečke ESP32 za enostavno povezavo. Programiranje bo izvedeno z Arduino IDE. Če ste popolnoma novi, si za začetek uporabe ESP32 z uporabo Arduina preberite povezani članek, preden nadaljujete.
Zahteve tega projekta so naslednje:
- S pritiskom na gumb preklopi v način globokega spanja.
- Iz načina globokega spanja se bo prebudil s pritiskom drugega gumba.
- Za zaznavanje stanja ESP32 bo LED utripala s časom vklopa 1000 milisekund. V načinu spanja bo izklopljen.
Zato so potrebne dodatne komponente -
- LED - 1 kos
- Tipka (tipalno stikalo) - 2 kos
- 4.7k upori - 2 kos
- Upor 680R - 1 kos
- Breadboard
- Priklopite žico
- 5V adapter ali napajalna enota
- Kabel micro-USB
- Arduino IDE s programskim vmesnikom ESP32 v osebnem ali prenosnem računalniku.
Shema vezja v načinu spanja ESP32
Shema za uspavanje ESP32 s tipko je prikazana spodaj.
Shema je precej preprosta. Ima dva gumba. Gumb za spanje preklopi ESP32 v način globokega spanja, drugo stikalo pa se uporablja za prebuditev ESP32 iz stanja spanja. Oba gumba sta povezana s številkama PIN 16 in PIN 33. Oba gumba sta ob pritisku konfigurirana kot aktivna nizka, zato je na voljo dodaten dvig. Da pa zazna, ali je ESP 32 v načinu spanja ali v običajnem delovnem stanju, je LED priključen na IO Pin 4.
Pregled načinov spanja v ESP32
Obstaja veliko različnih načinov napajanja za ESP32, in sicer aktivni način, modemski način mirovanja, lahki način spanja, način globokega spanja in način mirovanja.
V normalnih delovnih pogojih ESP32 deluje v aktivnem načinu. V aktivnem načinu ESP32 so CPU, strojna oprema WiFi / BT, pomnilnik RTC in zunanja oprema RTC, UL-koprocesorji, vsi aktivirani in delujejo glede na delovno obremenitev. Vendar je pri različnih načinih napajanja ena ali več zunanjih naprav izklopljena. Če želite preveriti različne načine napajanja, sledite spodnji tabeli -
Strojna oprema |
Aktivni način |
Modem-način mirovanja |
Način lahkega spanja |
Način globokega spanja |
Hibernacija |
CPU |
VKLOPLJENO |
VKLOPLJENO |
PAVZA |
IZKLOPLJENO |
IZKLOPLJENO |
WiFi / BT |
VKLOPLJENO |
IZKLOPLJENO |
IZKLOPLJENO |
IZKLOPLJENO |
IZKLOPLJENO |
RTC in RTC zunanja oprema |
VKLOPLJENO |
VKLOPLJENO |
VKLOPLJENO |
VKLOPLJENO |
IZKLOPLJENO |
Procesor ULP-Co |
VKLOPLJENO |
VKLOPLJENO |
VKLOPLJENO |
PRIŽGI UGASNI |
IZKLOPLJENO |
Kot lahko vidimo v zgornji tabeli, so v načinu globokega spanja ESP32, ki ga pogosto imenujemo vzorec nadzorovanega senzorja ULP - CPU, WiFi / BT, pomnilnik in zunanja oprema RTC vsi soprocesorji ULP izklopljeni. Vklopljeni so samo pomnilnik RTC in zunanja oprema RTC.
Med budnostjo mora ESP32 o tem obvestiti vir, ki bo ESP32 prebudil iz načina globokega spanja. Ker pa so zunanje naprave RTC vklopljene, se lahko ESP32 prebudi prek GPIO-jev, ki podpirajo RTC. Obstajajo tudi druge možnosti. Lahko se prebudi prek zunanjih zatičev za prekinitev zbujanja ali s pomočjo časovnika za prebujanje ESP32. V tem projektu uporabljamo bujenje ext0 na zatiču 33.
Programiranje ESP32 za način globokega spanja
Celoten program najdete na dnu te strani. Napisan je za Arduino IDE in ga je zato mogoče enostavno prilagoditi vašim zahtevam. Razlaga kode je naslednja.
Na začetku kode, // Ustvari spremenljivko PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // določimo Led Pin uint8_t led_pin = GPIO_NUM_4; // določimo pin za prebujanje uint8_t wakeUp_pin = GPIO_NUM_33;
Zgornje tri vrstice opredeljujejo zatič, budilko LED in zatič v načinu spanja.
void setup () { // postavite svojo nastavitveno kodo sem, da se zažene enkrat: // nastavite serijska vrata na 115200 Serial.begin (115200); zamuda (1000); // nastavimo zatič pushButton kot vhod z notranjim PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // nastavimo obdelovalca prekinitev z zatičem pushButton v padajočem načinu attachInterrupt (pushBtn.pin, isr_handle, FALLING); // nastavimo Led pin kot izhodni pinMode (led_pin, OUTPUT); // ustvarimo nalogo, ki bo izvedena v funkciji blinkLed () s prednostjo 1 in izvedena v jedru 0 xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * ime naloge. * / 1024 * 2, / * Velikost sklada naloge * / NULL, / * parameter naloge * / 5, / * prednost opravila * / & taskBlinkled); / * Ročaj opravila za spremljanje ustvarjene naloge * / delay (500); // Konfigurirajte pin 33 kot vir budjenja ext0 z LOW logično stopnjo esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
V zgornjem je prekinitev nastavljena na padajoči način s pomočjo delčka kode
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Zato se bo logična raven, kadar pritisnete stikalo, spremenila iz logike 1 (3,3 V) v logiko 0 (0 V). Napetost zatiča gumba bo padla in ESP32 bo ugotovil, da je stikalo pritisnjeno. Obstaja tudi naloga, ki utripa LED.
xTaskCreate ( blinkLed, / * funkcija opravila. * / "blinkLed", / * ime naloge. * / 1024 * 2, / * Velikost sklada naloge * / NULL, / * parameter naloge * / 5, / * prioriteta naloge * / & taskBlinkled); / * Ročaj opravila za spremljanje ustvarjene naloge * / delay (500);
Zatič 33 je prav tako konfiguriran z uporabo spodnjega delčka kode kot zunanji vir bujenja, označen kot ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Nato, v zanki while-
void loop () { // vstavite svojo glavno kodo sem, da se bo večkrat zagnala: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pritisnjeno \ n", pushBtn.pin); Serial.printf ("Začasno ustavi opravilo 'blinkLed' \ n"); // Suspendiranje blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Odhod spat….. \ n", pushBtn.pin); pushBtn.pressed = false; // Pojdi spat zdaj esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); stikalo (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("z uporabo zunanjega signala ext0 za WakeUp From sleep"); odmor; primer ESP_SLEEP_WAKEUP_EXT1: Serial.println ("uporaba zunanjega signala ext1 za WakeUp From sleep"); odmor; primer ESP_SLEEP_WAKEUP_TIMER: Serial.println ("z uporabo časovnega signala za WakeUp From sleep"); odmor; primer ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("uporaba signala sledilne ploščice za WakeUp From sleep"); odmor; primer ESP_SLEEP_WAKEUP_ULP: Serial.println ("uporaba ULP signala za WakeUp From sleep"); odmor; privzeto: odmor; Serial.printf ("Nadaljuj z nalogo 'blinkLed' \ n"); // znova zaženimo opravilo blinkLed vTaskResume (taskBlinkled); } }
Zanka while nenehno preverja, ali je gumb za spanje pritisnjen ali ne. Če pritisnete gumb, zaustavi ali zaustavi nalogo utripanja LED in zažene funkcijo globokega zagona esp-
esp_deep_sleep_start ();
V tem primeru se bo, če pritisnete gumb za zunanjo prekinitev ext0, takoj preklopil iz načina globokega spanja in nadaljeval z nalogo led utripanja.
Nazadnje je funkcija utripanja LED vidna v spodnjih delčkih, LED utripa 1000 ms sekund.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // preklapljanje vrednosti pin-a pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Preprosto preklopite LED vsakih 1000 ms ali 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testiranje sistema ESP32 v načinu globokega spanja
Vezje je zgrajeno v plošči, za merjenje toka pa se uporablja multimeter Metravi XB edition. Tok, ki ga vezje potegne v aktivnem načinu, je skoraj 58 mA, v načinu globokega spanja pa je skoraj 4,10 mA. Spodnja slika prikazuje trenutno porabo trenutnega načina ESP32 -
V načinu globokega spanja se trenutna poraba zabeleži na približno 3,95 mA, spodnja slika prikazuje trenutno porabo načina globokega spanja ESP32 -
V načinu globokega spanja pa trenutna poraba ESP32 znaša skoraj 150 uA. Toda zabeležena trenutna poraba za to ploščo ESP32 Devkit je skoraj 4,10 mA. To je posledica CP2102 in linearnega regulatorja. Ta dva sta priključena na 5V daljnovod. V daljnovod je priključena tudi napajalna LED, ki porablja skoraj 2 mA toka.
Zato je enostavno ugotoviti, da ESP32 v stanju globokega spanja porabi zelo malo energije, kar je zelo koristno za delovanje na baterije. Za več informacij o delovanju si oglejte spodnji videoposnetek. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje spodaj ali uporabite forum za druga tehnična vprašanja.