MicroPython: Глубокий сон ESP32 и источники пробуждения
В этом руководстве показано, как перевести ESP32 в режим глубокого сна (deep sleep) и пробудить его с помощью различных источников пробуждения, используя прошивку MicroPython. Мы рассмотрим пробуждение по таймеру и внешнее пробуждение.
ESP32 также может быть разбужен из глубокого сна с помощью сенсорных пинов, задав пороговое значение. Хотя эта функция уже реализована в MicroPython, на момент написания данного руководства она работает некорректно. Мы обновим эту статью, как только она будет работать стабильно.
Глубокий сон с ESP8266 работает немного иначе, чем с ESP32. Поэтому мы создали отдельную статью о глубоком сне с ESP8266 с использованием MicroPython.
Необходимые условия
Для работы с этим руководством вам необходимо, чтобы прошивка MicroPython была установлена на вашу плату ESP32. Также вам потребуется IDE для написания и загрузки кода на плату. Мы предлагаем использовать Thonny IDE или uPyCraft IDE:
Введение в глубокий сон
Использование ESP32/ESP8266 в активном режиме от батарей — не лучшая идея, поскольку заряд батарей будет расходоваться очень быстро.
Если перевести ESP32 в режим глубокого сна, это снизит потребление энергии, и батареи прослужат дольше. Перевод ESP32 в режим глубокого сна означает прекращение работы компонентов, потребляющих больше всего энергии, при сохранении лишь минимальной активности, достаточной для пробуждения процессора при наступлении интересующего события.
В режиме глубокого сна ESP32 потребляет ток в диапазоне микроампер (мкА). На специально спроектированной плате можно достичь минимального потребления всего 5 мкА. Однако если вы используете полнофункциональную отладочную плату ESP32 со встроенным программатором, встроенными светодиодами и прочим (например, ESP32 DOIT board), вы не сможете достичь столь низкого энергопотребления, но всё равно сможете экономить энергию.
Источники пробуждения
После перевода ESP32 в режим глубокого сна существует несколько способов его пробуждения:
Таймер: пробуждение ESP32 через заданные интервалы времени.
Внешнее пробуждение: ESP32 может пробудиться при изменении состояния вывода (пина).
Сенсорные пины: реализовано, но на момент написания работает некорректно, поэтому мы пока не рассматриваем этот способ.
Сопроцессор ULP: мы ещё не тестировали эту функцию.
Пробуждение по таймеру
ESP32 может перейти в режим глубокого сна, а затем проснуться через заданный интервал времени. Эта функция особенно полезна для проектов, требующих отметки времени или выполнения ежедневных задач при сохранении низкого энергопотребления.
Чтобы перевести ESP32 в режим глубокого сна на определённое количество секунд, достаточно использовать функцию deepsleep() из модуля machine. Эта функция принимает в качестве аргумента время сна в миллисекундах:
machine.deepsleep(sleep_time_ms)
Рассмотрим простой пример, чтобы увидеть, как это работает. В следующем коде ESP32 находится в глубоком сне 10 секунд, затем просыпается, мигает светодиодом и снова засыпает.
# Полные детали проекта на https://RandomNerdTutorials.com/micropython-programming-with-esp32-and-esp8266/
from machine import deepsleep
from machine import Pin
from time import sleep
led = Pin (2, Pin.OUT)
#blink LED
led.value(1)
sleep(1)
led.value(0)
sleep(1)
# wait 5 seconds so that you can catch the ESP awake to establish a serial communication later
# you should remove this sleep line in your final script
sleep(5)
print('Im awake, but Im going to sleep')
#sleep for 10 seconds (10000 milliseconds)
deepsleep(10000)
Посмотреть исходный код на GitHub
Как работает код
Сначала импортируем необходимые библиотеки:
import machine
from machine import Pin
from time import sleep
Создаём объект Pin для GPIO 2 с именем led. Это встроенный светодиод на плате.
led = Pin (2, Pin.OUT)
Следующие команды мигают светодиодом.
led.value(1)
sleep(1)
led.value(0)
sleep(1)
В данном случае мы мигаем светодиодом для демонстрации, но идея в том, чтобы добавить ваш основной код в этот раздел скрипта.
Перед переходом в сон мы добавляем задержку в 5 секунд и выводим сообщение о том, что устройство собирается заснуть.
sleep(5)
print('Im awake, but Im going to sleep')
Важно добавить задержку в 5 секунд перед переходом в сон на этапе разработки скриптов. Когда вы хотите загрузить новый код на плату, она должна быть в активном состоянии. Поэтому, если вы не добавите задержку, будет сложно перехватить плату в активном состоянии для загрузки нового кода. После завершения разработки кода вы можете удалить эту задержку.
Наконец, переводим ESP32 в глубокий сон на 10 секунд (10 000 миллисекунд).
machine.deepsleep(10000)
Через 10 секунд ESP32 просыпается и выполняет код с начала, аналогично нажатию кнопки EN/RST.
Демонстрация
Скопируйте предоставленный код в файл main.py вашего ESP32. Загрузите новый код и нажмите кнопку EN/RST после загрузки.
ESP32 должен мигнуть встроенным светодиодом и вывести сообщение. Затем он перейдёт в сон. Это повторяется снова и снова.
Если вы не знаете, как загрузить скрипт, следуйте этому руководству для Thonny IDE, или этому — для uPyCraft IDE.
Внешнее пробуждение
ESP32 также может быть разбужен из режима сна при изменении состояния вывода. Существуют два варианта внешнего пробуждения ESP32: ext0 и ext1.
Режим ext0 позволяет использовать один GPIO в качестве источника пробуждения. Режим ext1 позволяет задать несколько GPIO в качестве источников пробуждения одновременно.
В качестве источника пробуждения можно использовать только RTC GPIO. RTC GPIO выделены оранжевым прямоугольником на следующей диаграмме.
Подробнее о GPIO ESP32: Распиновка ESP32: какие GPIO пины следует использовать?
Внешнее пробуждение — ext0
Для демонстрации использования внешнего пробуждения ext0 мы используем одну кнопку в качестве источника пробуждения. ESP32 просыпается при нажатии кнопки.
Для этого примера вам понадобятся следующие компоненты:
ESP32
Кнопка (pushbutton)
Резистор 10 кОм
Макетная плата (breadboard)
Соединительные провода
Схема подключения
Соберите схему, следуя приведённой ниже диаграмме. В этом примере мы используем GPIO14 для пробуждения ESP32, но вы можете использовать любой другой RTC GPIO.
Скрипт
Следующий скрипт показывает, как работает ext0: он использует один GPIO в качестве источника внешнего пробуждения.
# Полные детали проекта на https://RandomNerdTutorials.com/micropython-programming-with-esp32-and-esp8266/
import esp32
from machine import Pin
from machine import deepsleep
from time import sleep
wake1 = Pin(14, mode = Pin.IN)
#level parameter can be: esp32.WAKEUP_ANY_HIGH or esp32.WAKEUP_ALL_LOW
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
#your main code goes here to perform a task
print('Im awake. Going to sleep in 10 seconds')
sleep(10)
print('Going to sleep now')
deepsleep()
Как работает код
Сначала необходимо импортировать нужные модули. Вам потребуется импортировать модуль esp32, который содержит методы для настройки пина как источника пробуждения.
После импорта необходимых модулей определите пин пробуждения. В данном случае мы используем GPIO14 и называем его wake1. Этот GPIO должен быть настроен как вход (Pin.IN).
wake1 = Pin(14, mode = Pin.IN)
Затем установите ext0 в качестве источника пробуждения с помощью метода wake_on_ext0():
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
Метод wake_on_ext0() принимает следующие аргументы — pin и level:
pin: объект типа Pin (GPIO, выступающий в роли источника пробуждения)
level: определяет состояние GPIO, при котором ESP32 просыпается. Параметр level может принимать одно из следующих значений:
WAKEUP_ANY_HIGHWAKEUP_ALL_LOW
В данном случае мы используем метод WAKEUP_ANY_HIGH, который пробуждает ESP32, когда GPIO переходит в состояние HIGH.
Ваш основной код для выполнения задачи должен располагаться после определения источника пробуждения и перед переходом в сон.
Мы добавляем 10-секундную задержку перед переходом в сон. Для перевода ESP32 в глубокий сон достаточно использовать метод deepsleep():
machine.deepsleep()
Демонстрация
Загрузите код в файл main.py вашего ESP32. Нажмите кнопку EN/RESET для запуска кода. ESP32 должен перейти в режим сна.
Теперь вы можете нажать кнопку, чтобы пробудить его из глубокого сна.
Внешнее пробуждение — ext1
Внешнее пробуждение ext1 работает аналогично ext0, но позволяет задать несколько GPIO в качестве источника пробуждения. Для демонстрации мы используем две кнопки, подключённые к разным GPIO.
Для этого примера вам понадобятся следующие компоненты:
ESP32
2 кнопки (pushbutton)
2 резистора 10 кОм
Макетная плата (breadboard)
Соединительные провода
Схема подключения
Соберите схему, следуя приведённой ниже диаграмме.
В данном случае мы используем GPIO14 и GPIO12. Вы можете использовать любые другие подходящие GPIO, но это должны быть RTC GPIO, иначе этот метод не будет работать.
Скрипт
Следующий скрипт показывает, как работает ext1: он использует два GPIO в качестве источника внешнего пробуждения, но при необходимости вы можете использовать больше.
# Полные детали проекта на https://RandomNerdTutorials.com/micropython-programming-with-esp32-and-esp8266/
import esp32
from machine import deepsleep
from machine import Pin
from time import sleep
wake1 = Pin(14, mode = Pin.IN)
wake2 = Pin(12, mode = Pin.IN)
#level parameter can be: esp32.WAKEUP_ANY_HIGH or esp32.WAKEUP_ALL_LOW
esp32.wake_on_ext1(pins = (wake1, wake2), level = esp32.WAKEUP_ANY_HIGH)
#your main code goes here to perform a task
print('Im awake. Going to sleep in 10 seconds')
sleep(10)
print('Going to sleep now')
deepsleep()
Как работает код
Код аналогичен примеру ext0, но использует метод wake_on_ext1().
esp32.wake_on_ext1(pins = (wake1, wake2), level = esp32.WAKEUP_ANY_HIGH)
Метод wake_on_ext1() принимает следующие аргументы — pins и level:
pins: кортеж или список объектов типа Pin (GPIO, выступающие в роли источников пробуждения)
level: определяет состояние GPIO, при котором ESP32 просыпается. Параметр level может принимать одно из следующих значений:
WAKEUP_ANY_HIGHWAKEUP_ALL_LOW
После определения источника пробуждения можно перевести ESP32 в глубокий сон:
machine.deepsleep()
Заключение
Надеемся, это руководство по глубокому сну ESP32 с использованием MicroPython было полезным. Мы рассмотрели пробуждение по таймеру и внешнее пробуждение. Также существует возможность пробуждения ESP32 с помощью сенсорных пинов. Хотя это уже доступно в последних версиях прошивки MicroPython, функция работает не так, как ожидалось, поэтому мы не включили её в данное руководство. Тем временем вы можете использовать пробуждение через сенсорные пины ESP32 с Arduino IDE.
У нас есть другие руководства, связанные с глубоким сном, которые могут вас заинтересовать: