- Prasības
- ESP32 miega režīma shēmas diagramma
- ESP32 miega režīmu pārskats
- ESP32 programmēšana dziļā miega režīmam
- ESP32 pārbaude dziļā miega režīmā
ESP32 ir viens no populārākajiem mikrokontrolleru moduļiem, kuru pamatā ir Wi-Fi, un tā ir populāra izvēle daudzās portatīvajās IoT lietojumprogrammās. Tas ir spēcīgs kontrolieris, kas atbalsta divu kodolu programmēšanu, un tam ir iebūvēts Bluetooth Low Energy (BLE) atbalsts, padarot to par labu izvēli pārnēsājamām lietojumprogrammām, piemēram, iBeacon ierīcēs, GPS izsekotājos utt. Tomēr tādās lietojumprogrammās kā ar akumulatoru darbināmas, piemēram, šīs, galvenā problēma ir akumulatora dublēšana. Šo akumulatora dublējumu var palielināt, gudrāk kontrolējot mikrokontrolleru bloku, piemēram, ideālā stāvoklī var ieprogrammēt ESP32 miega režīmā, lai palielinātu ierīces akumulatora dublējumu.
Šajā projektā mēs pārbaudīsim plaši populārā Wi-Fi un Bluetooth iespējotā mikrokontrolleru bloka ESP32 pašreizējo patēriņu normālā darba režīmā un dziļā miega režīmā. Mēs arī pārbaudīsim atšķirību un pārbaudīsim, kā ESP32 ievietot dziļā miega režīmā. Varat arī apskatīt rakstu par to, kā samazināt enerģijas patēriņu mikrokontrolleros, lai iegūtu citus padomus, kurus var izmantot, lai padarītu jūsu dizainu daudz energoefektīvāku. Turklāt, ja jūs interesē citu mikrokontrolleru miega režīms, varat arī pārbaudīt Arduino miega režīmu un ESP8266 NodeMCU miega režīmu.
Prasības
Lai to izdarītu, mēs izmantosim ESP32 bāzēto Devkit V4.0 no Espressif, kam ir USB uz UART tilts, kā arī citus ESP32 pinouts ērtai savienošanai. Programmēšana tiks veikta ar Arduino IDE. Ja esat pilnīgi jauns, tad, lai sāktu darbu ar ESP32, izmantojot Arduino, pirms turpināt, izlasiet saistīto rakstu.
Šī projekta prasības ir šādas:
- Nospiežot pogu, tas pārslēgsies dziļā miega režīmā.
- Tas pamodīsies no dziļā miega režīma, nospiežot citu pogu.
- Lai noteiktu ESP32 stāvokli, mirgos gaismas diode ar ieslēgšanās laiku 1000 milisekundes. Miega režīmā tas tiks izslēgts.
Tāpēc nepieciešami papildu komponenti -
- LED - 1 gab
- Spiedpoga (taustes slēdzis) - 2 gab
- 4.7k rezistori - 2 gab
- 680R rezistors - 1 gab
- Maizes dēlis
- Pievienojiet vadu
- 5V adapteris vai barošanas bloks
- Mikro USB kabelis
- Arduino IDE ar ESP32 programmēšanas saskarni personālajā datorā vai klēpjdatorā.
ESP32 miega režīma shēmas diagramma
Shematisks lai likt ESP32 gulēt uz ar spiedpogu ir parādīts zemāk.
Shēma ir diezgan vienkārša. Tam ir divas pogas. Miega poga nodos ESP32 dziļā miega režīmā, un ESP32 pamodināšanai no miega režīma tiek izmantots cits slēdzis. Abas pogas ir savienotas PIN 16 un PIN 33. Nospiežot, abas pogas ir konfigurētas kā aktīvas zemas, tāpēc tiek dota papildu izvilkšana. Tomēr, lai noteiktu, vai ESP 32 ir miega režīmā vai normālā darba stāvoklī, LED ir savienots ar IO 4. kontaktu.
ESP32 miega režīmu pārskats
ESP32 ir daudz dažādu enerģijas režīmu, proti, aktīvais režīms, modema miega režīms, vieglā miega režīms, dziļā miega režīms un hibernācijas režīms.
Normālā darba stāvoklī ESP32 darbojas aktīvajā režīmā. Laikā ESP32 aktīvajā režīmā, CPU, WiFi / BT aparatūru, RTK atmiņu un RTK perifērijas ierīces, ULP sadarbības procesoriem, visi ir aktivizēts, un darbs, atkarībā no slodzes. Tomēr dažādos enerģijas režīmos viena vai vairākas perifērijas ierīces ir izslēgtas. Lai pārbaudītu dažādas enerģijas režīma darbības, izpildiet šo tabulu-
Aparatūra |
Aktīvais režīms |
Modema miega režīms |
Gaismas miega režīms |
Dziļā miega režīms |
Hibernācija |
Procesors |
ON |
ON |
PAUZE |
IZSLĒGTS |
IZSLĒGTS |
WiFi / BT |
ON |
IZSLĒGTS |
IZSLĒGTS |
IZSLĒGTS |
IZSLĒGTS |
RTC un RTC perifērijas ierīces |
ON |
ON |
ON |
ON |
IZSLĒGTS |
ULP-Co procesors |
ON |
ON |
ON |
IESLĒGTS IZSLĒGTS |
IZSLĒGTS |
Kā redzam iepriekš redzamajā tabulā, ESP32 dziļā miega režīmā, ko bieži sauc par ULP sensora uzraudzītu modeli - CPU, WiFi / BT, RTC atmiņa un perifērijas ierīces, visi ULP līdzprocesori ir izslēgti. Ieslēgtas tikai RTC atmiņa un RTC perifērijas ierīces.
Modināšanas situācijā ESP32 jāpaziņo ar modināšanas avotu, kas pamodinās ESP32 no dziļā miega režīma. Tomēr, tā kā RTC perifērijas ierīces ir ieslēgtas, ESP32 var pamodināt, izmantojot ar RTC iespējotus GPIO. Ir arī citas iespējas. To var pamodināt, izmantojot ārējas modināšanas pārtraukuma tapas, vai izmantojot taimeri, lai pamodinātu ESP32. Šajā projektā mēs izmantojam ext0 modināšanu uz 33. kontakta.
ESP32 programmēšana dziļā miega režīmam
Pilna programma ir atrodama šīs lapas apakšdaļā. Tas ir paredzēts Arduino IDE, un tāpēc to var viegli pielāgot jūsu prasībām. Kods ir izskaidrots šādi.
Koda sākumā
// Izveidojiet PushButton mainīgo PushBnt pushBtn = {GPIO_NUM_16, 0, false); // definēt Led Pin uint8_t led_pin = GPIO_NUM_4; // definēt modināšanas tapu uint8_t wakeUp_pin = GPIO_NUM_33;
Iepriekš minētās trīs līnijas nosaka modināšanas tapu, LED tapu un miega režīma tapu.
void setup () { // šeit ievietojiet iestatīšanas kodu, lai tas darbotos vienreiz: // iestatiet seriālo portu uz 115200 Serial.begin (115200); kavēšanās (1000); // iestatiet pushButton tapu kā ievadi ar iekšējo PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // iestatiet pārtraucēju apstrādātāju ar pushButton tapu kritiena režīmā attachInterrupt (pushBtn.pin, isr_handle, FALLING); // iestatiet Led pin kā ouput pinMode (led_pin, OUTPUT); // izveidojiet uzdevumu, kas tiks izpildīts funkcijā blinkLed () ar 1. prioritāti un izpildīts 0 kodā xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * uzdevuma nosaukums. * / 1024 * 2, / * Uzdevuma kaudzes izmērs * / NULL, / * uzdevuma parametrs * / 5, / * uzdevuma prioritāte * / & taskBlinkled); / * Uzdevuma rokturis, lai sekotu izveidotajam uzdevumam * / delay (500); // Konfigurēt 33. kontaktu kā ext0 modināšanas avotu ar LOW loģikas līmeni esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Iepriekš minētajā gadījumā koda fragments pārtraukumu iestata krītošā režīmā
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Tāpēc ikreiz, kad tiek nospiests slēdzis, loģikas līmenis tiks mainīts no 1. loģikas (3.3V) uz loģiku 0 (0V). Pogas tapas spriegums samazināsies, un ESP32 noteiks, ka slēdzis ir nospiests. Ir arī izveidots uzdevums mirgot LED.
xTaskCreate ( blinkLed, / * Uzdevuma funkcija. * / "blinkLed", / * uzdevuma nosaukums. * / 1024 * 2, / * Uzdevuma kaudzes izmērs * / NULL, / * uzdevuma parametrs * / 5, / * prioritāte uzdevuma * / & taskBlinkled); / * Uzdevuma rokturis, lai sekotu izveidotajam uzdevumam * / delay (500);
Arī tapa 33 ir konfigurēta, izmantojot zemāk redzamo koda fragmentu kā ārēju modināšanas avotu, kas identificēts kā ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Tālāk, kamēr cilpa-
void loop () { // šeit ievietojiet galveno kodu, lai tas darbotos atkārtoti: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Presed \ n", pushBtn.pin); Serial.printf ("Pārtrauciet 'blinkLed' uzdevumu \ n"); // Pārtrauciet blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Eju gulēt….. \ n", pushBtn.pin); pushBtn.pressed = false; // Ej gulēt tagad esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); slēdzis (wakeupReason) { gadījums ESP_SLEEP_WAKEUP_EXT0: Serial.println ("izmantojot ārējo signālu ext0 WakeUp From sleep"); pārtraukums; gadījums ESP_SLEEP_WAKEUP_EXT1: Serial.println ("ārējā signāla ext1 izmantošana WakeUp From sleep"); pārtraukums; gadījums ESP_SLEEP_WAKEUP_TIMER: Serial.println ("Taimera signāla izmantošana WakeUp From sleep"); pārtraukums; gadījums ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("izmantojot skārienpaliktņa signālu WakeUp From sleep"); pārtraukums; gadījums ESP_SLEEP_WAKEUP_ULP: Serial.println ("izmantojot ULP signālu WakeUp From sleep"); pārtraukums; noklusējums: pārtraukums; Serial.printf ("Atsākt 'blinkLed' uzdevumu \ n"); // restartējiet blinkLed Task vTaskResume (taskBlinkled); } }
Kaut cilne nepārtraukti pārbauda, vai miega poga ir nospiesta vai nē. Ja poga tiek nospiesta, tā pārtrauks vai apturēs LED mirgošanas uzdevumu un palaidīs esp dziļā miega sākuma funkciju-
esp_deep_sleep_start ();
Šajā situācijā, ja tiek nospiesta ext0 ārējā pārtraukšanas poga, tā nekavējoties pamodīsies no dziļā miega režīma un atsāks mirgot ar mirgojošo LED.
Visbeidzot, LED mirgošanas funkcija ir redzama zemāk esošajos fragmentos, tā mirgos LED 1000 ms sekundēs.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // pārslēgt piespraudes vērtību pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "Ieslēgts": "Izslēgts"); / * Vienkārši pārslēdziet LED ik pēc 1000ms vai 1sek * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
ESP32 pārbaude dziļā miega režīmā
Kontūra ir izveidota paneļa dēļā, un strāvas mērīšanai tiek izmantots Metravi XB izdevuma multimetrs. Strāvas ķēde aktīvajā režīmā ir gandrīz 58 mA, bet dziļā miega režīmā strāva ir gandrīz 4,10 mA. Zem attēla redzams ESP32 aktīvā režīma strāvas patēriņš -
Dziļā miega režīmā pašreizējais patēriņš tiek reģistrēts samazināts līdz aptuveni 3.95mA, zemāk redzamajā attēlā parādīts ESP32 dziļā miega režīma strāvas patēriņš-
Tomēr dziļā miega režīmā ESP32 pašreizējais patēriņš ir gandrīz 150 uA. Bet reģistrētais strāvas patēriņš šai ESP32 Devkit plāksnei ir gandrīz 4,10 mA. Tas ir saistīts ar CP2102 un lineāro regulatoru. Šie divi ir savienoti ar 5V elektropārvades līniju. Elektrolīnijā ir pievienots arī strāvas gaismas diode, kas patērē gandrīz 2mA strāvu.
Tādēļ var viegli noteikt, ka ESP32 dziļā miega režīmā patērē ļoti mazu enerģijas daudzumu, kas ir ļoti noderīgi darbībām ar akumulatoru. Lai iegūtu papildinformāciju par to, kā tas darbojās, skatiet zemāk esošo saiti. Ja jums ir kādi jautājumi, atstājiet tos komentāru sadaļā zemāk vai izmantojiet mūsu forumus citiem tehniskiem jautājumiem.