- Krav
- ESP32 Kretsschema för viloläge
- Översikt över vilolägen i ESP32
- Programmering ESP32 för djupt viloläge
- Testar ESP32 i djupt viloläge
ESP32 är en av de mest populära Wi-Fi-baserade mikrokontroller-modulerna och det är ett populärt val i många bärbara IoT-applikationer. Det är en kraftfull styrenhet som stöder Dual Core-programmering och har även inbyggt Bluetooth Low Energy-stöd (BLE) vilket gör det till ett bra val för bärbara applikationer som i iBeacon-enheter, GPS-spårare etc. Men i batteridrivna applikationer som dessa, det största problemet är backup av batteriet. Denna batteribackup kan ökas genom smartare kontroll över mikrokontrollenheten, som om man kan programmera ESP32 i viloläge under det perfekta tillståndet för att öka batteribackupen på enheten.
I det här projektet kommer vi att kontrollera den nuvarande förbrukningen av allmänt populära Wi-Fi- och Bluetooth-aktiverade mikrokontroller ESP32 i normalt arbetsläge och djupt viloläge. Vi kommer också att testa skillnaden och kontrollera hur man sätter ESP32 i djupt viloläge. Du kan också kolla in artikeln om hur du minimerar strömförbrukningen i mikrokontroller för andra tips som kan användas för att göra din design mycket mer energieffektiv. Dessutom, om du är intresserad av andra mikrokontrollers viloläge kan du också ta bort Arduino Sleep-läge och ESP8266 NodeMCU Sleep-läge.
Krav
För att göra detta kommer vi att använda ESP32-baserade Devkit V4.0 från Espressif som har USB till UART bridge samt andra ESP32 pinouts för enkel anslutning. Programmeringen kommer att göras med Arduino IDE. Om du är helt ny, läs den länkade artikeln innan du fortsätter för att komma igång med ESP32 med Arduino.
Kraven i detta projekt är följande:
- Det går in i djupt viloläge genom att trycka på en knapp.
- Det kommer att vakna från djupt viloläge genom att trycka på en annan knapp.
- För att upptäcka tillståndet för ESP32 blinkar en lysdiod med en påslagningstid på 1000 millisekunder. Under viloläget stängs den av.
Därför krävs ytterligare komponenter-
- LED - 1 st
- Tryckknapp (taktil strömbrytare) - 2 st
- 4,7 k motstånd - 2 st
- 680R motstånd - 1 st
- Bakbord
- Anslut vajern
- 5V-adapter eller strömförsörjningsenhet
- En mikro-USB-kabel
- Arduino IDE med ESP32 programmeringsgränssnitt i en PC eller bärbar dator.
ESP32 Kretsschema för viloläge
Schemat för att sätta ESP32 i viloläge med tryckknapp visas nedan.
Schemat är ganska enkelt. Den har två knappar. Sömnknappen sätter ESP32 i djupt viloläge och en annan brytare används för att väcka ESP32 från viloläge. Båda knapparna är anslutna i PIN 16 och PIN 33. Båda knapparna är konfigurerade som aktiva lågt när de trycks in, därför ges en extra pull-up. Men för att upptäcka om ESP 32 är i viloläge eller normalt arbetsläge är LED ansluten till IO-stift 4.
Översikt över vilolägen i ESP32
Det finns många olika strömlägen för ESP32, nämligen aktivt läge, modem viloläge, lätt viloläge, djupt viloläge och viloläge.
Under normalt arbetsförhållande körs ESP32 i aktivt läge. Under ESP32-aktivt läge är CPU, WiFi / BT-maskinvara, RTC-minne och RTC-kringutrustning, ULP-processorer, alla aktiverade och fungerar beroende på arbetsbelastningen. Men på olika strömlägen är en eller flera kringutrustningar avstängda. Följ tabellen nedan för att kontrollera olika driftlägen:
Hårdvara |
Aktivt läge |
Modem-viloläge |
Lätt viloläge |
Djupt viloläge |
Viloläge |
CPU |
PÅ |
PÅ |
PAUS |
AV |
AV |
WiFi / BT |
PÅ |
AV |
AV |
AV |
AV |
RTC- och RTC-kringutrustning |
PÅ |
PÅ |
PÅ |
PÅ |
AV |
ULP-Co-processor |
PÅ |
PÅ |
PÅ |
PÅ AV |
AV |
Som vi kan se i ovanstående tabell att i ESP32 djupt viloläge som ofta kallas ULP-sensorövervakat mönster - CPU, WiFi / BT, RTC-minne och kringutrustning, är alla ULP-processorer avstängda. Endast RTC-minne och RTC-kringutrustning är på.
Under väckningssituationen måste ESP32 meddelas av en väckarkälla som kommer att väcka ESP32 från djupt viloläge. Eftersom RTC-kringutrustningen är påslagen kan ESP32 dock väckas genom RTC-aktiverade GPIO: er. Det finns också andra alternativ. Det kan vara att vakna genom en extern väckningsavbrottsstift eller använda en timer för att väcka ESP32. I det här projektet använder vi ext0 wakeup på pin 33.
Programmering ESP32 för djupt viloläge
Hela programmet finns längst ner på denna sida. Den är skriven för Arduino IDE och kan därför enkelt anpassas till dina behov. Förklaringen till koden är som följer.
I början av koden, // Skapa en PushButton-variabel PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definiera Led Pin uint8_t led_pin = GPIO_NUM_4; // definiera wake up pin uint8_t wakeUp_pin = GPIO_NUM_33;
Ovanstående tre rader definierar wake-up pin, LED pin och sleep mode pin.
ogiltig inställning () { // placera din installationskod här, för att köra en gång: // ställ in seriell port på 115200 Serial.begin (115200); fördröjning (1000); // ställa in tryckknappsstiftet som ingång med intern PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // ställ in Interrupt-hanteraren med tryckknappen i fallande läge attachInterrupt (pushBtn.pin, isr_handle, FALLING); // ställa in Led-stift som ouput pinMode (led_pin, OUTPUT); // skapa en uppgift som kommer att utföras i blinkLed () -funktionen, med prioritet 1 och körs på kärnan 0 xTaskCreate ( blinkLed, / * Task-funktion. * / "blinkLed", / * uppgiftsnamn. * / 1024 * 2, / * Stapelstorlek för uppgift * / NULL, / * parameter för uppgiften * / 5, / * prioritet för uppgiften * / & taskBlinkled); / * Aktivitetshandtag för att hålla reda på skapad uppgift * / fördröjning (500); // Konfigurera Pin 33 som ext0 wake up source med LOW logic level esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
I ovanstående är avbrottet inställt på ett fallande läge genom kodavsnittet
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Därför, närhelst omkopplaren trycks in ändras logiknivån från logik 1 (3,3V) till logisk 0 (0V). Knappstiftets spänning kommer att sjunka och ESP32 kommer att identifiera att omkopplaren trycks in. Det finns också en uppgift som ska blinka lysdioden.
xTaskCreate ( blinkLed, / * Aktivitetsfunktion. * / "blinkLed", / * uppgiftsnamn. * / 1024 * 2, / * Stackstorlek för uppgift * / NULL, / * parameter för uppgiften * / 5, / * prioritet av uppgiften * / & taskBlinkled); / * Aktivitetshandtag för att hålla reda på skapad uppgift * / fördröjning (500);
Stiftet 33 är också konfigurerat med hjälp av nedanstående kodavsnitt som en extern väckningskälla identifierad som ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Därefter, under stundslingan
void loop () { // placera din huvudkod här för att köra upprepade gånger: om (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Avbryt uppgiften" blinkLed "\ n"); // Stäng av blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Sova….. \ n", pushBtn.pin); pushBtn.pressed = false; // Gå och sova nu 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 ("använder extern signal ext0 för WakeUp From sleep"); ha sönder; case ESP_SLEEP_WAKEUP_EXT1: Serial.println ("använder extern signal ext1 för WakeUp From sleep"); ha sönder; case ESP_SLEEP_WAKEUP_TIMER: Serial.println ("använder timersignal för WakeUp från viloläge"); ha sönder; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("använder TouchPad-signal för WakeUp från viloläge"); ha sönder; case ESP_SLEEP_WAKEUP_ULP: Serial.println ("använder ULP-signal för WakeUp From sleep"); ha sönder; standard: bryta; Serial.printf ("Återuppta uppgiften" blinkLed "\ n"); // starta om blinkLed Task vTaskResume (taskBlinkled); } }
While-slingan kontrollerar ständigt om sömnknappen trycks ned eller inte. Om du trycker på knappen kommer den att stoppa eller avbryta LED-blinkningsuppgiften och köra esp deep sleep start-funktionen-
esp_deep_sleep_start ();
I den här situationen, om den externa avbrytarknappen ext0 trycks, vaknar den omedelbart från djupt viloläge och återupptar den blinkande uppgiften.
Slutligen kan LED-blinkfunktionen ses i nedanstående utdrag, den kommer att blinka LED 1000 ms sekunder.
ogiltig blinkLed (ogiltig * param) { medan (1) { statisk uint32_t pin_val = 0; // växla stiftvärdet pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "På": "Av"); / * Växla helt enkelt lampan var 1000: e eller 1 sekund * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testar ESP32 i djupt viloläge
Kretsen är konstruerad i en brädbräda och en Metravi XB-multimeter används för att mäta strömmen. Strömmen som dras av kretsen i aktivt läge är nästan 58 mA men i djupt viloläge är strömmen nästan 4,10 mA. Bilden nedan visar ESP32 aktivt läge strömförbrukning -
I djupt viloläge registreras strömförbrukningen till cirka 3,95 mA, nedanstående bild visar strömförbrukningen för ESP32 djupt viloläge-
I djupt viloläge är ESP32s nuvarande förbrukning dock nästan 150 uA. Men den inspelade strömförbrukningen för detta ESP32 Devkit-kort är nästan 4,10 mA. Detta beror på CP2102 och Linear Regulator. Dessa två är anslutna till 5V-kraftledningen. Det finns också en strömlampa ansluten i kraftledningen som förbrukar nästan 2 mA ström.
Därför kan det lätt identifieras att ESP32 förbrukar mycket låg energi i djupt viloläge, vilket är mycket användbart för batteridrivna operationer. För mer information om hur det fungerade, kolla in videon som länkas nedan. Om du har några frågor lämnar du dem i kommentarfältet nedan eller använder våra forum för andra tekniska frågor.