ESP8266 jak programowo resetować
ESP.restart() (Arduino Core) lub esp_restart() (ESP-IDF). 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. | 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.
#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();
import machine
machine.reset() # pełny restart
machine.deepsleep(0) # analogicznie do deep-sleep reset
Komendy szeregowe:
AT+RST // restart modułu
AT+RESTORE // przywróć ustawienia fabryczne + restart
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
Arduino: Serial.println(ESP.getResetReason());
Espressif: system_print_reset_reason();
Typowe wyniki: Power-On, External RST, Software Watchdog, Exception, Deep-Sleep Wake.
ESP.reset(), ale zaznacza w release notes, że pozostaje „unsafe” dla plików LittleFS/SPIFFS. esp_restart(). ESP.restart() zamknij połączenia (MQTT, HTTP) i flush Serial: client.disconnect(); Serial.flush(); delay(100);
ESP.restart();
system_rtc_mem_write) albo w EEPROM emulowanym. ESP.deepSleep(us). ESP.reset() może zostawić peryferia Wi-Fi w stanie nieokreślonym, co prowadzi do błędu „wifi status = 255”. 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.