MicroPython: Глубокий сон ESP8266 и источники пробуждения
В этом руководстве показано, как использовать режим глубокого сна (deep sleep) на ESP8266 и как пробудить его с помощью таймера или внешнего пробуждения, используя прошивку MicroPython.
Если у вас ESP32, рекомендуем прочитать наше руководство MicroPython: Глубокий сон ESP32 и источники пробуждения.
Необходимые условия
Для работы с этим руководством вам необходимо, чтобы прошивка MicroPython была установлена на вашу плату ESP8266. Также вам потребуется IDE для написания и загрузки кода на плату. Мы предлагаем использовать Thonny IDE или uPyCraft IDE:
Введение в глубокий сон
Когда ESP8266 находится в режиме глубокого сна, всё отключается, за исключением часов реального времени (RTC — Real Time Clock), которые используются ESP8266 для отслеживания времени.
В режиме глубокого сна чип ESP8266 потребляет приблизительно всего 20 мкА (микроампер).
Однако следует учитывать, что на собранной плате ESP8266 потребление тока будет значительно больше.
Нам удалось создать метеостанцию-датологгер на ESP8266 с использованием MicroPython, которая потребляет всего 7 мкА в режиме глубокого сна: Метеостанция-датологгер с низким энергопотреблением на ESP8266 и BME280 с MicroPython.
Пробуждение по таймеру
Существует несколько способов пробуждения 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 мог самостоятельно выходить из сна.
Важно: если вы не соедините GPIO16 с пином RST, ESP8266 не проснётся.
Демонстрация
После загрузки кода и соединения GPIO 16 (D0) с пином RST, ESP8266 должен мигнуть встроенным светодиодом и вывести сообщение в консоль.
Затем он переходит в сон на 10 секунд, просыпается и снова выполняет код. Этот процесс повторяется снова и снова.
Глубокий сон с ESP-01
Если вы хотите сделать аналогичную установку с платой ESP-01, вам нужно припаять провод, как показано на следующем рисунке. Этот крошечный пин на чипе — GPIO16, и он должен быть подключён к пину RST.
Однако пины настолько мелкие, что припаять провод к GPIO 16 без повреждения чипа действительно очень сложно.
Подробнее о GPIO ESP8266: Распиновка ESP8266: какие GPIO пины следует использовать?
Внешнее пробуждение
ESP8266 не поддерживает внешнее пробуждение так, как это делает ESP32. Но кое-что мы можем с этим сделать.
Если перевести ESP8266 в глубокий сон на неопределённое время, он проснётся только тогда, когда что-то перезагрузит плату. Таким образом, мы можем подключить что-нибудь к пину RST и использовать это как внешнее пробуждение. Это может быть нажатие кнопки (pushbutton) или, например, приближение к магнитному герконовому переключателю (reed switch).
ESP8266 перезагружается, когда на пине RST устанавливается уровень LOW.
Для тестирования этого метода подключите кнопку к пину RST. Вам понадобятся следующие компоненты:
ESP8266 (читайте Лучшие платы разработки ESP8266)
Если вы используете ESP8266 12-E NodeMCU kit, следуйте следующей схеме:
Если вы используете 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 перезагружается и просыпается. Он мигает встроенным светодиодом и снова засыпает.
Заключение
Надеемся, что это руководство о глубоком сне ESP8266 оказалось для вас полезным. У нас есть другие руководства по глубокому сну, которые могут вас заинтересовать:
Если вы хотите узнать больше о программировании плат ESP32 и ESP8266 с помощью MicroPython, ознакомьтесь с нашей электронной книгой: MicroPython Programming with ESP32 and ESP8266.
Спасибо за чтение.