• Система автоматизации с открытым исходным кодом на базе 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 в ядре.
 
Сверху Снизу