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.