- Вимоги
- Електрична схема ESP32 в сплячому режимі
- Огляд режимів сну в ESP32
- Програмування ESP32 для глибокого сну
- Тестування ESP32 в режимі глибокого сну
ESP32 є одним з найпопулярніших модулів мікроконтролера на основі Wi-Fi, і це популярний вибір у багатьох портативних програмах IoT. Це потужний контролер, який підтримує двоядерне програмування, а також має вбудовану підтримку Bluetooth Low Energy (BLE), що робить його хорошим вибором для портативних програм, таких як пристрої iBeacon, GPS-трекери тощо. Однак у таких додатках, що працюють від акумуляторів, головним занепокоєнням є резервне копіювання акумулятора. Цю резервну батарею можна збільшити завдяки розумнішому контролю над блоком мікроконтролера, як можна запрограмувати ESP32 у сплячому режимі в ідеальному стані для збільшення резервної батареї пристрою.
У цьому проекті ми перевіримо поточне споживання широко популярного пристрою мікроконтролера ESP32 з підтримкою Wi-Fi та Bluetooth у нормальному робочому режимі та режимі глибокого сну. Також ми перевіримо різницю та перевіримо, як перевести ESP32 у режим глибокого сну. Ви також можете ознайомитися зі статтею про те, як мінімізувати споживання енергії в мікроконтролерах, щоб отримати інші поради, які можуть бути використані, щоб зробити ваш дизайн набагато більш енергоефективним. Крім того, якщо вас цікавить режим сну інших мікроконтролерів, ви можете також переглянути режим сну Arduino та режим сну ESP8266 NodeMCU.
Вимоги
Для цього ми будемо використовувати Devkit V4.0 на базі ESP32 від Espressif, який має міст USB до UART, а також інші розпіновки ESP32 для зручності підключення. Програмування буде здійснюватися за допомогою Arduino IDE. Якщо ви абсолютно новачок, то для початку роботи з ESP32 за допомогою Arduino прочитайте зв’язану статтю, перш ніж продовжувати.
Вимоги цього проекту такі:
- Натисканням кнопки він переходить у режим глибокого сну.
- Він прокинеться з режиму глибокого сну натисканням іншої кнопки.
- Щоб виявити стан ESP32, світлодіод блиматиме з часом увімкнення 1000 мілісекунд. У режимі сну він буде вимкнений.
Отже, необхідні додаткові компоненти -
- Світлодіод - 1 шт
- Кнопка (тактильний перемикач) - 2 шт
- Резистори 4.7k - 2 шт
- Резистор 680R - 1 шт
- Макет
- Підключіть дріт
- 5В адаптер або блок живлення
- Кабель micro-USB
- IDE Arduino з інтерфейсом програмування ESP32 на ПК або ноутбуці.
Електрична схема ESP32 в сплячому режимі
Схема для переходу ESP32 у сплячий режим кнопкою наведена нижче.
Схема досить проста. Він має дві кнопки. Кнопка сну переводить ESP32 в режим глибокого сну, а інший перемикач використовується для виходу ESP32 з режиму сну. Обидві кнопки з'єднані за допомогою PIN 16 та PIN 33. Обидві кнопки налаштовані як активні низькі при натисканні, тому надається додаткове підтягування. Однак, щоб визначити, перебуває ESP 32 у сплячому режимі або в режимі нормального робочого стану, світлодіод підключений до IO Pin 4.
Огляд режимів сну в ESP32
Є багато різних режимів живлення для ESP32, а саме активний режим, режим сну модему, режим легкого сну, режим глибокого сну та режим глибокого сну.
Під час нормального робочого стану ESP32 працює в активному режимі. Під час активного режиму ESP32 центральний процесор, апаратне забезпечення WiFi / BT, пам’ять RTC та периферія RTC, копроцесори ULP, всі активуються та працюють залежно від навантаження. Однак у різних режимах живлення одна або кілька периферійних пристроїв вимикаються. Щоб перевірити різні режими живлення, дотримуйтесь таблиці нижче -
Апаратне забезпечення |
Активний режим |
Режим режиму сну |
Режим легкого сну |
Режим глибокого сну |
Зимова сплячка |
ЦП |
УВІМК |
УВІМК |
ПАУЗА |
ВИМК |
ВИМК |
WiFi / BT |
УВІМК |
ВИМК |
ВИМК |
ВИМК |
ВИМК |
RTC та RTC периферія |
УВІМК |
УВІМК |
УВІМК |
УВІМК |
ВИМК |
Процесор ULP-Co |
УВІМК |
УВІМК |
УВІМК |
УВІМКНЕНО ВИМКНЕНО |
ВИМК |
Як ми можемо побачити у наведеній вище таблиці, у режимі глибокого сну ESP32, який часто називають шаблоном моніторингу датчика ULP - процесор, 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;
Вищезазначені три рядки визначають шпильку пробудження, штифт світлодіода та шпильку режиму сну.
void setup () { // помістіть свій код налаштування сюди, щоб запуститися один раз: // встановіть послідовний порт на 115200 Serial.begin (115200); затримка (1000); // встановити штифт pushButton як вхідний за допомогою внутрішнього PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // встановити обробник переривань за допомогою штифта pushButton у режимі падіння attachInterrupt (pushBtn.pin, isr_handle, FALLING); // встановити світлодіодний штифт як вихідний pinMode (led_pin, OUTPUT); // створюємо завдання, яке буде виконуватися у функції blinkLed () з пріоритетом 1 і виконуватися на ядрі 0 xTaskCreate ( blinkLed, / * Функція завдання. * / "blinkLed", / * назва завдання. * / 1024 * 2, / * Розмір стека завдання * / NULL, / * параметр завдання * / 5, / * пріоритет завдання * / & taskBlinkled); / * Дескриптор завдання для відстеження створеного завдання * / delay (500); // Налаштування Pin 33 як джерела пробудження ext0 з НИЗЬКИМ логічним рівнем esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
У наведеному вище фрагмент коду встановлює переривання в режим падіння
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Тому при кожному натисканні перемикача рівень логіки змінюється з логіки 1 (3,3 В) на логіку 0 (0 В). Напруга на штифті кнопки впаде, і 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) { case 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 постійно перевіряє, натиснута кнопка сну чи ні. Якщо кнопку натиснути, вона зупинить або призупинить завдання миготіння світлодіода та запустить функцію esp глибокого сну-
esp_deep_sleep_start ();
У цій ситуації, якщо натиснути кнопку зовнішнього переривання ext0, вона негайно вийде з режиму глибокого сну та відновить завдання миготіння.
Нарешті, функцію мигання світлодіода можна побачити у наведених нижче фрагментах, вона буде блимати світлодіодом 1000 мс секунд.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // перемикаємо значення штифта pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Світлодіод -----------------% s \ n", pin_val? "Увімкнено": "Вимкнено"); / * Просто перемикайте світлодіод кожні 1000 мс або 1 с * / vTaskDelay (1000 / портTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Тестування ESP32 в режимі глибокого сну
Схема побудована в макетній панелі, а для вимірювання струму використовується мультиметр видання Metravi XB. Струм, який випромінюється ланцюгом в активному режимі, становить майже 58 мА, але в режимі глибокого сну струм майже 4,10 мА. Внизу на зображенні показано споживання струму в активному режимі ESP32 -
У режимі глибокого сну поточне споживання фіксується приблизно до 3,95 мА, на зображенні нижче показано поточне споживання режиму глибокого сну ESP32 -
Однак у режимі глибокого сну поточне споживання ESP32 становить майже 150 мкА. Але зареєстроване споживання струму для цієї плати ESP32 Devkit становить майже 4,10 мА. Це пов’язано з CP2102 та лінійним регулятором. Ці два підключені до лінії електропередачі 5 В Також до лінії електропередачі підключений світлодіод живлення, який споживає майже 2 мА струму.
Тому можна легко визначити, що ESP32 споживає дуже низьку кількість енергії в режимі глибокого сну, що дуже корисно для роботи від акумулятора. Для отримання додаткової інформації про те, як це працювало, перегляньте відео, посилання нижче. Якщо у вас є які-небудь запитання, залиште їх у розділі коментарів нижче або використовуйте наші форуми для інших технічних питань.