### [ На русском ] ↔ [ English ]

- Режимы сна в ESP32 и энергопотребление
- Засыпание: nap и nap deep
- Просыпание: будильники и события
- Пример: легкий сон на 5 секунд
- Список команд

## ⇮Режимы сна в ESP32 и энергопотребление

ESP32 имеет режим Light Sleep, при котором периферия отключается (clock-gating), но содержимое RAM и состояние CPU сохраняются (быстрое пробуждение, переменные остаются в памяти). И есть Deep Sleep, который отключает большинство компонентов, из-за чего при пробуждении требуется полноценная перезагрузка, но при этом значительно экономится энергия; активными остаются только RTC-память и периферия (пробуждение дольше, для сохранения данных требуется использовать RTC-память).

Оба режима экономят энергию в устройствах на батарейном питании: Deep Sleep даёт максимальную экономию (единицы микроампер), а Light Sleep (сотни микроампер) обеспечивает быстрое возобновление работы и часто используется вместе с режимом Modem-sleep для Wi-Fi/Bluetooth в постоянно подключённых приложениях.

В ESPShell сном управляет одна команда - "nap". С помощью нее можно посылать процессор в легкий или глубокий сон а так же задавать условия пробуждения. Ну и традиционная команда для просмотра состояния: "show nap"

ВАЖНОЕ ЗАМЕЧАНИЕ: в чипах ESP32-S3 (с поддержкой USB-CDC) чип не может корректно выйти из легкого сна: при просыпании USB-CDC перестает работать. Этот недостаток проявляется лишь в случае, когда USB используется по прямому назначению. Если же USB порт НЕ используется для Hardware CDC, то чип из легкого сна выходит корректно. ESPShell предупредит, когда посчитает, что из легкого сна мы корректно не выйдем.

## ⇮Засыпание: nap и nap deep

Для того, чтобы отправить процессор в легкий сон используется команда "nap" без аргументов, а для глубокого сна (с перезагрузкой по пробуждении) используется команда "nap deep". Впрочем, если вы попытаетесь ей воспользоваться, ESPShell откажется, сославшись на то, что не установлено условие пробуждения

      esp32#>nap
      % Wakeup source is not properly set, use "nap alarm" to set one
      % When should we wakeup?
      esp32#>

Ну что же, давайте сначала установим будильник

## ⇮Просыпание: будильники и события

ESPShell умеет будить процессор по трем разным событиям:

- Активность на UART (задается номер UART и количество pos edges на линии TX для пробуждения)
- Активность на GPIO (задается уровень low/high и список пинов)
- Таймер

События, по которым следует будить процессор задаются командой "nap alarm". Обратите внимание на то, что последовательное исполнение команд nap alarm не заменяет один будильник другим, а суммирует их. Так, если выполнить команду "nap alarm uart 0" а затем - "nap alarm 5 sec", то будет задано два будильника - один по таймеру, через 5 секунд, а второй - по активности на UART.

Чтобы отменить установленные будильники, следует воспользоваться командой "nap alarm disable-all":

      esp32#>nap alarm disable-all
      % All sleep wakeup sources were disabled
      esp32#>

Если вы просто меняете время просыпания на будильнике, то ничего отменять не нужно. Но если вы меняете источник пробуждения с таймера, на, скажем, UART0, то нужно будет сделать nap alarm disable-all перед nap alarm uart0

## ⇮Пример: погрузить процессор в легкий сон на 5 секунд,

Итак, отправим наш ESP32 в глубокий и не очень сон посредством команд ESPShell. Сначала сконфигурируем будильник - пусть это будет пять секунд:

    esp32#>nap alarm 5 sec
    % Sleep wakeup timer: 5000000 usec
    esp32#>

А теперь - в глубокий или легкий сон:

      esp32#>nap
      % Entering light sleep

По прошествии 5 секунд процессор проснется и продолжит свою работу. При выходе из глубокго (deep) сна процессор перезагрузится

## ⇮Список команд и примеры

Команда | Описание и примеры
--- | ---
nap [deep] | nap nap deep Посылает процессор в режим сна: глубокого (ключ "deep") или легкого (nap без параметров). После возвращения процессора в рабочее состояние, можно выполнить команду "uptime", чтобы узнать причину пробуждения и количество циклов уснул-проснулся:
      % Last boot was 6 seconds ago
      % Reset reason: "returning from a deep sleep"
      %    CPU0: Deep sleep reset the digital core
      %    CPU1: Deep sleep reset the digital core
      % Returned from sleep: 1 time (sequental), wakeup caused by a timer
      % Slept for 5 seconds
      % Firmware reload count: 2 (# of resets since power-on)
nap alarm ... | nap alarm uart NUMBER [EDGES] Источник пробуждения - UART номер NUMBER. Необязательный параметр EDGES (значение по умолчанию: 3) задает сколько раз должен "дернуться" пин RX, чтобы UART пробудил центральный процессор. На платах-клонах DevKitC, UART0 выведен через микросхему-конвертер USB-UART. Из-за особенностей этого дизайна, когда процессор уходит в глубокий сон, проснутся по активности на UART он уже не может - микросхема-конвертер так же уходит в шатдаун. При непосредственном подключении к UART такой проблемы не возникает. В режиме легкого сна эта проблема не озникает так же, т.к. микросхема-конвертер остается в работающем состоянии. nap alarm low|high PIN1 [PIN2 PIN3 ... PINn] Источник пробуждения - сигнал LOW или HIGH на пинах PIN1, PIN2 ... PINn. Например, если нам нужно, чтобы процессор просыпался когда на одном из пинов 2,4 или 1 вознкает значение логической единицы:
                esp32#>nap alarm high 1 2 4
                % Sleep wakeup source: EXT1
                esp32#>
nap alarm TIMESPEC Задать интервал, по прошествии которого процессор будет выведен из состояния сна. TIMESPEC задает интервал в виде дней, минут, часов,с екунд и миллисекунд, в свободном формате:
      esp32#>nap alarm 25 days 1 hour 55 min 1 s
      % Sleep wakeup timer: 2166901000000 usec
      esp32#>
nap alarm 1" пробудит процессор ровно через 1 секунду после засыпания. nap alarm disable-all Отменить все установленные ранее источники пробуждения.
show nap | show nap Показывает, какие источники пробуждения сейчас активны:
      esp32#>show nap
      % Enabled wakeup source: TIMER, duration: 3888000 sec   ← обычный таймер на 45 дней
      % Enabled wakeup source: EXT0 (single GPIO)             ← GPIO пин
      % Enabled wakeup source: UART RX                        ← активность на UART
      esp32#>