arduino esp8266 watchdog przykład
ESP.wdtEnable(5000); // timeout 5 s (ms)
a następnie w pętli głównej regularnie „karmić” funkcją
ESP.wdtFeed();
Jeżeli przez zadany czas nie nastąpi wywołanie ESP.wdtFeed()
(lub pośrednio yield()
/ delay()
), mikrokontroler sam wykona reset.
Kluczowe punkty
• ESP8266 ma dwa niezależne watchdogi – software (~3 s) i hardware (~8 s).
• W środowisku Arduino oba są włączone domyślnie; sterować można wyłącznie SW-WDT.
• Najbezpieczniej zamiast delay()
używać podejścia nieblokującego (millis()
+ yield()
).
Typ WDT | Poziom | Typowy timeout | Sterowanie w Arduino | Cel | Co go karmi? | Czy można zmienić czas? |
---|---|---|---|---|---|---|
Software | FW | 3 – 3,2 s | ESP.wdtEnable(ms) , ESP.wdtDisable() |
Ochrona głównej pętli | yield() , delay() , ESP.wdtFeed() |
Tak (1–8000 ms) |
Hardware | HW | 7–8 s | Brak (tylko SDK) | Ostateczna linia obrony | Sam SW-WDT + RTOS tick | Nie (stały) |
‐ SW-WDT uruchamia się ponownie po każdym wywołaniu yield()
lub delay()
.
‐ HW-WDT działa nawet gdy SW-WDT jest wyłączony – resetuje układ, gdy CPU „zawiśnie” dłużej niż ~8 s, albo przestanie obsługiwać przerwania Wi-Fi.
void setup() {
Serial.begin(115200);
Serial.printf("Powód poprzedniego resetu: %s\n", ESP.getResetReason().c_str());
// W razie potrzeby: ESP.wdtDisable(); // chwilowe wyłączenie
ESP.wdtEnable(5000); // 5 s – podajemy w ms
}
void loop() {
wykonujDlugieZadanieNieblokujace(); // własna funkcja
ESP.wdtFeed(); // karmienie psa
delay(10); // yield() również by wystarczył
}
void wykonujDlugieZadanieNieblokujace() {
static uint32_t t0 = millis();
if (millis() - t0 < 3000) return; // udawane obciążenie 3 s
t0 = millis();
Serial.println("✓ Zadanie OK");
}
Jeżeli musisz wykonać pętlę trwającą > 100 ms:
for (uint32_t i = 0; i < DUZA_ILOSC; ++i) {
// … ciężkie obliczenia …
if ((i & 0x3FFF) == 0) yield(); // co ~16 k iteracji odświeżenie WDT i stosu Wi-Fi
}
lub
ESP.wdtFeed(); // gdy przerwanie Wi-Fi jest wyłączone (noInterrupts())
void loop() {
Serial.println("Celowo NIE karmimy WDT – reset za ~3 s");
while (true) {} // nieskończona pętla
}
W monitorze szeregowym zobaczysz komunikat „Soft WDT reset”, a w ESP.getResetReason()
– Reason: Software Watchdog
.
Najczęstsze kody (SDK-3.x):
1 REASON_DEFAULT_RST – włączono zasilanie
2 REASON_WDT_RST – hardware WDT
3 REASON_EXCEPTION_RST – nieobsłużona wyjątek
4 REASON_SOFT_WDT_RST – software WDT
5 REASON_SOFT_RESTART – ESP.restart()
Od wersji core 3.1.* plik user_interface.h
udostępnia strukturę rst_info
, dając pełny back-trace.
• Od Arduino-ESP8266 core 3.x timeout SW-WDT można ustawiać dokładnie (1–8 000 ms).
• W nowym SDK karmi się sprzętowy WDT w kontekście przerwania systemowego, dlatego zbyt długi noInterrupts()
(<~7 s) też wywoła reset.
• W komercyjnych rozwiązaniach IoT powszechnie dodaje się zewnętrzny hardware WDT (np. TI TPL5010) – wymusza fizyczny restart przy uszkodzeniu zasilania czy zawieszeniu RF.
• Trend: integracja z usługami OTA/FOTA – WDT używa się jako zabezpieczenia przed „ucegleniem” przy nieudanej aktualizacji.
• yield()
≈ delay(0)
– poza karmieniem WDT obsługują stos TCP/IP, DHCP, DNS.
• ESP.wdtDisable()
wyłącza tylko SW-WDT; często spotykany błąd to zakładanie, że wyłączył się też HW-WDT.
• Zbyt agresywne karmienie (co kilka µs) nie szkodzi, ale niepotrzebnie wydłuża kod przerwań.
• W trybie Deep-Sleep WDT są zatrzymywane; układ resetuje się wybudzeniem GPIO lub RTC.
• Niezawodność w urządzeniach automatyki domowej ma wpływ na bezpieczeństwo użytkownika; brak WDT może prowadzić do utraty łączności z alarmem lub sterownikiem ogrzewania.
• W UE dyrektywa RED wymaga, by sprzęt radiowy nie zakłócał pasma – zawieszony stos Wi-Fi mógłby generować niepoprawne ramki; WDT minimalizuje to ryzyko.
• Przy zbieraniu danych należy uwzględnić RODO – automatyczny reset nie może skutkować utratą logów użytkownika, jeśli te są danymi osobowymi.
delay(x>100)
– celuj w < 10 ms. ESP.wdtDisable();
ESP.wdtEnable(timeout_ms);
– do 8 s lub mniej, by pozostał margines dla HW-WDT. • Nie można programowo całkowicie wyłączyć HW-WDT.
• Ustawienie zbyt krótkiego SW-WDT (< 200 ms) może powodować losowe resety podczas intensywnego ruchu Wi-Fi.
• Funkcja ESP.reset()
omija normalną procedurę zamknięcia stosu – preferuj ESP.restart()
lub NVIC_SystemReset()
.
• Kod źródłowy watchdogów: cores/esp8266/core_esp8266_wiring.c
i ets_timer.c
w repo esp8266/Arduino
.
• Zewnętrzne układy WDT: TI TPL5010, Maxim DS1818 – porównanie poboru mocy.
• Analiza stack-trace po WDT w GDB-stub (make monitor gdb
).
• Dokument „ESP8266 Technical Reference”, rozdz. 2.5 „Reset and Boot Modes”.
Watchdog w ESP8266 to dwupoziomowy mechanizm autodiagnostyki – software (~3 s) i hardware (~8 s). W Arduino jest domyślnie włączony, a jego obsługa sprowadza się do regularnego yield()/ESP.wdtFeed()
. W praktycznych projektach unikaj blokujących opóźnień, ustaw timeout adekwatny do najdłuższej czynności krytycznej i traktuj WDT jako ostatnią linię obrony, a nie substytut poprawnej architektury kodu.