Легкий сон ESP8266 — не могу проснуться
Я пытаюсь реализовать легкий спящий режим на esp8266 (перо ахаха), которое при нажатии кнопки пробуждает систему, чтобы она могла продолжить свою обычную задачу.
Я собрал код из этого поста и немного изменил его:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define WAKE_PIN 5
extern "C" {
#include "gpio.h"
}
extern "C" {
#include "user_interface.h"
}
void setup(){
Serial.begin(115200);
Serial.println("Setup");
pinMode(WAKE_PIN, INPUT_PULLUP);
gpio_init(); // Инициализация контактов GPIO
}
void loop(){
Serial.println("Do something...");
Serial.println(digitalRead(WAKE_PIN));
delay(500); //случайная задержка для выполнения этих действий
if(!digitalRead(WAKE_PIN)){ //если мы не определяем вывод, спим
sleep();
}
delay(1000);
}
void sleep(){
Serial.println("Going to sleep...");
delay(10);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); // устанавливаем тип сна
gpio_pin_wakeup_enable(GPIO_ID_PIN(WAKE_PIN), GPIO_PIN_INTR_LOLEVEL); //НЕТ ИЛИ ПРИВЕТ?
wifi_fpm_open(); // Включает принудительный сон
wifi_fpm_do_sleep(5000); //Сон на короткое время
delay(100);
Serial.println("Woke up!");
}
Вот как у меня все подключено:
Таким образом, функция настройки работает как положено, а также "что-то делать". Кнопка показывает высокий уровень (1), когда она не нажата, а когда я нажимаю ее, она показывает низкий уровень (0), что отправляет ESP в спящий режим. В последовательном мониторе я вижу:
Going to sleep...
Soft WDT reset
ctx: cont
sp: 3ffef7a0 end: 3ffef9a0 offset: 01b0
>>>stack>>>
3ffef950: 0001260d 00000600 3ffee970 4021fc84
3ffef960: 00001388 402020ba 402020b1 402020a1
3ffef970: 00000000 00000000 3ffee944 40202115
3ffef980: 3fffdad0 00000000 3ffee968 402027d4
3ffef990: feefeffe feefeffe 3ffee980 40100710
<<<stack<<<
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:4, boot mode:(1,6)
wdt reset
У меня нет большого опыта работы с Arduino или электротехникой, поэтому я не совсем уверен, что происходит по сравнению с тем, что должно происходить, но это моя интерпретация:
Я где-то читал, что причины сброса следующие:
reset causes:
0:
1: normal boot
2: reset pin
3: software reset
4: watchdog reset
boot device:
0:
1: ram
3: flash
В этом случае, если мягкий сброс
считается легким сном для esp, то первой причиной:2
является ожидаемое поведение, так как это означает, что он был запущен выводом. 5. Первая причина: 4
хотя я не уверен - сторожевой таймер сброс. Похоже на защитный механизм устройства, в таком случае может сброс этого должен совпадать со сбросом, срабатывающим при спящем режиме и это нормально? Или это указывает на сбой? В любом случае, я понятия не имею, что такое stack
, но система не перезагружается — после этого я не могу получить какие-либо дальнейшие показания от последовательного монитора.
Я не уверен, должен ли GPIO_PIN_INTR_LOLEVEL
быть высоким или низким — мне не удалось найти документацию по этому вопросу (хотя я видел ее в [исходном файле заголовка GPIO] на git.5
Я читал, что у кого-то была аналогичная проблема, и кто-то упомянул о добавлении резисторов и проверке GPIO 0 должен быть высоким, а 15 — низким. Ссылка, которую они разместили, не работает, но она заставила меня задуматься о том, что я читал о глубоком сне , в котором вы должны подключить RST к 0. На самом деле я попытался провести провод между RST и удерживать контактную площадку #0
, которая находится прямо у USB-порта на перо, и после этого код на самом деле засыпает, затем автоматически просыпается и возобновляет нормальную функцию цикла, но я хочу, чтобы только кнопка разбудила ESP.
Я застрял отсюда. У кого-нибудь есть идеи, что может происходить и как это исправить?
@mheavers, 👍0
Обсуждение1 ответ
Вы можете вывести ESP8266 из режима глубокого сна, просто кратковременно установив низкий уровень RST. Грубо говоря, вы можете просто использовать свой переключатель, чтобы подключить его к GND, возможно, с подтягивающим резистором к + v. Если вы хотите быть немного более элегантным, вы можете использовать небольшой конденсатор, чтобы сгладить отскок переключателя, чтобы ваш код перезапускался только один раз. Я использую это на ESP8266, который питается от солнечной энергии. Большую часть времени он находится в глубоком сне. Он просыпается, подключается к MQTT и снова переходит в глубокий сон только тогда, когда датчик, за которым он следит, меняет состояние.
- Вывод ESP8266 из deepSleep с помощью кнопки
- Понимание того, как запитать объекты с помощью реле (featherwing, feather huzzah)
- Монитор напряжения батареи сразу после глубокого сна
- Переключатель управления энергосбережением esp8266
- Питание Nodemcu с помощью Vin
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- Как узнать сопротивление внутреннего подтягивающего резистора?
- ESP8266 глубокий сон и MQTT
что делает
#include "gpio.h"
?, @dandavisВключает в себя библиотеку GPIO, которая позволяет получить доступ к
gpio_pin_wakeup_enable
, насколько мне известно., @mheavers