- Zahtjevi
- Kružna shema ESP32 mirovanja
- Pregled načina mirovanja u ESP32
- Programiranje ESP32 za način dubokog spavanja
- Testiranje ESP32 u načinu dubokog spavanja
ESP32 je jedan od najpopularnijih mikrokontrolera temeljenih na Wi-Fi-u i popularan je izbor u mnogim prijenosnim IoT aplikacijama. Moćan je kontroler koji podržava dvojezgreno programiranje, a također ima ugrađenu podršku za Bluetooth s niskom potrošnjom energije (BLE) što ga čini dobrim izborom za prijenosne aplikacije poput iBeacon uređaja, GPS Trackera itd. Međutim, u aplikacijama na baterije poput ovih, glavna briga je sigurnosna kopija baterije. Ovu sigurnosnu kopiju baterije možete povećati pametnijom kontrolom nad jedinicom mikrokontrolera, poput one koja može programirati ESP32 u načinu mirovanja tijekom idealnog stanja za povećanje sigurnosne kopije baterije.
U ovom ćemo projektu provjeriti trenutnu potrošnju široko popularne jedinice mikrokontrolera s omogućenim Wi-Fi-jem i Bluetooth-om ESP32 u normalnom načinu rada i načinu dubokog spavanja. Također ćemo testirati razliku i provjeriti kako ESP32 staviti u režim dubokog spavanja. Također možete pogledati članak o tome kako minimizirati potrošnju energije u mikrokontrolerima i potražiti druge savjete koji vam mogu poslužiti za postizanje mnogo veće učinkovitosti napajanja. Nadalje, ako ste zainteresirani za način mirovanja drugih mikrokontrolera, možete provjeriti i način spavanja Arduino i način spavanja ESP8266 NodeMCU.
Zahtjevi
Da bismo to učinili, koristit ćemo Devkit V4.0 zasnovan na ESP32 iz Espressifa koji ima USB na UART most, kao i druge ESP32 pinoute za jednostavno povezivanje. Programiranje će se vršiti pomoću Arduino IDE-a. Ako ste potpuno novi, za početak rada s ESP32 koristeći Arduino pročitajte povezani članak prije nego što nastavite.

Zahtjevi ovog projekta su sljedeći-
- Pritiskom gumba preći će u način dubokog spavanja.
- Probudit će se iz načina dubokog spavanja pritiskom drugog gumba.
- Da bi otkrio stanje ESP32, LED će treptati s vremenom uključivanja od 1000 milisekundi. Tijekom mirovanja, bit će isključen.
Stoga su potrebne dodatne komponente -
- LED - 1 kom
- Tipkalo (taktilna sklopka) - 2 kom
- Otpornici 4.7k - 2 kom
- 680R otpornik - 1 kom
- Breadboard
- Priključite žicu
- 5V adapter ili jedinica za napajanje
- Mikro-USB kabel
- Arduino IDE s programskim sučeljem ESP32 na računalu ili prijenosnom računalu.
Kružna shema ESP32 mirovanja
Shema za uspavljivanje ESP32 tipkom prikazana je u nastavku.

Shema je prilično jednostavna. Ima dva gumba. Gumb za spavanje prebacit će ESP32 u način dubokog spavanja, a drugi prekidač koristi se za buđenje ESP32 iz stanja mirovanja. Oba su gumba povezana PIN-om 16 i PIN-om 33. Oba gumba konfigurirana su kao aktivna niska kada se pritisnu, pa se daje dodatno povlačenje. Međutim, da bi se utvrdilo je li ESP 32 u načinu mirovanja ili u normalnom radnom stanju, LED je spojen na IO pin 4.
Pregled načina mirovanja u ESP32
Postoji mnogo različitih načina napajanja za ESP32, a to su aktivni način rada, modemski način mirovanja, lagani način mirovanja, duboki san i hibernacija.
Tijekom normalnog radnog stanja, ESP32 radi u aktivnom načinu rada. Tijekom aktivnog načina rada ESP32, CPU, WiFi / BT hardver, RTC memorija i RTC periferne jedinice, ULP koprocesori, svi su aktivirani i rade ovisno o opterećenju. Međutim, na različitim načinima napajanja isključena je jedna ili više perifernih uređaja. Da biste provjerili različite načine rada napajanja, slijedite donju tablicu -
| Hardver | Aktivni način rada | Modem mirovanja | Lagani način mirovanja | Način dubokog spavanja | Hibernacija | 
| CPU | NA | NA | PAUZA | ISKLJUČENO | ISKLJUČENO | 
| WiFi / BT | NA | ISKLJUČENO | ISKLJUČENO | ISKLJUČENO | ISKLJUČENO | 
| RTC i RTC periferne jedinice | NA | NA | NA | NA | ISKLJUČENO | 
| Procesor ULP-Co | NA | NA | NA | UKLJUČENO, ISKLJUČENO | ISKLJUČENO | 
Kao što možemo vidjeti u gornjoj tablici da su u načinu dubokog spavanja ESP32, koji se često naziva uzorkom nadgledanog ULP senzora - isključeni CPU, WiFi / BT, RTC memorija i periferna oprema. Uključene su samo RTC memorija i RTC periferne jedinice.
Tijekom situacije buđenja, ESP32 mora biti obaviješten od izvora buđenja koji će probuditi ESP32 iz načina dubokog spavanja. Međutim, budući da su RTC periferne jedinice uključene, ESP32 se može probuditi putem RIO omogućenih GPIO-a. Postoje i druge mogućnosti. Može se probuditi kroz vanjske igle za prekidanje buđenja ili pomoću tajmera za buđenje ESP32. U ovom projektu koristimo ext0 buđenje na pin 33.
Programiranje ESP32 za način dubokog spavanja
Kompletni program nalazi se na dnu ove stranice. Napisan je za Arduino IDE i stoga se lako može prilagoditi vašim zahtjevima. Objašnjenje koda je sljedeće.
Na početku koda, // Stvaranje PushButton varijable PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definiramo Led pin uint8_t led_pin = GPIO_NUM_4; // definiraj pin za buđenje uint8_t wakeUp_pin = GPIO_NUM_33;
Gornja tri retka definiraju pin za buđenje, LED pin i pin u načinu mirovanja.
void setup () { // ovdje stavite svoj kod za postavljanje, da se jednom pokrene: // postavite serijski port na 115200 Serial.begin (115200); kašnjenje (1000); // postavljanje pin-a pushButton kao ulaza s unutarnjim PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // postavljanje ručnika za prekide pomoću pin-a pushButton u padajućem načinu attachInterrupt (pushBtn.pin, isr_handle, FALLING); // postavimo Led pin kao ouput pinMode (led_pin, OUTPUT); // stvorimo zadatak koji će se izvršiti u funkciji blinkLed (), s prioritetom 1 i izvršiti na jezgri 0 xTaskCreate ( blinkLed, / * funkcija zadatka. * / "blinkLed", / * naziv zadatka. * / 1024 * 2, / * Veličina sloga zadatka * / NULL, / * parametar zadatka * / 5, / * prioritet zadatka * / & taskBlinkled); / * Ručka zadatka za praćenje kreiranog zadatka * / delay (500); // Konfigurirajte pin 33 kao ext0 izvor za buđenje s NISKOM logičkom razinom esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
U gore navedenom, isječak koda prekida postavlja način pada
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Stoga će se, kad god se pritisne prekidač, razina logike promijeniti iz logike 1 (3,3 V) u logiku 0 (0 V). Napon pin-a gumba će pasti i ESP32 će prepoznati da je prekidač pritisnut. Također je stvoren zadatak da trepće LED.
xTaskCreate ( blinkLed, / * Funkcija zadatka. * / "blinkLed", / * naziv zadatka. * / 1024 * 2, / * Veličina sloga zadatka * / NULL, / * parametar zadatka * / 5, / * prioritet zadatka * / & taskBlinkled); / * Ručka zadatka za praćenje kreiranog zadatka * / delay (500);
Pin 33 je također konfiguriran pomoću donjeg isječka koda kao vanjski izvor buđenja identificiran kao ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Dalje, u while petlji-
void loop () { // ovdje stavite svoj glavni kôd kako biste se opetovano izvodili: if (pushBtn.pressed) { Serial.printf ("Pritisnuti gumb (% d) pritisnut \ n", pushBtn.pin); Serial.printf ("Obustavi zadatak 'blinkLed' \ n"); // Suspendiranje blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Spavanje….. \ n", pushBtn.pin); pushBtn.pressed = false; // Idite na spavanje sada esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); prekidač (wakeupReason) { slučaj ESP_SLEEP_WAKEUP_EXT0: Serial.println ("upotreba vanjskog signala ext0 za WakeUp From sleep"); pauza; slučaj ESP_SLEEP_WAKEUP_EXT1: Serial.println ("upotreba vanjskog signala ext1 za WakeUp From sleep"); pauza; slučaj ESP_SLEEP_WAKEUP_TIMER: Serial.println ("upotreba vremenskog signala za buđenje iz stanja mirovanja"); pauza; slučaj ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("upotreba TouchPad signala za WakeUp From sleep"); pauza; slučaj ESP_SLEEP_WAKEUP_ULP: Serial.println ("upotreba ULP signala za WakeUp From sleep"); pauza; zadano: prekid; Serial.printf ("Nastavak zadatka 'blinkLed' \ n"); // ponovno pokrenite blinkLed Task vTaskResume (taskBlinkled); } }
Petlja while neprestano provjerava je li gumb za spavanje pritisnut ili ne. Ako se pritisne tipka, zaustavit će ili obustaviti zadatak LED treptanja i pokrenuti esp funkciju dubokog spavanja-
esp_deep_sleep_start ();
U ovoj situaciji, ako se pritisne gumb ext0 vanjskog prekida, odmah će se probuditi iz režima dubokog mirovanja i nastaviti sa zadatkom led treptanja.
I na kraju, funkcija treptanja LED-a može se vidjeti u donjim isječcima, trepnut će LED 1000 ms sekundi.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // prebacivanje vrijednosti pin-a pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "Uključeno": "Isključeno"); / * Jednostavno prebacujte LED svake 1000ms ili 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testiranje ESP32 u načinu dubokog spavanja
Strujni krug izrađen je u ploči, a za mjerenje struje koristi se multimetar Metravi XB izdanja. Struja koju strujni krug vuče u aktivnom načinu rada iznosi gotovo 58 mA, ali u načinu dubokog spavanja struja iznosi gotovo 4,10 mA. Ispod je slika trenutne potrošnje struje aktivnog načina rada ESP32 -

U načinu dubokog spavanja, trenutna potrošnja bilježi se na oko 3,95 mA, donja slika prikazuje trenutnu potrošnju ESP32 dubokog mirovanja -
 
Međutim, u načinu dubokog spavanja trenutna potrošnja ESP32 iznosi gotovo 150 uA. No, zabilježena trenutna potrošnja za ovu ESP32 Devkit ploču iznosi gotovo 4,10 mA. To je zbog CP2102 i linearnog regulatora. Ova su dva spojena na 5V dalekovod. U električni vod također je priključena LED napajanja koja troši gotovo 2mA struje.
Stoga se lako može prepoznati da ESP32 troši vrlo malu količinu energije u stanju dubokog mirovanja, što je vrlo korisno za rad na baterije. Za više informacija o tome kako je to funkcioniralo, pogledajte video dolje povezan. Ako imate bilo kakvih pitanja, ostavite ih u odjeljku za komentare u nastavku ili koristite naša foruma za druga tehnička pitanja.

