MicroPython: Глубокий сон ESP8266 и источники пробуждения

В этом руководстве показано, как использовать режим глубокого сна (deep sleep) на ESP8266 и как пробудить его с помощью таймера или внешнего пробуждения, используя прошивку MicroPython.

MicroPython ESP8266 Deep Sleep и источники пробуждения

Если у вас ESP32, рекомендуем прочитать наше руководство MicroPython: Глубокий сон ESP32 и источники пробуждения.

Необходимые условия

Для работы с этим руководством вам необходимо, чтобы прошивка MicroPython была установлена на вашу плату ESP8266. Также вам потребуется IDE для написания и загрузки кода на плату. Мы предлагаем использовать Thonny IDE или uPyCraft IDE:

Введение в глубокий сон

Когда ESP8266 находится в режиме глубокого сна, всё отключается, за исключением часов реального времени (RTC — Real Time Clock), которые используются ESP8266 для отслеживания времени.

В режиме глубокого сна чип ESP8266 потребляет приблизительно всего 20 мкА (микроампер).

Потребление тока ESP8266 в режиме глубокого сна — таблица из даташита

Однако следует учитывать, что на собранной плате ESP8266 потребление тока будет значительно больше.

Нам удалось создать метеостанцию-датологгер на ESP8266 с использованием MicroPython, которая потребляет всего 7 мкА в режиме глубокого сна: Метеостанция-датологгер с низким энергопотреблением на ESP8266 и BME280 с MicroPython.

Пробуждение по таймеру

Пробуждение ESP8266 по таймеру

Существует несколько способов пробуждения ESP8266 с помощью таймера после глубокого сна. Один из самых простых — использовать следующую функцию в вашем коде:

def deep_sleep(msecs):
  # настройка RTC.ALARM0 для возможности пробуждения устройства
  rtc = machine.RTC()
  rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
  # установка RTC.ALARM0 для срабатывания через X миллисекунд, пробуждающего устройство
  rtc.alarm(rtc.ALARM0, msecs)
  # перевод устройства в сон
  machine.deepsleep()

Мы рекомендуем скопировать эту функцию в начало вашего скрипта, а затем вызывать функцию deep_sleep() для перевода ESP8266 в режим глубокого сна.

Функция deep_sleep() создаёт таймер, который пробуждает ESP8266 через заданное количество секунд. Для использования этой функции в вашем коде достаточно передать в качестве аргумента время сна в миллисекундах.

Скрипт

В следующем коде ESP8266 находится в режиме глубокого сна 10 секунд. Когда он просыпается, он мигает светодиодом и снова засыпает. Этот процесс повторяется снова и снова.

# Полные детали проекта на https://RandomNerdTutorials.com/micropython-programming-with-esp32-and-esp8266/

import machine
from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)

def deep_sleep(msecs):
  # настройка RTC.ALARM0 для возможности пробуждения устройства
  rtc = machine.RTC()
  rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)

  # установка RTC.ALARM0 для срабатывания через X миллисекунд (пробуждающего устройство)
  rtc.alarm(rtc.ALARM0, msecs)

  # перевод устройства в сон
  machine.deepsleep()

# мигание светодиодом
led.value(1)
sleep(1)
led.value(0)
sleep(1)

# ожидание 5 секунд, чтобы успеть поймать ESP в бодрствующем состоянии
# для установки последовательного соединения
# в финальном скрипте эту строку sleep следует удалить
sleep(5)

print('Im awake, but Im going to sleep')

# сон на 10 секунд (10000 миллисекунд)
deep_sleep(10000)

Просмотреть исходный код

Как работает код

Сначала импортируем необходимые библиотеки:

import machine
from machine import Pin
from time import sleep

Создаём объект Pin, ссылающийся на GPIO 2, под именем led. На нашей плате он соответствует встроенному светодиоду.

led = Pin(2, Pin.OUT)

Затем добавляем функцию deep_sleep() в код:

def deep_sleep(msecs):
  # настройка RTC.ALARM0 для возможности пробуждения устройства
  rtc = machine.RTC()
  rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
  # установка RTC.ALARM0 для срабатывания через X миллисекунд, пробуждающего устройство
  rtc.alarm(rtc.ALARM0, msecs)
  # перевод устройства в сон
  machine.deepsleep()

Следующие строки мигают светодиодом:

led.value(1)
sleep(1)
led.value(0)
sleep(1)

Перед переходом в сон добавляем задержку в 5 секунд и выводим сообщение, указывающее на то, что устройство засыпает:

sleep(5)
print('Im awake, but Im going to sleep')

Важно добавить эту задержку в 5 секунд перед засыпанием при разработке скрипта. Когда вы хотите загрузить новый код на плату, она должна быть в бодрствующем состоянии. Поэтому, если у вас нет задержки, будет сложно поймать её в бодрствующем состоянии для загрузки кода. После получения финального кода эту задержку можно удалить.

Наконец, переводим ESP8266 в глубокий сон на 10 секунд (10 000 миллисекунд), вызывая функцию deep_sleep() и передавая в качестве аргумента количество миллисекунд:

deep_sleep(10000)

Через 10 секунд ESP8266 просыпается и выполняет код с самого начала, аналогично нажатию кнопки RESET.

Загрузка кода

Скопируйте предоставленный код в файл main.py и загрузите его на ESP8266.

Если вы не знаете, как загрузить скрипт, следуйте этому руководству для Thonny IDE или этому руководству для uPyCraft IDE.

После загрузки кода необходимо соединить GPIO16 (D0) с пином RST, чтобы ESP8266 мог самостоятельно выходить из сна.

MicroPython ESP8266 NodeMCU — пробуждение по таймеру, схема подключения глубокого сна

Важно: если вы не соедините GPIO16 с пином RST, ESP8266 не проснётся.

Демонстрация

После загрузки кода и соединения GPIO 16 (D0) с пином RST, ESP8266 должен мигнуть встроенным светодиодом и вывести сообщение в консоль.

Затем он переходит в сон на 10 секунд, просыпается и снова выполняет код. Этот процесс повторяется снова и снова.

MicroPython ESP8266 — демонстрация пробуждения по таймеру из глубокого сна

Глубокий сон с ESP-01

Если вы хотите сделать аналогичную установку с платой ESP-01, вам нужно припаять провод, как показано на следующем рисунке. Этот крошечный пин на чипе — GPIO16, и он должен быть подключён к пину RST.

MicroPython ESP-01 — пробуждение по таймеру, подключение для глубокого сна

Однако пины настолько мелкие, что припаять провод к GPIO 16 без повреждения чипа действительно очень сложно.

MicroPython ESP-01 — схема подключения для глубокого сна

Подробнее о GPIO ESP8266: Распиновка ESP8266: какие GPIO пины следует использовать?


Внешнее пробуждение

Внешнее пробуждение ESP8266 MicroPython

ESP8266 не поддерживает внешнее пробуждение так, как это делает ESP32. Но кое-что мы можем с этим сделать.

Если перевести ESP8266 в глубокий сон на неопределённое время, он проснётся только тогда, когда что-то перезагрузит плату. Таким образом, мы можем подключить что-нибудь к пину RST и использовать это как внешнее пробуждение. Это может быть нажатие кнопки (pushbutton) или, например, приближение к магнитному герконовому переключателю (reed switch).

ESP8266 перезагружается, когда на пине RST устанавливается уровень LOW.

Для тестирования этого метода подключите кнопку к пину RST. Вам понадобятся следующие компоненты:

Если вы используете ESP8266 12-E NodeMCU kit, следуйте следующей схеме:

MicroPython ESP8266 NodeMCU — внешнее пробуждение, схема подключения глубокого сна

Если вы используете ESP-01, вы можете следовать следующей схеме:

MicroPython ESP-01 — внешнее пробуждение, схема подключения глубокого сна

Загрузите следующий код на ESP8266 как main.py.

# Полные детали проекта на 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)

# мигание светодиодом
led.value(0)
sleep(1)
led.value(1)
sleep(1)

# ожидание 5 секунд, чтобы успеть поймать ESP в бодрствующем состоянии
# для установки последовательного соединения
# в финальном скрипте эту строку sleep следует удалить
sleep(5)
print('Im awake, but Im going to sleep')
sleep(1)

# сон на неопределённое время
deepsleep()

Просмотреть исходный код

В этом случае достаточно вызвать machine.deepsleep() после выполнения основного кода.

Когда вы вызываете machine.deepsleep() без аргументов, ESP8266 перейдёт в режим глубокого сна на неопределённое время, пока вы не нажмёте кнопку RST.

После сборки схемы и загрузки кода можно протестировать установку. Каждый раз, когда вы нажимаете кнопку, подключённую к пину RST, ESP8266 перезагружается и просыпается. Он мигает встроенным светодиодом и снова засыпает.

MicroPython ESP8266 NodeMCU — демонстрация внешнего пробуждения из глубокого сна

Заключение

Надеемся, что это руководство о глубоком сне ESP8266 оказалось для вас полезным. У нас есть другие руководства по глубокому сну, которые могут вас заинтересовать:

Если вы хотите узнать больше о программировании плат ESP32 и ESP8266 с помощью MicroPython, ознакомьтесь с нашей электронной книгой: MicroPython Programming with ESP32 and ESP8266.

Спасибо за чтение.