• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ответы ESP.getResetReason();

Andrey L

Member
В соседнем топике мне рассказали о ESP.getResetReason();

Гугл мне рассказал что эта функция выводит причину последней перезагрузки в человекочитабельном виде, но не сказал какие там есть ответы и в каких случаях.

Код
Код:
// Время в микросекундах, на которое мы отправляем наш модуль "спать".
#define sleepTime 10*1e6

// Время в милисекундах, которое модуль ждёт действий пользователя
#define wakefulnessTime 30*1e3

// Пины для тестов, которые мы будем перемыкать с GND
#define resetPin D1
#define restartPin D2

void setup() {
  pinMode(resetPin, INPUT_PULLUP);
  pinMode(restartPin, INPUT_PULLUP);

  // Без "большого серийного брата" во время тестов никак нельзя.
  Serial.begin(115200);
  Serial.println(""); // Первая строчка вывода - абра-кадабра

  Serial.print("Причина перезагрузки: ");
  Serial.println(ESP.getResetReason());  // Слушем и верим каждому его слову...
  Serial.println("");

  Serial.println("Ждём...");
  while (millis() < wakefulnessTime) {
    // Здесь может быть какой-то код, а мы просто ждём.
    delay(1); // Запихнул delay(), а то без него модуль перезагружался с "Soft WDT reset" -> "Software Watchdog"
  }
  Serial.println("...ожидание закончилось.");
  Serial.println("");

  if (digitalRead(resetPin) == 0) {
    ESP.reset(); // Software/System restart
  } else if (digitalRead(restartPin) == 0) {
    ESP.restart(); // Лучше этим перезагружать  // Software/System restart
  } else {
    ESP.deepSleep(sleepTime); // Идём "спать" // Deep-Sleep Wake
  }
}

void loop() {
  // loop() остаётся пустым
}

Результаты опытов
Причины перезагрузки модуля, а так же ответы, которые выдаёт ESP.getResetReason():
  • "External System" - прервалось обычное выполнение программы, но тут может быть несколько причин:
    - перепрошивка модуля,
    - выключение и подача питания на модуль,
    - встроенная в модуль кнопка "RST",
    - замыкание пина "RST" с "GND",
    - так же ещё если "выключить" модуль, связав пины "EN" с "GND", потом отключить питание, отсоединить "EN" от "GND" и вновь подать питание на модуль.
  • "Deep-Sleep Wake" - модуль вышел из режима "глубокого сна", но вновь нет различия каким образом он был выведен: перепрошивка модуля, выключение и подача питания на модуль, встроенная в модуль кнопка "RST", замыкание пина "RST" с "GND".
  • "Power on" - выключение и включение при помощи "EN_PIN" (на NodeMCU пин "EN").
  • "Software/System restart" - перезагрузка модуля при помощи команд ESP.reset() или ESP.restart().
  • "Software Watchdog" - когда я заставил модуль исполнять пустой цикл.

Можно ещё другие ответы от ESP.getResetReason() получить или как-нибудь ещё по-нормальному модуль перезагрузить?
 

tretyakov_sa

Moderator
Команда форума
Вот как реализована эта функция в библиотеке:

Код:
String EspClass::getResetReason(void) {
    char buff[32];
    if (resetInfo.reason == REASON_DEFAULT_RST) { // normal startup by power on
      strcpy_P(buff, PSTR("Power on"));
    } else if (resetInfo.reason == REASON_WDT_RST) { // hardware watch dog reset
      strcpy_P(buff, PSTR("Hardware Watchdog"));
    } else if (resetInfo.reason == REASON_EXCEPTION_RST) { // exception reset, GPIO status won’t change
      strcpy_P(buff, PSTR("Exception"));
    } else if (resetInfo.reason == REASON_SOFT_WDT_RST) { // software watch dog reset, GPIO status won’t change
      strcpy_P(buff, PSTR("Software Watchdog"));
    } else if (resetInfo.reason == REASON_SOFT_RESTART) { // software restart ,system_restart , GPIO status won’t change
      strcpy_P(buff, PSTR("Software/System restart"));
    } else if (resetInfo.reason == REASON_DEEP_SLEEP_AWAKE) { // wake up from deep-sleep
      strcpy_P(buff, PSTR("Deep-Sleep Wake"));
    } else if (resetInfo.reason == REASON_EXT_SYS_RST) { // external system reset
      strcpy_P(buff, PSTR("External System"));
    } else {
      strcpy_P(buff, PSTR("Unknown"));
    }
    return String(buff);
}
Есть ещё getResetInfo() загляните в файл Esp.cpp в ядре.
 
Сверху Снизу