Більшість IoT-пристроїв на ESP32 працюють від батареї, і неоптимізований режим сну може швидко розрядити її. Це призводить до частих замін батарейок, що незручно і дорого, особливо у великих мережах датчиків.
На практиці, датчик вологості, який періодично передає дані на сервер, може працювати до місяця від батареї при активному режимі, але лише до 6 місяців у стандартному режимі сну. Це критично для віддалених пристроїв, де заміна батарейок неможлива.
Контекст і чому це важливо
Deep Sleep – це режим надзвичайно низького енергоспоживання в ESP32, де процесор практично повністю вимкнений. Цей режим особливо актуальний для IoT-пристроїв, які збирають дані з датчиків та надсилають їх на сервер з невеликою періодичністю.
Якщо не використовувати Deep Sleep або використовувати його неправильно, пристрій постійно буде споживати значну кількість енергії, навіть коли не виконує жодних корисних задач. Це призводить до передчасного виходу з ладу батареї, збільшення експлуатаційних витрат та обмеження терміну служби пристрою.
Практична реалізація
Щоб увімкнути Deep Sleep, потрібно правильно налаштувати таймер та встановити відповідні біти в регістрі `TEN`.
#include <WiFi.h>
// Константа для періоду Deep Sleep (в мікросекундах)
#define DEEP_SLEEP_DURATION_MS 60000
void setup() {
Serial.begin(115200);
delay(1000);
// Вимкнути WiFi перед переходом в Deep Sleep
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
// Встановити таймер для Deep Sleep
esp_sleep_enable_timer_wakeup(DEEP_SLEEP_DURATION_MS);
// Встановити біт Deep Sleep Enable (TEN)
esp_deep_sleep_set_wakeup_time(0, DEEP_SLEEP_DURATION_MS);
Serial.println("Перехід в Deep Sleep...");
vTaskDelete(NULL); // Завершити всі завдання
esp_deep_sleep_start();
}
void loop() {
// Цей код ніколи не буде виконано, якщо Deep Sleep працює правильно
}
Цей код налаштовує таймер, щоб ESP32 прокидався кожні 60 секунд. `esp_deep_sleep_set_wakeup_time` визначає час пробудження, а `esp_deep_sleep_start()` ініціює перехід у режим Deep Sleep, зменшуючи споживання струму приблизно на 100 разів порівняно з активним режимом.
Поширені помилки та підводні камені
- Неправильне налаштування таймера: Якщо таймер встановлений невірно, пристрій може не прокидатися або прокидатися занадто часто, що зменшує ефективність Deep Sleep. Перевірте значення `DEEP_SLEEP_DURATION_MS` відповідно до ваших потреб.
- Залишені WiFi-з’єднання: Не вимкнувши WiFi перед Deep Sleep, пристрій продовжуватиме споживати енергію на підтримку з’єднання. Завжди вимикайте WiFi перед переходом у Deep Sleep.
- Неправильне завершення завдань: Якщо завдання не завершені, вони можуть перешкодити переходу в Deep Sleep або спричинити непередбачувану поведінку. Використовуйте `vTaskDelete(NULL)` для завершення всіх завдань перед Deep Sleep.
Порівняння підходів
Без Deep Sleep, пристрій у активному режимі споживає близько 80-120mA, що виснажує батарею за кілька тижнів. Використання Deep Sleep дозволяє зменшити це споживання до 10-20µA, що значно збільшує термін служби батареї до кількох місяців або навіть років.
Deep Sleep дає можливість створити автономні IoT-пристрої з мінімальним споживанням енергії, що значно знижує експлуатаційні витрати.
Висновки
Deep Sleep ідеально підходить для IoT-пристроїв, які потребують тривалого терміну служби батареї, таких як датчики вологості, температури та руху. Почніть з налаштування таймера на 60 секунд та переконайтеся, що WiFi вимкнено перед переходом у Deep Sleep, щоб максимізувати енергоефективність.