- Cerințe
- Schema circuitului ESP32 Sleep Mode
- Prezentare generală a modurilor de repaus în ESP32
- Programarea ESP32 pentru modul Deep Sleep
- Testarea ESP32 în modul Deep Sleep
ESP32 este unul dintre cele mai populare module de microcontrolere bazate pe Wi-Fi și este o alegere populară în multe aplicații portabile IoT. Este un controler puternic care acceptă programarea Dual Core și are, de asemenea, suport Bluetooth Low Energy (BLE) încorporat, ceea ce îl face o alegere bună pentru aplicații portabile, cum ar fi dispozitivele iBeacon, GPS Trackers, etc., preocuparea majoră este rezerva bateriei. Această copie de rezervă a bateriei poate fi mărită printr-un control mai inteligent asupra unității de microcontroler, așa cum se poate programa ESP32 în modul de repaus în condițiile ideale pentru a crește rezerva bateriei dispozitivului.
În acest proiect, vom verifica consumul curent al unității de microcontroler cu Wi-Fi și Bluetooth compatibil cu ESP32 în modul normal de lucru și modul de repaus profund. De asemenea, vom testa diferența și vom verifica cum să punem ESP32 în modul de somn profund. De asemenea, puteți consulta articolul despre cum să minimizați consumul de energie în microcontrolere pentru alte sfaturi care pot fi utilizate pentru a face designul mult mai eficient din punct de vedere al consumului de energie. În plus, dacă sunteți interesat de modul de repaus al altor microcontrolere, puteți să eliminați modul de repaus Arduino și modul de repaus ESP8266 NodeMCU.
Cerințe
Pentru a face acest lucru, vom folosi ESP32 bazat pe Devkit V4.0 de la Espressif care are USB către UART bridge, precum și alte pinouts ESP32 pentru o conexiune ușoară. Programarea se va face cu Arduino IDE. Dacă sunteți complet nou, atunci pentru Noțiuni introductive despre ESP32 folosind Arduino, citiți articolul legat înainte de a continua.
Cerințele acestui proiect sunt următoarele:
- Acesta va intra în modul de somn profund prin apăsarea unui buton.
- Se va trezi din modul de somn profund prin apăsarea unui alt buton.
- Pentru a detecta starea ESP32, un LED va clipi cu un timp de pornire de 1000 de milisecunde. În timpul modului de repaus, acesta va fi dezactivat.
Prin urmare, sunt necesare componente suplimentare
- LED - 1 buc
- Buton (comutator tactil) - 2 buc
- 4.7k rezistențe - 2 buc
- Rezistor 680R - 1 buc
- Breadboard
- Conectați sârmă
- Adaptor de 5V sau unitate de alimentare
- Un cablu micro-USB
- Arduino IDE cu interfață de programare ESP32 într-un PC sau laptop.
Schema circuitului ESP32 Sleep Mode
Schema de pornire a ESP32 cu butonul este prezentată mai jos.
Schema este destul de simplă. Are două butoane. Butonul de repaus va pune ESP32 în modul de repaus profund și un alt comutator este utilizat pentru trezirea ESP32 din modul de repaus. Ambele butoane sunt conectate în codul PIN 16 și codul 33. Ambele butoane sunt configurate ca active jos când sunt apăsate, de aceea este oferită o extragere suplimentară. Cu toate acestea, pentru a detecta dacă ESP 32 este în modul de repaus sau în modul normal de funcționare, LED-ul este conectat la pinul IO 4.
Prezentare generală a modurilor de repaus în ESP32
Există multe moduri de alimentare diferite pentru ESP32, și anume modul activ, modul modem sleep, modul light sleep, modul deep sleep și modul de hibernare.
În condițiile normale de lucru, ESP32 rulează în modul activ. În timpul modului ESP32 activ, CPU, hardware WiFi / BT, memorie RTC și periferice RTC, coprocesoare ULP, toate sunt activate și funcționează în funcție de volumul de lucru. Cu toate acestea, în diferite moduri de alimentare, unul sau mai multe periferice sunt dezactivate. Pentru a verifica diferite operațiuni ale modului de alimentare, urmați tabelul de mai jos-
Hardware |
Mod activ |
Modem-Mod de repaus |
Mod Light Sleep |
Modul somn profund |
Hibernare |
Procesor |
PE |
PE |
PAUZĂ |
OPRIT |
OPRIT |
WiFi / BT |
PE |
OPRIT |
OPRIT |
OPRIT |
OPRIT |
Periferice RTC și RTC |
PE |
PE |
PE |
PE |
OPRIT |
Procesor ULP-Co |
PE |
PE |
PE |
PORNIT / OPRIT |
OPRIT |
Așa cum putem vedea în tabelul de mai sus, că în modul de somn profund ESP32, care este adesea numit model de monitorizare senzor ULP - CPU, WiFi / BT, memorie RTC și periferice, coprocesoarele ULP sunt oprite. Doar memoria RTC și perifericele RTC sunt activate.
În timpul situației de trezire, ESP32 trebuie să fie notificat de o sursă de trezire care va trezi ESP32 din modul de somn profund. Cu toate acestea, deoarece perifericele RTC sunt activate, ESP32 poate fi trezit prin GPIO-uri activate RTC. Există și alte opțiuni. Poate fi trezit printr-un pin extern de întrerupere a trezirii sau folosind un cronometru pentru a trezi ESP32. În acest proiect, folosim ext0 wakeup pe pinul 33.
Programarea ESP32 pentru modul Deep Sleep
Programul complet poate fi găsit în partea de jos a acestei pagini. Este scris pentru Arduino IDE și, prin urmare, poate fi adaptat cu ușurință la cerințele dvs. Explicația codului este următoarea.
La începutul codului, // Creați o variabilă PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definește Led Pin uint8_t led_pin = GPIO_NUM_4; // definește trezirea pin uint8_t wakeUp_pin = GPIO_NUM_33;
Cele trei linii de mai sus definesc pinul de trezire, pinul LED și pinul modului de repaus.
void setup () { // puneți codul de configurare aici, pentru a rula o dată: // setați portul serial la 115200 Serial.begin (115200); întârziere (1000); // setați pinul pushButton ca intrare cu PinMode intern PullUp (pushBtn.pin, INPUT_PULLUP); // setați handlerul de întrerupere cu pinul Buton în modul Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // setați pinul Led ca ieșire pinMode (led_pin, OUTPUT); // creați o sarcină care va fi executată în funcția blinkLed (), cu prioritate 1 și executată pe nucleul 0 xTaskCreate ( blinkLed, / * Funcția de activitate. * / "blinkLed", / * numele sarcinii. * / 1024 * 2, / * Dimensiunea stivei sarcinii * / NULL, / * parametrul sarcinii * / 5, / * prioritatea sarcinii * / & taskBlinkled); / * Task handle pentru a urmări sarcina creată * / delay (500); // Configurați Pinul 33 ca sursă de trezire ext0 cu nivel logic LOW esp_sleep_enable_ext0_wakeup (((gpio_num_t) wakeUp_pin, 0); }
În cele de mai sus, întreruperea este setată la un mod de scădere de către fragmentul de cod
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Prin urmare, ori de câte ori este apăsat comutatorul, nivelul logic va fi schimbat de la logica 1 (3,3V) la logica 0 (0V). Tensiunea pinului butonului va scădea, iar ESP32 va identifica faptul că comutatorul este apăsat. Există și o sarcină creată pentru a clipi LED-ul.
xTaskCreate ( blinkLed, / * Funcția sarcinii. * / "blinkLed", / * numele sarcinii. * / 1024 * 2, / * Dimensiunea stivei sarcinii * / NULL, / * parametrul sarcinii * / 5, / * prioritate a sarcinii * / & taskBlinkled); / * Task handle pentru a urmări sarcina creată * / delay (500);
Pinul 33 este, de asemenea, configurat folosind fragmentul de cod de mai jos ca sursă externă de trezire identificată ca ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Apoi, în bucla while-
void loop () { // puneți codul principal aici, pentru a rula în mod repetat: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf („Suspendarea sarcinii„ blinkLed ”\ n”); // Suspendați blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Mergi la culcare….. \ n", pushBtn.pin); pushBtn.pressed = false; // Du-te la culcare acum esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println („folosind semnalul extern ext0 pentru WakeUp From sleep”); pauză; cazul ESP_SLEEP_WAKEUP_EXT1: Serial.println ("folosind semnalul extern ext1 pentru WakeUp From sleep"); pauză; cazul ESP_SLEEP_WAKEUP_TIMER: Serial.println ("folosind semnalul Timer pentru WakeUp Din repaus"); pauză; caz ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("folosind semnalul TouchPad pentru WakeUp From sleep"); pauză; cazul ESP_SLEEP_WAKEUP_ULP: Serial.println ("folosind semnalul ULP pentru WakeUp From sleep"); pauză; implicit: pauză; Serial.printf („Reluați sarcina„ blinkLed ”\ n”); // reporniți blinkLed Task vTaskResume (taskBlinkled); } }
Bucla while verifică în mod constant dacă butonul de repaus este apăsat sau nu. Dacă butonul este apăsat, acesta va opri sau suspenda sarcina intermitentă a LED-ului și va rula funcția de pornire profundă a somnului profund-
esp_deep_sleep_start ();
În această situație, dacă butonul de întrerupere extern ext0 este apăsat, acesta se va trezi imediat din modul de repaus profund și va relua sarcina de clipire cu led.
În cele din urmă, funcția LED intermitent poate fi văzută în fragmentele de mai jos, va clipi LED-ul 1000 ms secunde.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // comutați valoarea pin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Pur și simplu comutați LED-ul la fiecare 1000ms sau 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testarea ESP32 în modul Deep Sleep
Circuitul este construit într-o placă de măsurare și un multimetru Metravi XB edition este utilizat pentru a măsura curentul. Curentul tras de circuit în modul activ este de aproape 58 mA, dar în modul de repaus profund, curentul este de aproape 4,10 mA. Imaginea de mai jos prezintă consumul de curent ESP32 activ -
În modul de somn profund, consumul curent este înregistrat scăzut la aproximativ 3,95 mA, imaginea de mai jos arată modul ESP32 Deep Sleep Mode Consum curent-
Cu toate acestea, în modul de somn profund, consumul actual al ESP32 este de aproape 150 uA. Dar consumul curent înregistrat pentru această placă ESP32 Devkit este de aproape 4,10 mA. Acest lucru se datorează CP2102 și regulatorului liniar. Aceste două sunt conectate la linia de alimentare de 5V. Există, de asemenea, un LED de alimentare conectat la linia de alimentare care consumă aproape 2mA de curent.
Prin urmare, se poate identifica cu ușurință faptul că ESP32 consumă o cantitate foarte mică de energie în modul de repaus profund, care este foarte util pentru operațiile alimentate de la baterie. Pentru mai multe informații despre cum a funcționat, consultați videoclipul legat mai jos. Dacă aveți întrebări, lăsați-le în secțiunea de comentarii de mai jos sau utilizați forumurile noastre pentru alte întrebări tehnice.