- Изисквания
- Електрическа схема на режим на заспиване ESP32
- Преглед на режимите на заспиване в ESP32
- Програмиране на ESP32 за режим на дълбок сън
- Тестване на ESP32 в режим на дълбоко заспиване
ESP32 е един от най-популярните модули за микроконтролер, базиран на Wi-Fi и е популярен избор в много преносими IoT приложения. Това е мощен контролер, който поддържа двуядрено програмиране и също така има вградена поддръжка за Bluetooth с ниска енергия (BLE), което го прави добър избор за преносими приложения като в устройства iBeacon, GPS тракери и др., основната грижа е архивирането на батерията. Това архивиране на батерията може да бъде увеличено чрез по-интелигентен контрол върху микроконтролера, както може да се програмира ESP32 в режим на заспиване по време на идеалното състояние за увеличаване на резервното копие на батерията на устройството.
В този проект ще проверим текущата консумация на широко популярния Wi-Fi и Bluetooth с активиран микроконтролер ESP32 в нормален работен режим и режим на дълбок сън. Също така ще тестваме разликата и ще проверим как да поставим ESP32 в режим на дълбок сън. Можете също така да разгледате статията за това как да сведете до минимум консумацията на енергия в микроконтролери за други съвети, които могат да бъдат използвани, за да направят вашия дизайн много по-енергийно ефективен. Освен това, ако се интересувате от режим на заспиване на други микроконтролери, можете да изпробвате и режим на заспиване Arduino и режим на заспиване ESP8266 NodeMCU.
Изисквания
За целта ще използваме базиран на ESP32 Devkit V4.0 от Espressif, който има USB към UART мост, както и други ESP32 пиноти за лесно свързване. Програмирането ще се извършва с Arduino IDE. Ако сте напълно нови, тогава за Първи стъпки с ESP32 с помощта на Arduino прочетете свързаната статия, преди да продължите.
Изискванията на този проект са следните -
- Той ще премине в режим на дълбок сън с натискане на бутон.
- Той ще се събуди от режим на дълбок сън с натискане на друг бутон.
- За да открие състоянието на ESP32, светодиодът ще мига с време на включване от 1000 милисекунди. По време на режим на заспиване той ще бъде изключен.
Следователно са необходими допълнителни компоненти -
- LED - 1 бр
- Бутон (тактилен превключвател) - 2 бр
- 4.7k резистори - 2 бр
- 680R резистор - 1 бр
- Макет
- Закачете тел
- 5V адаптер или захранващ блок
- Микро-USB кабел
- Arduino IDE с интерфейс за програмиране ESP32 в компютър или лаптоп.
Електрическа схема на режим на заспиване ESP32
Схемата за включване на ESP32 с бутон е показана по-долу.
Схемата е доста проста. Той има два бутона. Бутонът за заспиване ще постави ESP32 в режим на дълбок сън и друг превключвател се използва за събуждане на ESP32 от режим на заспиване. И двата бутона са свързани в ПИН 16 и ПИН 33. И двата бутона са конфигурирани като активни ниски при натискане, поради което се дава допълнително изтегляне. За да се установи обаче дали ESP 32 е в режим на заспиване или в нормално работно състояние, светодиодът е свързан към IO Pin 4.
Преглед на режимите на заспиване в ESP32
Има много различни режими на захранване за ESP32, а именно активен режим, модемен режим на заспиване, лек режим на заспиване, режим на дълбок сън и режим на хибернация.
По време на нормалното работно състояние ESP32 работи в активен режим. По време на активния режим ESP32, CPU, WiFi / BT хардуерът, RTC паметта и RTC периферните устройства, UL-копроцесорите, всички се активират и работят в зависимост от натоварването. При различни режими на захранване обаче една или повече периферни устройства са изключени. За да проверите различни операции в режим на захранване, следвайте таблицата по-долу
Хардуер |
Активен режим |
Режим на спящ модем |
Лек режим на заспиване |
Режим на дълбок сън |
Хибернация |
процесор |
НА |
НА |
ПАУЗА |
ИЗКЛЮЧЕНО |
ИЗКЛЮЧЕНО |
WiFi / BT |
НА |
ИЗКЛЮЧЕНО |
ИЗКЛЮЧЕНО |
ИЗКЛЮЧЕНО |
ИЗКЛЮЧЕНО |
RTC и RTC периферни устройства |
НА |
НА |
НА |
НА |
ИЗКЛЮЧЕНО |
Процесор ULP-Co |
НА |
НА |
НА |
ВКЛ. / ИЗКЛ |
ИЗКЛЮЧЕНО |
Както можем да видим в горната таблица, че в режим на дълбок сън ESP32, който често се нарича модел на наблюдение на ULP сензор - CPU, WiFi / BT, RTC памет и периферни устройства, ULP копроцесорите са изключени. Включени са само RTC паметта и RTC периферните устройства.
По време на събуждане ESP32 трябва да бъде уведомен от източник за събуждане, който ще събуди ESP32 от режим на дълбок сън. Тъй като обаче RTC периферните устройства са включени, ESP32 може да се събуди чрез GPIO с активиран RTC. Има и други опции. Може да се събуди чрез външни щифтове за прекъсване на събуждането или да използва таймер за събуждане на ESP32. В този проект използваме събуждане ext0 на пин 33.
Програмиране на ESP32 за режим на дълбок сън
Пълната програма може да бъде намерена в долната част на тази страница. Той е написан за Arduino IDE и следователно може лесно да бъде адаптиран към вашите изисквания. Обяснението на кода е както следва.
В началото на кода, // Създаване на променлива PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // дефинираме Led Pin uint8_t led_pin = GPIO_NUM_4; // дефиниране на ПИН за събуждане uint8_t wakeUp_pin = GPIO_NUM_33;
Горните три реда определят щифта за събуждане, LED щифта и щифта в режим на заспиване.
void setup () { // поставете вашия код за настройка тук, за да стартирате веднъж: // задайте серийния порт на 115200 Serial.begin (115200); забавяне (1000); // задаваме щифта pushButton като вход с вътрешен PuMUp pinMode (pushBtn.pin, INPUT_PULLUP); // задаваме манипулатора на прекъсвания с щифта pushButton в режим Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // задаваме Led щифта като изведен pinMode (led_pin, OUTPUT); // създаваме задача, която ще бъде изпълнена във функцията blinkLed (), с приоритет 1 и изпълнена на ядро 0 xTaskCreate ( blinkLed, / * функция на задачата. * / "blinkLed", / * име на задачата. * / 1024 * 2, / * Размер на стека на задачата * / NULL, / * параметър на задачата * / 5, / * приоритет на задачата * / & taskBlinkled); / * Ръкохватка на задачата за проследяване на създадената задача * / delay (500); // Конфигуриране на ПИН 33 като източник за събуждане ext0 с НИСКО логическо ниво esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
По-горе прекъсването е зададено в падащ режим от кодовия фрагмент
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Следователно, когато се натисне превключвателят, логическото ниво ще се промени от логика 1 (3.3V) на логика 0 (0V). Напрежението на щифта на бутона ще падне и ESP32 ще разпознае, че превключвателят е натиснат. Създадена е и задача за мигане на светодиода.
xTaskCreate ( blinkLed, / * Функция на задачата. * / "blinkLed", / * име на задачата. * / 1024 * 2, / * Размер на стека на задачата * / NULL, / * параметър на задачата * / 5, / * приоритет на задачата * / & taskBlinkled); / * Ръкохватка на задачата за проследяване на създадената задача * / delay (500);
ПИН 33 също е конфигуриран с помощта на кодовия фрагмент по-долу като външен източник за събуждане, идентифициран като ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
След това, в цикъл while-
void loop () { // поставете основния си код тук, за да стартирате многократно: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Натиснат \ n", pushBtn.pin); Serial.printf ("Спиране на задачата" blinkLed "\ n"); // Спиране на blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Отивам да спя….. \ n", pushBtn.pin); pushBtn.pressed = false; // Отидете да заспите сега esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); превключвател (wakeupReason) { случай ESP_SLEEP_WAKEUP_EXT0: Serial.println ("използване на външен сигнал ext0 за WakeUp From sleep"); почивка; случай ESP_SLEEP_WAKEUP_EXT1: Serial.println ("използване на външен сигнал ext1 за WakeUp From sleep"); почивка; случай ESP_SLEEP_WAKEUP_TIMER: Serial.println ("използване на таймер за WakeUp From sleep"); почивка; дело ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("използване на сигнал на тъчпада за WakeUp From sleep"); почивка; случай ESP_SLEEP_WAKEUP_ULP: Serial.println ("използване на ULP сигнал за WakeUp From sleep"); почивка; по подразбиране: почивка; Serial.printf ("Възобновяване на задачата" blinkLed "\ n"); // рестартирайте blinkLed Task vTaskResume (taskBlinkled); } }
Цикълът while непрекъснато проверява дали бутонът за заспиване е натиснат или не. Ако бутонът бъде натиснат, той ще спре или спре заданието за мигане на LED и ще стартира функцията esp за дълбоко заспиване-
esp_deep_sleep_start ();
В тази ситуация, ако бъде натиснат бутонът за външно прекъсване ext0, той веднага ще се събуди от режим на дълбок сън и ще възобнови задачата за мигане.
И накрая, функцията за мигане на LED може да се види в долните фрагменти, тя ще мига LED 1000 ms секунди.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // превключване на стойността на щифта pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Просто превключете светодиода на всеки 1000ms или 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Тестване на ESP32 в режим на дълбоко заспиване
Веригата е изградена в макет, а за измерване на тока се използва мултиметър Metravi XB edition. Токът, изтеглен от веригата в активен режим, е почти 58 mA, но в режим на дълбок сън токът е почти 4,10 mA. По-долу изображението показва текущата консумация на активен режим ESP32 -
В режим на дълбок сън текущата консумация се записва на около 3,95 mA, изображението по-долу показва текущото потребление на ESP32 Deep Sleep Mode -
В режим на дълбок сън обаче текущата консумация на ESP32 е почти 150 uA. Но записаното текущо потребление за тази платка ESP32 Devkit е почти 4,10 mA. Това се дължи на CP2102 и линейния регулатор. Тези две са свързани към 5V електропровода. В захранващата линия е свързан и светодиод за захранване, който консумира почти 2 mA ток.
Следователно може лесно да се установи, че ESP32 консумира много ниско количество енергия в режим на дълбок сън, което е много полезно за операции с батерии. За повече информация как работи, вижте видеото, свързано по-долу. Ако имате някакви въпроси, оставете ги в раздела за коментари по-долу или използвайте форумите ни за други технически въпроси.