- Reikalavimai
- ESP32 miego režimo grandinės schema
- ESP32 miego režimų apžvalga
- ESP32 programavimas gilaus miego režimui
- ESP32 bandymas gilaus miego režimu
ESP32 yra vienas iš populiariausių „Wi-Fi“ pagrįstų mikrovaldiklių modulių ir tai yra populiarus pasirinkimas daugelyje nešiojamųjų „IoT“ programų. Tai galingas valdiklis, palaikantis dviejų branduolių programavimą, taip pat turintis integruotą „Bluetooth Low Energy“ (BLE) palaikymą, todėl tai yra geras pasirinkimas nešiojamosioms programoms, tokioms kaip „iBeacon“ įrenginiai, GPS sekimo įrenginiai ir kt. Tačiau tokiose baterijose veikiančiose programose kaip šios, didžiausias rūpestis yra baterijos atsarginė kopija. Šį akumuliatoriaus atsarginį turinį galima padidinti išmaniau valdant mikrovaldiklio bloką, pvz., Galima užprogramuoti ESP32 miego režimu idealios būklės sąlygomis, kad būtų padidinta atsarginė įrenginio baterija.
Šiame projekte mes patikrinsime plačiai naudojamo „Wi-Fi“ ir „Bluetooth“ įjungto mikrovaldiklio bloko ESP32 dabartinį suvartojimą įprastu darbo režimu ir gilaus miego režimu. Be to, mes išbandysime skirtumą ir patikrinsime, kaip perkelti ESP32 į gilaus miego režimą. Taip pat galite perskaityti straipsnį apie tai, kaip sumažinti energijos suvartojimą mikrovaldikliuose, ir rasti kitų patarimų, kuriuos galite naudoti, kad jūsų dizainas taptų daug efektyvesnis energijai. Be to, jei jus domina kitų mikrovaldiklių miego režimas, galite išsirinkti „Arduino“ miego režimą ir ESP8266 „NodeMCU“ miego režimą.
Reikalavimai
Norėdami tai padaryti, naudosime ESP32 pagrįstą „Eskitsif“ „Devkit V4.0“, turinčią USB į UART tiltą, taip pat kitus ESP32 kištukus, kad būtų lengviau prisijungti. Programavimas bus atliekamas su „Arduino IDE“. Jei esate visiškai naujas, prieš pradėdami dirbti su „ESP32“ naudodami „Arduino“, perskaitykite susietą straipsnį.
Šio projekto reikalavimai yra šie:
- Paspaudus mygtuką, jis pereis į gilaus miego režimą.
- Jis pabus iš gilaus miego režimo paspaudus kitą mygtuką.
- Norint nustatyti ESP32 būseną, mirksi šviesos diodas, kurio įjungimo laikas yra 1000 milisekundžių. Miego režimu jis bus išjungtas.
Todėl reikalingi papildomi komponentai
- LED - 1 vnt
- Mygtukas (lytėjimo jungiklis) - 2 vnt
- 4.7k rezistoriai - 2 vnt
- 680R rezistorius - 1 vnt
- Bandomoji Lenta
- Prijunkite laidą
- 5 V adapteris arba maitinimo blokas
- Mikro USB laidas
- „Arduino IDE“ su ESP32 programavimo sąsaja asmeniniame ar nešiojamajame kompiuteryje.
ESP32 miego režimo grandinės schema
Žemiau parodyta schema, kaip ESP32 užmigdyti paspaudus mygtuką.
Schema yra gana paprasta. Jame yra du mygtukai. Miego mygtukas perjungs ESP32 į gilaus miego režimą, o kitas jungiklis naudojamas pažadinti ESP32 iš miego režimo. Abu mygtukai yra sujungti PIN 16 ir PIN 33. Paspaudus abu mygtukai sukonfigūruoti kaip aktyvūs žemai, todėl suteikiamas papildomas traukimas. Tačiau norint nustatyti, ar ESP 32 veikia miego režimu, ar įprastu darbo režimu, LED yra prijungtas prie IO 4 kaiščio.
ESP32 miego režimų apžvalga
ESP32 yra daug įvairių energijos režimų, būtent aktyvusis režimas, modemo miego režimas, lengvo miego režimas, gilaus miego režimas ir žiemos miego režimas.
Įprastomis darbo sąlygomis ESP32 veikia aktyviuoju režimu. Per ESP32 aktyvią veikseną, CPU, wifi / BT įrangos, RTC atminties, ir RTC periferinę įrangą, ulp bendradarbių procesorių, visi yra aktyvuotas ir darbas priklausomai nuo darbo krūvio. Tačiau esant skirtingiems maitinimo režimams, vienas ar keli periferiniai įrenginiai yra išjungti. Norėdami patikrinti įvairias maitinimo režimo operacijas, vadovaukitės toliau pateikta lentele-
Aparatinė įranga |
Aktyvusis režimas |
Modemo miego režimas |
Lengvas miego režimas |
Gilaus miego režimas |
Žiemos miegas |
Procesorius |
ĮJUNGTA |
ĮJUNGTA |
PAUZĖ |
IŠJUNGTA |
IŠJUNGTA |
„WiFi“ / „BT“ |
ĮJUNGTA |
IŠJUNGTA |
IŠJUNGTA |
IŠJUNGTA |
IŠJUNGTA |
RTC ir RTC periferiniai įrenginiai |
ĮJUNGTA |
ĮJUNGTA |
ĮJUNGTA |
ĮJUNGTA |
IŠJUNGTA |
ULP-Co procesorius |
ĮJUNGTA |
ĮJUNGTA |
ĮJUNGTA |
ĮJUNGTI IŠJUNGTI |
IŠJUNGTA |
Kaip matome aukščiau pateiktoje lentelėje, ESP32 gilaus miego režimu, kuris dažnai vadinamas ULP jutiklio stebimu modeliu - procesorius, „WiFi“ / „BT“, RTC atmintis ir periferiniai įrenginiai, visi ULP procesoriai yra išjungti. Įjungta tik RTC atmintis ir RTC periferiniai įrenginiai.
Pažadinimo metu apie ESP32 reikia pranešti pažadinimo šaltiniu, kuris pažadins ESP32 iš gilaus miego režimo. Tačiau kadangi RTC periferiniai įrenginiai yra įjungti, ESP32 galima pažadinti per RTC įgalintus GPIO. Yra ir kitų variantų. Tai gali būti pabudimas per išorinius pažadinimo pertraukimo kaiščius arba naudojant laikmatį, kad pažadintumėte ESP32. Šiame projekte mes naudojame ext0 pažadinimą 33 kaištyje.
ESP32 programavimas gilaus miego režimui
Visą programą rasite šio puslapio apačioje. Tai parašyta „Arduino IDE“ ir todėl gali būti lengvai pritaikoma pagal jūsų poreikius. Kodas paaiškinamas taip.
Kodo pradžioje
// Sukurkite „PushButton“ kintamąjį PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // apibrėžti „Led Pin“ uint8_t led_pin = GPIO_NUM_4; // apibrėžti pabudimo smeigtuką uint8_t wakeUp_pin = GPIO_NUM_33;
Aukščiau nurodytos trys eilutės apibūdina pažadinimo kaištį, LED kaištį ir miego režimo kaištį.
void setup () { // įdėkite čia savo sąrankos kodą, kad jis būtų paleistas vieną kartą: // nustatykite nuoseklųjį prievadą 115200 Serial.begin (115200); vėlavimas (1000); // nustatykite „pushButton“ kaištį kaip įvestį su vidiniu „PullUp“ pinMode („pushBtn.pin“, INPUT_PULLUP); // nustatykite pertraukimo tvarkytuvą su „pushButton“ kaiščiu kritimo režime attachInterrupt (pushBtn.pin, isr_handle, FALLING); // nustatykite „Led pin“ kaip „ouput pinMode“ (led_pin, OUTPUT); // sukurkite užduotį, kuri bus vykdoma funkcijoje „blinkLed ()“ su 1 prioritetu ir vykdoma „core 0 xTaskCreate“ („ blinkLed“, / * „Task“ funkcija. * / "blinkLed", / * užduoties pavadinimas. * / 1024 * 2, / * Užduoties kamino dydis * / NULL, / * užduoties parametras * / 5, / * užduoties prioritetas * / & taskBlinkled); / * Užduoties rankena norint sekti sukurtą užduotį * / delay (500); // Konfigūruokite 33 smeigtuką kaip ext0 pabudimo šaltinį su LOW logikos lygiu esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Pirmiau, kodo fragmentu pertraukimas nustatomas į kritimo režimą
attachInterrupt („pushBtn.pin“, „isr_handle“, KRITIMAS);
Todėl, kai tik paspausite jungiklį, loginis lygis pasikeis iš 1 logikos (3,3 V) į 0 loginį (0 V). Mygtuko kaiščio įtampa kris ir ESP32 nustatys, kad jungiklis paspaustas. Taip pat sukurta užduotis mirksėti šviesos diodui.
xTaskCreate ( blinkLed, / * Užduoties funkcija. * / "blinkLed", / * užduoties pavadinimas. * / 1024 * 2, / * Užduoties krūvos dydis * / NULL, / * užduoties parametras * / 5, / * prioritetas užduoties * / & taskBlinkled); / * Užduoties rankena norint sekti sukurtą užduotį * / delay (500);
Smeigtukas 33 taip pat sukonfigūruotas naudojant žemiau pateiktą kodo fragmentą kaip išorinį pažadinimo šaltinį, identifikuojamą kaip ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Kitas, tuo tarpu ciklas
void loop () { // įdėkite savo pagrindinį kodą čia, kad jis būtų paleistas pakartotinai: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Sustabdykite 'blinkLed' užduotį \ n"); // Sustabdykite „blinkLed Task“ vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Einu miegoti….. \ n", pushBtn.pin); pushBtn.pressed = false; // Eik miegoti dabar esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); jungiklis (wakeupReason) { atvejis ESP_SLEEP_WAKEUP_EXT0: Serial.println ("naudojant išorinį signalą ext0 WakeUp From sleep"); pertrauka; atvejis ESP_SLEEP_WAKEUP_EXT1: Serial.println ("naudojant išorinį signalą ext1 WakeUp From sleep"); pertrauka; atvejis ESP_SLEEP_WAKEUP_TIMER: Serial.println ("naudojant laikmačio signalą WakeUp From sleep"); pertrauka; atvejis ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("jutiklinės planšetės signalo naudojimas WakeUp From sleep"); pertrauka; atvejis ESP_SLEEP_WAKEUP_ULP: Serial.println ("naudojant ULP signalą WakeUp From sleep"); pertrauka; numatytasis: pertrauka; Serial.printf ("Atnaujinti" blinkLed "užduotį \ n"); // iš naujo paleiskite „blinkLed Task vTaskResume“ (taskBlinkled); } }
„While“ kilpa nuolat tikrina, ar nuspaustas miego mygtukas, ar ne. Paspaudus mygtuką, jis sustabdys arba sustabdys šviesos diodo mirksėjimo užduotį ir paleis esp miego pradžios funkciją.
esp_deep_sleep_start ();
Esant tokiai situacijai, jei paspaudžiamas ext0 išorinio pertraukimo mygtukas, jis iškart pabus iš gilaus miego režimo ir vėl pradės mirksėti.
Galiausiai, LED mirksėjimo funkciją galima pamatyti žemiau esančiuose fragmentuose, ji mirksi LED 1000 ms sekundėmis.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // perjungti smeigtuko vertę pin_val ^ = 1; „digitalWrite“ („led_pin“, „pin_val“); Serial.printf ("Led -----------------% s \ n", pin_val? "Įjungta": "Išjungta"); / * Tiesiog perjunkite šviesos diodą kas 1000 ms arba 1 sekundę * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; „vTaskDelete“ (NULL); }
ESP32 bandymas gilaus miego režimu
Grandinė sukonstruota skydinėje, o srovei matuoti naudojamas „Metravi XB“ leidimo multimetras. Srovė, kurią grandinė įjungia aktyviuoju režimu, yra beveik 58 mA, tačiau gilaus miego režimu srovė yra beveik 4,10 mA. Žemiau esančiame paveikslėlyje rodomas ESP32 aktyvaus režimo srovės suvartojimas -
Esant gilaus miego režimui, dabartinis suvartojimas įrašomas sumažėjęs iki maždaug 3,95 mA, žemiau esančiame paveikslėlyje parodytas ESP32 gilaus miego režimo srovės suvartojimas
Tačiau esant giliam miego režimui ESP32 dabartinė sąnaudos yra beveik 150 uA. Tačiau užregistruotas šios ESP32 „Devkit“ plokštės srovės suvartojimas yra beveik 4,10 mA. Tai lemia CP2102 ir linijinis reguliatorius. Šie du yra prijungti prie 5 V maitinimo linijos. Maitinimo linijoje taip pat yra prijungtas maitinimo šviesos diodas, kuris sunaudoja beveik 2mA srovės.
Todėl galima lengvai nustatyti, kad ESP32 sunaudoja labai mažą energijos kiekį gilaus miego režimu, kuris yra labai naudingas dirbant su baterijomis. Norėdami gauti daugiau informacijos apie tai, kaip tai veikė, peržiūrėkite toliau pateiktą vaizdo įrašą. Jei turite klausimų, palikite juos komentarų skiltyje žemiau arba naudokite mūsų forumus kitiems techniniams klausimams.