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.