- Wymagania
- Schemat obwodu trybu uśpienia ESP32
- Przegląd trybów uśpienia w ESP32
- Programowanie ESP32 dla trybu głębokiego uśpienia
- Testowanie ESP32 w trybie głębokiego uśpienia
ESP32 jest jednym z najpopularniejszych modułów mikrokontrolerów opartych na Wi-Fi i jest popularnym wyborem w wielu przenośnych aplikacjach IoT. Jest to potężny kontroler, który obsługuje programowanie dwurdzeniowe, a także ma wbudowaną obsługę Bluetooth Low Energy (BLE), co czyni go dobrym wyborem do zastosowań przenośnych, takich jak urządzenia iBeacon, lokalizatory GPS itp. Jednak w aplikacjach zasilanych z baterii, takich jak te. głównym problemem jest podtrzymanie bateryjne. To podtrzymanie bateryjne może zostać zwiększone poprzez inteligentniejszą kontrolę nad jednostką mikrokontrolera, na przykład można zaprogramować ESP32 w trybie uśpienia w idealnym stanie, aby zwiększyć podtrzymanie bateryjne urządzenia.
W tym projekcie sprawdzimy pobór prądu przez popularną jednostkę mikrokontrolera ESP32 z obsługą Wi-Fi i Bluetooth w normalnym trybie pracy i trybie głębokiego uśpienia. Przetestujemy również różnicę i sprawdzimy, jak wprowadzić ESP32 w tryb głębokiego uśpienia. Możesz również zapoznać się z artykułem o tym, jak zminimalizować zużycie energii w mikrokontrolerach, aby uzyskać inne wskazówki, które można wykorzystać, aby projekt był znacznie bardziej energooszczędny. Ponadto, jeśli interesuje Cię tryb uśpienia innych mikrokontrolerów, możesz również sprawdzić tryb uśpienia Arduino i tryb uśpienia ESP8266 NodeMCU.
Wymagania
Aby to zrobić, użyjemy opartego na ESP32 Devkit V4.0 firmy Espressif, który ma mostek USB do UART, a także inne wyprowadzenia ESP32 dla łatwego połączenia. Programowanie zostanie wykonane za pomocą Arduino IDE. Jeśli jesteś zupełnie nowy, to aby rozpocząć korzystanie z ESP32 przy użyciu Arduino, przeczytaj powiązany artykuł, zanim przejdziesz dalej.
Wymagania tego projektu są następujące:
- Po naciśnięciu przycisku przejdzie w tryb głębokiego uśpienia.
- Wybudzi się z trybu głębokiego uśpienia po naciśnięciu innego przycisku.
- Aby wykryć stan ESP32, dioda LED będzie migać z czasem włączenia 1000 milisekund. W trybie uśpienia zostanie wyłączony.
Dlatego wymagane są dodatkowe komponenty
- LED - 1 szt
- Przycisk (przełącznik dotykowy) - 2 szt
- Rezystory 4,7k - 2 szt
- Rezystor 680R - 1 szt
- Płytka prototypowa
- Podłączyć przewód
- Adapter 5V lub zasilacz
- Kabel micro-USB
- Arduino IDE z interfejsem programowania ESP32 w komputerze PC lub laptopie.
Schemat obwodu trybu uśpienia ESP32
Schemat uśpienia ESP32 przyciskiem jest pokazany poniżej.
Schemat jest dość prosty. Posiada dwa przyciski. Przycisk uśpienia wprowadza ESP32 w tryb głębokiego uśpienia, a inny przełącznik służy do wybudzania ESP32 z trybu uśpienia. Oba przyciski są połączone w PIN 16 i PIN 33. Oba przyciski są skonfigurowane jako aktywne w stanie niskim po naciśnięciu, w związku z czym następuje dodatkowe podciągnięcie. Jednak, aby wykryć, czy ESP 32 jest w trybie uśpienia, czy w trybie normalnych warunków pracy, dioda LED jest podłączona do styku 4 IO.
Przegląd trybów uśpienia w ESP32
Istnieje wiele różnych trybów zasilania dla ESP32, a mianowicie tryb aktywny, tryb uśpienia modemu, tryb uśpienia niewielkiego, tryb głębokiego uśpienia i tryb hibernacji.
W normalnych warunkach pracy ESP32 działa w trybie aktywnym. W trybie aktywnym ESP32, procesor, sprzęt WiFi / BT, pamięć RTC i urządzenia peryferyjne RTC, koprocesory ULP, wszystkie są aktywowane i działają w zależności od obciążenia. Jednak w różnych trybach zasilania jedno lub więcej urządzeń peryferyjnych jest wyłączonych. Aby sprawdzić różne operacje w trybie zasilania, postępuj zgodnie z poniższą tabelą:
Sprzęt komputerowy |
Tryb aktywny |
Tryb uśpienia modemu |
Lekki tryb uśpienia |
Tryb głębokiego uśpienia |
Hibernacja |
procesor |
NA |
NA |
PAUZA |
POZA |
POZA |
WiFi / BT |
NA |
POZA |
POZA |
POZA |
POZA |
Urządzenia peryferyjne RTC i RTC |
NA |
NA |
NA |
NA |
POZA |
Procesor ULP-Co |
NA |
NA |
NA |
ON / OFF |
POZA |
Jak widać w powyższej tabeli, w trybie głębokiego uśpienia ESP32, który jest często nazywany wzorcem monitorowanym przez czujnik ULP - procesor, WiFi / BT, pamięć RTC i urządzenia peryferyjne, koprocesory ULP są wyłączone. Włączona jest tylko pamięć RTC i urządzenia peryferyjne RTC.
Podczas sytuacji wybudzania ESP32 musi zostać powiadomiony przez źródło wybudzenia, które wybudzi ESP32 z trybu głębokiego uśpienia. Jednakże, ponieważ urządzenia peryferyjne RTC są włączone, ESP32 można obudzić za pomocą GPIO z obsługą RTC. Istnieją również inne opcje. Można go obudzić za pomocą zewnętrznych styków przerywania wybudzania lub za pomocą timera do wybudzenia ESP32. W tym projekcie używamy funkcji wybudzania ext0 na pinie 33.
Programowanie ESP32 dla trybu głębokiego uśpienia
Cały program można znaleźć na dole tej strony. Jest napisany dla Arduino IDE i dlatego można go łatwo dostosować do własnych wymagań. Wyjaśnienie kodu jest następujące.
Na początku kodu
// Utwórz zmienną PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // zdefiniuj Pin Led uint8_t led_pin = GPIO_NUM_4; // zdefiniuj pin budzenia uint8_t wakeUp_pin = GPIO_NUM_33;
Powyższe trzy linie definiują pin budzenia, pin diody LED i pin trybu uśpienia.
void setup () { // wpisz tutaj swój kod instalacyjny, aby uruchomić go raz: // ustaw port szeregowy na 115200 Serial.begin (115200); opóźnienie (1000); // ustaw pin pushButton jako wejście z wewnętrznym PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // ustaw obsługę przerwań za pomocą pinezki pushButton w trybie Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // ustaw pin diody LED jako ouput pinMode (led_pin, OUTPUT); // stwórz zadanie, które zostanie wykonane w funkcji blinkLed () z priorytetem 1 i uruchomione na rdzeniu 0 xTaskCreate ( blinkLed, / * Funkcja zadania. * / "blinkLed", / * nazwa zadania. * / 1024 * 2, / * Rozmiar stosu zadania * / NULL, / * parametr zadania * / 5, / * priorytet zadania * / & taskBlinkled); / * Uchwyt zadania do śledzenia utworzonego zadania * / delay (500); // Skonfiguruj Pin 33 jako źródło wybudzania ext0 z NISKIM poziomem logiki esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
W powyższym przypadku przerwanie jest ustawiane w tryb opadania przez fragment kodu
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Dlatego po każdym naciśnięciu przełącznika poziom logiczny zostanie zmieniony z logiki 1 (3,3 V) na logikę 0 (0 V). Napięcie kołka przycisku spadnie, a ESP32 wykryje, że przełącznik jest wciśnięty. Istnieje również zadanie migania diody LED.
xTaskCreate ( blinkLed, / * Funkcja zadania. * / "blinkLed", / * nazwa zadania. * / 1024 * 2, / * Rozmiar stosu zadania * / NULL, / * parametr zadania * / 5, / * priorytet zadania * / & taskBlinkled); / * Uchwyt zadania do śledzenia utworzonego zadania * / delay (500);
Pin 33 jest również skonfigurowany przy użyciu poniższego fragmentu kodu jako zewnętrznego źródła wybudzania identyfikowanego jako ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Następnie w pętli while
void loop () { // umieść tutaj swój główny kod, aby uruchamiał się wielokrotnie: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Zawieś zadanie„ blinkLed "\ n"); // Zawieś blinkLed zadanie vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Idąc spać….. \ n", pushBtn.pin); pushBtn.pressed = false; // Idź teraz spać esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); przełącznik (wakeupReason) { przypadek ESP_SLEEP_WAKEUP_EXT0: Serial.println ("używając zewnętrznego sygnału ext0 dla WakeUp From Sleep"); przerwa; przypadek ESP_SLEEP_WAKEUP_EXT1: Serial.println ("używając zewnętrznego sygnału ext1 dla WakeUp From Sleep"); przerwa; przypadek ESP_SLEEP_WAKEUP_TIMER: Serial.println ("używanie sygnału timera do wybudzania ze snu"); przerwa; przypadek ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("używając sygnału TouchPad do wybudzania ze snu"); przerwa; przypadek ESP_SLEEP_WAKEUP_ULP: Serial.println ("używając sygnału ULP dla WakeUp From sleep"); przerwa; domyślnie: przerwa; Serial.printf ("Wznów zadanie 'blinkLed' \ n"); // zrestartuj blinkLed Task vTaskResume (taskBlinkled); } }
Pętla while stale sprawdza, czy przycisk uśpienia jest wciśnięty, czy nie. Jeśli przycisk zostanie naciśnięty, zatrzyma lub zawiesi zadanie migania diody LED i uruchomi funkcję startu głębokiego snu esp.
esp_deep_sleep_start ();
W tej sytuacji, jeśli zostanie wciśnięty zewnętrzny przycisk przerwania ext0, natychmiast wybudzi się z trybu głębokiego uśpienia i wznowi zadanie migania diody.
Wreszcie, funkcja migania diody LED jest widoczna w poniższych fragmentach, będzie migać diodą LED przez 1000 ms sekund.
void blinkLed (void * param) { while (1) { statyczny uint32_t pin_val = 0; // przełącz wartość pinu pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Po prostu przełączaj diodę LED co 1000 ms lub 1 s * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testowanie ESP32 w trybie głębokiego uśpienia
Obwód jest zbudowany w płytce prototypowej, a do pomiaru prądu służy multimetr Metravi XB. Prąd pobierany przez obwód w trybie aktywnym wynosi prawie 58 mA, ale w trybie głębokiego uśpienia wynosi prawie 4,10 mA. Poniższy obraz pokazuje pobór prądu w trybie aktywnym ESP32 -
W trybie głębokiego uśpienia rejestrowany pobór prądu spada do około 3,95 mA, poniższy obraz przedstawia pobór prądu w trybie głębokiego uśpienia ESP32
Jednak w trybie głębokiego uśpienia pobór prądu przez ESP32 wynosi prawie 150 uA. Ale zarejestrowany pobór prądu dla tej płyty Devkit ESP32 wynosi prawie 4,10 mA. Wynika to z CP2102 i regulatora liniowego. Te dwa są podłączone do linii zasilającej 5 V. W linii zasilającej jest również podłączona dioda LED mocy, która pobiera prawie 2 mA prądu.
Dlatego można łatwo zidentyfikować, że ESP32 zużywa bardzo małą ilość energii w stanie głębokiego uśpienia, co jest bardzo przydatne w przypadku operacji zasilanych z baterii. Aby uzyskać więcej informacji o tym, jak to działało, obejrzyj film, do którego link znajduje się poniżej. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej lub skorzystaj z naszych forów, aby uzyskać odpowiedzi na inne pytania techniczne.