ESP8266 programowy reset – ESP.restart(), esp_restart(), MicroPython, AT+RST

Pytanie

ESP8266 jak programowo resetować

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Najbezpieczniej zainicjować programowy restart ESP8266 funkcją ESP.restart() (Arduino Core) lub esp_restart() (ESP-IDF).
  • Alternatywy: ESP.reset(), ESP.deepSleep(0), świadome wyzwolenie WatchDog-a, komenda AT AT+RST, machine.reset() w MicroPythonie.
  • ESP.restart() domyślnie zapewnia „czysty” restart i powinna być pierwszym wyborem.

Szczegółowa analiza problemu

1. Środowisko Arduino Core (SDK = NONOS/RTOS)

Funkcja Typ resetu Czas wykonania Zalecenia Przykład
ESP.restart() miękki < 150 ms preferowana; SDK zamyka stosy, Wi-Fi, pliki; minimalizuje ryzyko korupcji Flash ESP.restart();
ESP.reset() twardy ≈ 20 ms szybki, bez sprzątania rejestrów; używać, gdy ESP.restart() zawiedzie ESP.reset();
ESP.deepSleep(0) sprzętowy ≈ 70 ms* reset równoważny wyjściu z deep-sleep; *wymaga GPIO16↔RST tylko dla wybudzeń z timera RTC powyżej 0 µs ESP.deepSleep(0);
WatchDog (WDT) sprzętowy 1–8 s ostatnia instancja; brak kontroli czasu dokładnego pętla blokująca bez delay()

Uwagi:
• Od jądra core 3.x ESP.restart() wywołuje najpierw WiFi.disconnect(true) i flush portów szeregowych, co zmniejsza ryzyko zawieszeń po OTA.
• Po pierwszym flashowaniu UART zaleca się jeden fizyczny reset, by opuścić bootloader.

2. ESP-IDF (Espressif SDK dla ESP8266-RTOS)

#include "esp_system.h"
void some_task(void* arg) {
    /* ... */
    esp_restart();          // równoważne Arduino:ESP.restart()
}

Kontrola przyczyny ostatniego resetu: esp_reset_reason_t reason = esp_reset_reason();

3. MicroPython

import machine
machine.reset()       # pełny restart
machine.deepsleep(0)  # analogicznie do deep-sleep reset

4. AT Firmware (moduły w trybie modemu)

Komendy szeregowe:

AT+RST        // restart modułu
AT+RESTORE    // przywróć ustawienia fabryczne + restart

5. WatchDog – świadome użycie

Domyślny SW WDT ≈ 3,2 s (loop), HW WDT ≈ 7,8 s. Zablokowanie programu dłużej niż timeout wyzwoli reset sprzętowy:

noInterrupts();
while (true) {}   // brak yield(); po kilku sekundach WDT

6. Diagnostyka przyczyny resetu

Arduino: Serial.println(ESP.getResetReason());
Espressif: system_print_reset_reason();
Typowe wyniki: Power-On, External RST, Software Watchdog, Exception, Deep-Sleep Wake.

Aktualne informacje i trendy

  • W core 3.1.2 (XI 2023) Espressif usunął deprecację ESP.reset(), ale zaznacza w release notes, że pozostaje „unsafe” dla plików LittleFS/SPIFFS.
  • Coraz częściej przenosi się projekty na ESP32-C3/S3 (RISC-V/XTensa) – tam jedyną wspieraną metodą jest esp_restart().
  • W projektach IoT OTA większość community stosuje „restart po OTA” z kontrolą liczby nieudanych bootów zapisaną w RTC memory (tzw. boot-counter).

Wspierające wyjaśnienia i detale

  • Reset nie czyści całej pamięci Flash – konfiguracja Wi-Fi, system plików i NVS pozostają.
  • „Miękki” restart NIE resetuje stanu pinu RST; jeśli masz zewnętrzny układ trzymający RST nisko (np. czujnik brązowego outu), moduł pozostanie w bootloaderze.
  • Na płytkach NodeMCU v2/v3 wbudowany konwerter USB-Uart manipuluje DTR/RTS – szybkie sekwencje soft-reset mogą przypadkowo wejść w tryb flash.

Aspekty etyczne i prawne

  • Zdalne resetowanie urządzeń IoT musi respektować integralność danych użytkownika; częste resety mogą przerwać krytyczne operacje (np. otwieranie zamka).
  • W aplikacjach certyfikowanych (np. CE, RED) reset nie może prowadzić do stanu niebezpiecznego (failure-to-safe).

Praktyczne wskazówki

  1. Przed ESP.restart() zamknij połączenia (MQTT, HTTP) i flush Serial:
    client.disconnect(); Serial.flush(); delay(100);
    ESP.restart();
  2. Chcesz zachować licznik lub flagę – zapisz w RTC memory (system_rtc_mem_write) albo w EEPROM emulowanym.
  3. Do testów loguj reset reason do SPIFFS – pomoże wykryć pętle WDT.
  4. Dla głębokiego uśpienia połącz GPIO16↔RST i stosuj ESP.deepSleep(us).

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • ESP.reset() może zostawić peryferia Wi-Fi w stanie nieokreślonym, co prowadzi do błędu „wifi status = 255”.
  • Przy włączonym debug level > 3 niektóre biblioteki (np. BearSSL) generują duży ruch na UART; restart w trakcie transmisji może powodować „garbage” podczas bootu i fałszywe wykrycie prędkości.

Sugestie dalszych badań

  • Test wpływu różnych metod restartu na zużycie cykli zapisu Flash (OTA + LittleFS).
  • Implementacja awaryjnego bootloadera (dual partition + CRC) – wymusza restart na backup firmware.
  • Porównanie odzyskiwania po awarii między ESP8266 a ESP32-C3.

Krótkie podsumowanie

Do programowego resetu ESP8266 używaj przede wszystkim ESP.restart() (Arduino) lub esp_restart() (ESP-IDF). Metody alternatywne (ESP.reset(), ESP.deepSleep(0), WDT, AT+RST, MicroPython machine.reset()) przydają się w wyjątkowych scenariuszach. Zawsze zapisuj krytyczne dane przed resetem i diagnozuj przyczynę ostatniego restartu, aby unikać pętli reset-boot.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.