- Requisits
- ESP32 Diagrama del circuit del mode de repòs
- Descripció general dels modes de repòs a ESP32
- Programació ESP32 per al mode de son profund
- Provant ESP32 en mode Deep Sleep
ESP32 és un dels mòduls de microcontroladors basats en Wi-Fi més populars i és una opció popular en moltes aplicacions IoT portàtils. És un potent controlador que admet la programació de doble nucli i també té suport Bluetooth de baixa energia (BLE) integrat, cosa que el converteix en una bona opció per a aplicacions portàtils, com en dispositius iBeacon, rastrejadors GPS, etc. No obstant això, en aplicacions amb bateria com aquestes, la principal preocupació és la còpia de seguretat de la bateria. Aquesta còpia de seguretat de la bateria es pot augmentar mitjançant un control més intel·ligent sobre la unitat de microcontroladors, de la mateixa manera que es pot programar ESP32 en mode de repòs durant les condicions ideals per augmentar la còpia de seguretat de la bateria del dispositiu.
En aquest projecte, comprovarem el consum actual de la famosa unitat de microcontroladors habilitats per Wi-Fi i Bluetooth ESP32 en mode de treball normal i mode de repòs profund. A més, provarem la diferència i comprovarem com posar l’ESP32 en mode de repòs profund. També podeu consultar l'article sobre com minimitzar el consum d'energia dels microcontroladors per obtenir altres consells que poden fer que el vostre disseny sigui molt més eficient. A més, si esteu interessats en el mode de repòs d'altres microcontroladors, també podeu descarregar el mode de repòs Arduino i el mode de repòs ESP8266 NodeMCU.
Requisits
Per fer-ho, utilitzarem el Devkit V4.0 basat en ESP32 d'Espressif que té pont USB a UART, així com altres pinouts ESP32 per facilitar la connexió. La programació es farà amb Arduino IDE. Si sou completament nou, llegiu l'article enllaçat per començar a utilitzar ESP32 amb Arduino abans de continuar.

Els requisits d’aquest projecte són els següents:
- Si premeu un botó, passarà al mode de repòs profund.
- Es despertarà del mode de son profund prement un altre botó.
- Per detectar l’estat de l’ESP32, un LED parpellejarà amb un temps d’activació de 1000 mil·lisegons. Durant el mode de repòs, estarà desactivat.
Per tant, es requereixen components addicionals
- LED - 1 unitat
- Polsador (interruptor tàctil): 2 unitats
- Resistències de 4,7 k: 2 unitats
- Resistència 680R - 1 unitat
- Taula de pa
- Connecteu filferro
- Adaptador de 5V o font d'alimentació
- Un cable micro-USB
- IDE Arduino amb interfície de programació ESP32 en un PC o portàtil.
ESP32 Diagrama del circuit del mode de repòs
A continuació es mostra l’esquema per posar l’SP32 a dormir amb el polsador.

L’esquema és força senzill. Té dos botons. El botó de repòs posarà l’ESP32 en mode de repòs profund i s’utilitzarà un altre commutador per despertar l’ESP32 des del mode de repòs. Els dos botons estan connectats al PIN 16 i al PIN 33. Tots dos botons es configuren com a actius baixos quan es premen, per tant es proporciona un desplegament addicional. Tanmateix, per detectar si l’ESP 32 està en mode de suspensió o en mode de treball normal, el LED està connectat al pin IO 4.
Descripció general dels modes de repòs a ESP32
Hi ha molts modes d’alimentació diferents per a ESP32, és a dir , el mode actiu, el mode de suspensió del mòdem, el mode de repòs lleuger, el mode de repòs profund i el mode d’hibernació.
Durant les condicions normals de treball, l'ESP32 funciona en mode actiu. Durant el mode actiu ESP32, la CPU, el maquinari WiFi / BT, la memòria RTC i els perifèrics RTC, coprocessadors ULP, s’activen i funcionen en funció de la càrrega de treball. No obstant això, en diferents modes d'alimentació, un o més perifèrics estan apagats. Per comprovar diferents operacions del mode de potència, seguiu la taula següent:
|
Maquinari |
Mode actiu |
Mode mòdem-repòs |
Mode de son lleuger |
Mode de son profund |
Hibernació |
|
CPU |
ACTIVAT |
ACTIVAT |
PAUSA |
DESACTIVAT |
DESACTIVAT |
|
WiFi / BT |
ACTIVAT |
DESACTIVAT |
DESACTIVAT |
DESACTIVAT |
DESACTIVAT |
|
Perifèrics RTC i RTC |
ACTIVAT |
ACTIVAT |
ACTIVAT |
ACTIVAT |
DESACTIVAT |
|
Processador ULP-Co |
ACTIVAT |
ACTIVAT |
ACTIVAT |
ON / OFF |
DESACTIVAT |
Com podem veure a la taula anterior, en el mode de son profund ESP32 que sovint s’anomena patró de sensor ULP: la CPU, WiFi / BT, memòria RTC i perifèrics, els coprocessadors ULP estan apagats. Només la memòria RTC i els perifèrics RTC estan activats.
Durant la situació de despertador, l’ESP32 ha de ser notificat per una font de despertador que desperti l’ESP32 des del mode de son profund. Tanmateix, atès que els perifèrics RTC estan activats, l'ESP32 es pot despertar mitjançant GPIOs habilitats per a RTC. També hi ha altres opcions. Pot despertar-se mitjançant un pin d'interrupció de despertar extern o utilitzar un temporitzador per activar l'ESP32. En aquest projecte, utilitzem ext0 wakeup al pin 33.
Programació ESP32 per al mode de son profund
El programa complet es troba a la part inferior d’aquesta pàgina. Està escrit per Arduino IDE i, per tant, es pot adaptar fàcilment a les vostres necessitats. L’explicació del codi és la següent.
Al principi del codi, // Crea una variable PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // defineix Led Pin uint8_t led_pin = GPIO_NUM_4; // defineix el pin de despertador uint8_t wakeUp_pin = GPIO_NUM_33;
Les tres línies anteriors defineixen el pin de despertador, el pin LED i el pin del mode de repòs.
void setup () { // poseu aquí el vostre codi de configuració per executar-lo una vegada: // configureu el port sèrie a 115200 Serial.begin (115200); retard (1000); // configureu el pin pushButton com a entrada amb PinMode intern PullUp (pushBtn.pin, INPUT_PULLUP); // configureu el controlador d'interrupcions amb el pin pushButton en mode Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // configureu el pin Led com a pin pin Mode (led_pin, OUTPUT); // creeu una tasca que s'executarà a la funció blinkLed (), amb prioritat 1 i s'executarà al nucli 0 xTaskCreate ( blinkLed, / * Funció de tasca. * / "blinkLed", / * nom de la tasca. * / 1024 * 2, / * Mida de la pila de la tasca * / NULL, / * paràmetre de la tasca * / 5, / * prioritat de la tasca * / & taskBlinkled); / * Gestor de tasques per fer un seguiment de la tasca creada * / delay (500); // Configureu el Pin 33 com a font de despertar ext0 amb nivell lògic BAIX esp_sleep_enable_ext0_wakeup (((gpio_num_t) wakeUp_pin, 0); }
A l’anterior, el fragment de codi defineix la interrupció en un mode descendent
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Per tant, sempre que es prem l’interruptor, el nivell lògic canviarà de lògica 1 (3,3V) a lògica 0 (0V). La tensió del pin del botó caurà i l’ESP32 identificarà que es pressiona l’interruptor. També hi ha una tasca creada per parpellejar el LED.
xTaskCreate ( blinkLed, / * Funció de tasca. * / "blinkLed", / * nom de la tasca. * / 1024 * 2, / * Mida de la pila de la tasca * / NULL, / * paràmetre de la tasca * / 5, / * prioritat de la tasca * / & taskBlinkled); / * Gestor de tasques per fer un seguiment de la tasca creada * / delay (500);
El pin 33 també es configura mitjançant el fragment de codi següent com a font de despertador extern identificat com ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
A continuació, al bucle while-
void loop () { // posa aquí el teu codi principal per executar-lo repetidament: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Suspendre la tasca 'blinkLed' \ n"); // Suspendre la tasca blinkLed vTaskSuspend (taskBlinkled); digitalWrite (led_pin, BAIX); Serial.printf ("Anar a dormir….. \ n", pushBtn.pin); pushBtn.pressed = fals; // Anar a dormir ara 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 ("utilitzant el senyal extern ext0 per a WakeUp From sleep"); trencar; cas ESP_SLEEP_WAKEUP_EXT1: Serial.println ("utilitzant el senyal extern ext1 per a WakeUp From sleep"); trencar; cas ESP_SLEEP_WAKEUP_TIMER: Serial.println ("utilitzant el senyal del temporitzador per a WakeUp From sleep"); trencar; cas ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("utilitzant el senyal TouchPad per a WakeUp From sleep"); trencar; cas ESP_SLEEP_WAKEUP_ULP: Serial.println ("utilitzant el senyal ULP per WakeUp From sleep"); trencar; per defecte: trencar; Serial.printf ("Reprèn la tasca 'blinkLed' \ n"); // reinicieu la tasca blinkLed vTaskResume (taskBlinkled); } }
El bucle while comprova constantment si es prem o no el botó de repòs. Si es prem el botó, s’aturarà o es suspendrà la tasca de parpelleig del LED i s’executarà la funció d’inici de son profund.
esp_deep_sleep_start ();
En aquesta situació, si es prem el botó d’interrupció externa ext0, es despertarà immediatament del mode de repòs profund i reprendrà la tasca de parpelleig del LED.
Per últim, la funció de parpelleig del LED es pot veure als fragments següents: parpellejarà el LED de 1000 ms segons.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // canvieu el valor del pin pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Simplement canvieu el LED cada 1000 ms o 1 segon * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Provant ESP32 en mode Deep Sleep
El circuit està construït en una taula de treball i es fa servir un multímetre Metravi XB edition per mesurar el corrent. El corrent extret pel circuit en mode actiu és de gairebé 58 mA, però en mode de repòs profund, el corrent és de gairebé 4,10 mA. A la imatge següent es mostra el consum actual del mode actiu ESP32 -

En el mode de son profund, el consum actual es registra a uns 3,95 mA, la imatge següent mostra el mode actual de son profund ESP32 Consum actual:
No obstant això, en mode de repòs profund, el consum actual de l'ESP32 és de gairebé 150 uA. Però el consum actual registrat per a aquesta placa ESP32 Devkit és de gairebé 4,10 mA. Això es deu al CP2102 i al regulador lineal. Aquests dos estan connectats a la línia elèctrica de 5V. També hi ha un LED d'alimentació connectat a la línia elèctrica que consumeix gairebé 2 mA de corrent.
Per tant, es pot identificar fàcilment que l’ESP32 consumeix una quantitat d’energia molt baixa en mode de repòs profund que és molt útil per a operacions amb bateria. Per obtenir més informació sobre el seu funcionament, consulteu el vídeo enllaçat a continuació. Si teniu cap pregunta, deixeu-les a la secció de comentaris a continuació o utilitzeu els nostres fòrums per a altres qüestions tècniques.
