- Vereisten
- Schakelschema ESP32 slaapmodus
- Overzicht van slaapmodi in ESP32
- ESP32 programmeren voor diepe slaapmodus
- ESP32 testen in diepe slaapmodus
ESP32 is een van de meest populaire op Wi-Fi gebaseerde microcontrollermodules en het is een populaire keuze in veel draagbare IoT-toepassingen. Het is een krachtige controller die Dual Core Programming ondersteunt en ook ingebouwde Bluetooth Low Energy (BLE) -ondersteuning, waardoor het een goede keuze is voor draagbare toepassingen zoals in iBeacon-apparaten, GPS-trackers, enz. Echter, in batterijgevoede toepassingen zoals deze is de grootste zorg de batterijback-up. Deze batterijback-up kan worden verhoogd door slimmere controle over de microcontrollereenheid, zoals men de ESP32 in de slaapmodus kan programmeren tijdens de ideale omstandigheden om de batterijback-up van het apparaat te vergroten.
In dit project zullen we het huidige verbruik van de zeer populaire Wi-Fi- en Bluetooth-compatibele microcontroller ESP32 in de normale werkmodus en diepe slaapmodus controleren. We zullen ook het verschil testen en kijken hoe we de ESP32 in diepe slaapstand kunnen zetten. U kunt ook het artikel lezen over hoe u het stroomverbruik in microcontrollers kunt minimaliseren voor andere tips die kunnen worden gebruikt om uw ontwerp veel energiezuiniger te maken. Als je bovendien geïnteresseerd bent in de slaapmodus van andere microcontrollers, kun je ook de Arduino-slaapmodus en ESP8266 NodeMCU-slaapmodus kiezen.
Vereisten
Om dit te doen, gebruiken we op ESP32 gebaseerde Devkit V4.0 van Espressif met een USB-naar-UART-brug en andere ESP32-pinouts voor eenvoudige verbinding. De programmering wordt gedaan met Arduino IDE. Als je helemaal nieuw bent, lees dan voor Aan de slag met ESP32 met Arduino het gelinkte artikel voordat je verder gaat.
De vereisten van dit project zijn de volgende-
- Met een druk op de knop gaat hij in de diepe slaapstand.
- Het zal ontwaken uit de diepe slaapstand door op een andere knop te drukken.
- Om de toestand van de ESP32 te detecteren, knippert een LED met een inschakeltijd van 1000 milliseconden. Tijdens de slaapmodus wordt het uitgeschakeld.
Daarom zijn aanvullende componenten vereist-
- LED - 1 stuk
- Drukknop (tactiele schakelaar) - 2 st
- 4.7k weerstanden - 2 st
- 680R-weerstand - 1 st
- Breadboard
- Sluit de draad aan
- 5V adapter of voedingseenheid
- Een micro-USB-kabel
- Arduino IDE met ESP32-programmeerinterface in een pc of laptop.
Schakelschema ESP32 slaapmodus
Het schema om ESP32 in slaap te brengen met drukknop wordt hieronder weergegeven.
Het schema is vrij eenvoudig. Het heeft twee knoppen. De slaapknop zet de ESP32 in de diepe slaapstand en een andere schakelaar wordt gebruikt om de ESP32 uit de slaapstand te halen. Beide knoppen zijn verbonden in PIN 16 en PIN 33. Beide knoppen zijn geconfigureerd als actief laag wanneer ze worden ingedrukt, daarom wordt er een extra pull-up gegeven. Om echter te detecteren of de ESP 32 zich in de slaapmodus of in de normale werkconditiemodus bevindt, is LED verbonden met IO Pin 4.
Overzicht van slaapmodi in ESP32
Er zijn veel verschillende energiemodi voor ESP32, namelijk actieve modus, modem-slaapmodus, lichte slaapmodus, diepe slaapmodus en sluimerstand.
Tijdens de normale werkconditie werkt de ESP32 in de actieve modus. Tijdens de actieve ESP32-modus worden de CPU, WiFi / BT-hardware, RTC-geheugen en RTC-randapparatuur, ULP-co-processors, allemaal geactiveerd en werken ze afhankelijk van de werklast. Bij verschillende energiemodi zijn een of meer randapparatuur echter uitgeschakeld. Volg de onderstaande tabel om de verschillende werkingsmodi te controleren:
Hardware |
Actieve modus |
Modem-slaapmodus |
Lichte slaapstand |
Diepe slaapmodus |
Winterslaap |
processor |
AAN |
AAN |
PAUZE |
UIT |
UIT |
WiFi / BT |
AAN |
UIT |
UIT |
UIT |
UIT |
RTC- en RTC-randapparatuur |
AAN |
AAN |
AAN |
AAN |
UIT |
ULP-Co-processor |
AAN |
AAN |
AAN |
AAN UIT |
UIT |
Zoals we in de bovenstaande tabel kunnen zien, zijn in de ESP32 diepe slaapmodus, die vaak wordt genoemd als ULP-sensorbewaakt patroon - de CPU, WiFi / BT, RTC-geheugen en randapparatuur, ULP-co-processors allemaal uitgeschakeld. Alleen het RTC-geheugen en RTC-randapparatuur zijn ingeschakeld.
Tijdens de ontwaaksituatie moet de ESP32 worden gewaarschuwd door een wekbron die de ESP32 uit de diepe slaapstand haalt. Aangezien de RTC-randapparatuur is ingeschakeld, kan de ESP32 echter worden gewekt via RTC-geactiveerde GPIO's. Er zijn ook andere opties. Het kan worden gewekt door een externe ontwaakonderbrekingspennen of door een timer te gebruiken om de ESP32 wakker te maken. In dit project gebruiken we ext0 wakeup op pin 33.
ESP32 programmeren voor diepe slaapmodus
Het volledige programma vindt u onderaan deze pagina. Het is geschreven voor Arduino IDE en kan daarom gemakkelijk worden aangepast aan uw vereisten. De uitleg van de code is als volgt.
Aan het begin van de code, // Maak een PushButton-variabele PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definieer Led Pin uint8_t led_pin = GPIO_NUM_4; // definieer wake up pin uint8_t wakeUp_pin = GPIO_NUM_33;
De bovenstaande drie regels definiëren de wake-up-pin, LED-pin en de slaapmodus-pin.
void setup () { // plaats hier je setup-code, om een keer uit te voeren: // stel de seriële poort in op 115200 Serial.begin (115200); vertraging (1000); // stel de pushButton-pin in als invoer met interne PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // zet de Interrupt handler met de pushButton pin in Falling mode attachInterrupt (pushBtn.pin, isr_handle, FALLING); // stel de led-pin in als output pinMode (led_pin, OUTPUT); // maak een taak die zal worden uitgevoerd in de blinkLed () functie, met prioriteit 1 en uitgevoerd op core 0 xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * naam van de taak. * / 1024 * 2, / * Stapelgrootte van taak * / NULL, / * parameter van de taak * / 5, / * prioriteit van de taak * / & taskBlinkled); / * Taakgreep om de gemaakte taak bij te houden * / delay (500); // Configureer Pin 33 als ext0 wake up source met LOW logic level esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
In het bovenstaande wordt de onderbreking door het codefragment in een dalende modus gezet
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Daarom, telkens wanneer de schakelaar wordt ingedrukt, wordt het logische niveau gewijzigd van logisch 1 (3.3V) naar logisch 0 (0V). De spanning van de knooppen zal dalen en de ESP32 zal identificeren dat de schakelaar is ingedrukt. Er is ook een taak gemaakt om de LED te laten knipperen.
xTaskCreate ( blinkLed, / * Taakfunctie. * / "blinkLed", / * naam van de taak. * / 1024 * 2, / * Stapelgrootte van taak * / NULL, / * parameter van de taak * / 5, / * prioriteit van de taak * / & taskBlinkled); / * Taakgreep om de gemaakte taak bij te houden * / delay (500);
De pin 33 is ook geconfigureerd met behulp van het onderstaande codefragment als een externe wekbron geïdentificeerd als ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Vervolgens, in de while-lus
void loop () { // plaats je hoofdcode hier, om herhaaldelijk te draaien: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Onderbreek de 'blinkLed'-taak \ n"); // Onderbreek de blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("In slaap vallen….. \ n", pushBtn.pin); pushBtn.pressed = false; // Ga nu slapen 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 ("gebruikt extern signaal ext0 voor WakeUp uit slaapstand"); breken; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("gebruikt extern signaal ext1 voor WakeUp From sleep"); breken; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("gebruikt timersignaal voor WakeUp uit slaapstand"); breken; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("gebruikt TouchPad-signaal voor WakeUp uit slaapstand"); breken; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("gebruikt ULP-signaal voor WakeUp uit slaapstand"); breken; standaard: pauze; Serial.printf ("Hervat de 'blinkLed'-taak \ n"); // herstart de blinkLed Task vTaskResume (taskBlinkled); } }
De while-lus controleert constant of de slaapknop is ingedrukt of niet. Als de knop wordt ingedrukt, wordt de LED-knipper-taak gestopt of onderbroken en wordt de functie diepe slaapstart uitgevoerd.
esp_deep_sleep_start ();
Als in deze situatie op de externe onderbrekingsknop ext0 wordt gedrukt, wordt deze onmiddellijk wakker uit de diepe slaapmodus en hervat de taak met het knipperen van de led.
Ten slotte is de LED-knipperfunctie te zien in de onderstaande fragmenten, het zal de LED 1000 ms seconden laten knipperen.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // schakel de pin-waarde pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Schakel eenvoudig de LED om de 1000ms of 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
ESP32 testen in diepe slaapmodus
Het circuit is gebouwd in een breadboard en een Metravi XB-editie-multimeter wordt gebruikt om de stroom te meten. De stroom die door het circuit wordt getrokken in actieve modus is bijna 58 mA, maar in diepe slaapmodus is de stroom bijna 4,10 mA. De onderstaande afbeelding toont het stroomverbruik van de ESP32 in actieve modus -
In de diepe slaapmodus wordt het stroomverbruik gedaald tot ongeveer 3,95 mA, de onderstaande afbeelding toont het huidige verbruik van de ESP32 diepe slaapmodus-
In de diepe slaapstand is het stroomverbruik van de ESP32 echter bijna 150 uA. Maar het geregistreerde stroomverbruik voor dit ESP32 Devkit-bord is bijna 4,10 mA. Dit komt door de CP2102 en de lineaire regelaar. Deze twee zijn aangesloten op de 5V-voedingslijn. Er is ook een power-LED aangesloten in de voedingslijn die bijna 2mA stroom verbruikt.
Daarom kan gemakkelijk worden vastgesteld dat de ESP32 een zeer lage hoeveelheid energie verbruikt in de diepe slaapstand, wat erg handig is voor gebruik op batterijen. Bekijk de onderstaande video voor meer informatie over hoe het werkte. Als je vragen hebt, laat ze dan achter in het commentaargedeelte hieronder of gebruik onze forums voor andere technische vragen.