Легкий сон 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.

Я застрял отсюда. У кого-нибудь есть идеи, что может происходить и как это исправить?

, 👍0

Обсуждение

что делает #include "gpio.h"?, @dandavis

Включает в себя библиотеку GPIO, которая позволяет получить доступ к gpio_pin_wakeup_enable, насколько мне известно., @mheavers


1 ответ


1

Вы можете вывести ESP8266 из режима глубокого сна, просто кратковременно установив низкий уровень RST. Грубо говоря, вы можете просто использовать свой переключатель, чтобы подключить его к GND, возможно, с подтягивающим резистором к + v. Если вы хотите быть немного более элегантным, вы можете использовать небольшой конденсатор, чтобы сгладить отскок переключателя, чтобы ваш код перезапускался только один раз. Я использую это на ESP8266, который питается от солнечной энергии. Большую часть времени он находится в глубоком сне. Он просыпается, подключается к MQTT и снова переходит в глубокий сон только тогда, когда датчик, за которым он следит, меняет состояние.

,