Arduino ESP8266 Watchdog – przykład użycia, obsługa SW/HW WDT, kod, timeout

Pytanie

arduino esp8266 watchdog przykład

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Aby w Arduino IDE dla ESP8266 skorzystać z watchdog-a, wystarczy włączyć go poleceniem
    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()).

Szczegółowa analiza problemu

1. Architektura watchdogów w ESP8266

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.

2. Minimalny przykład

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");
}

3. Obsługa długich, blokujących fragmentów

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())

4. Test kontrolny – świadome wywołanie resetu

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.

5. Diagnostyka przyczyny resetu

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.

Aktualne informacje i trendy

• 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.

Wspierające wyjaśnienia i detale

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.

Aspekty etyczne i prawne

• 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.

Praktyczne wskazówki

  1. Stosuj nieblokujące schematy (state-machine) i unikaj delay(x>100) – celuj w < 10 ms.
  2. Jeśli musisz mieć sekcję krytyczną > 3 s:
    a) ESP.wdtDisable();
    b) Wykonaj kod
    c) ESP.wdtEnable(timeout_ms);do 8 s lub mniej, by pozostał margines dla HW-WDT.
  3. W aplikacjach OTA ustaw SW-WDT na 8 s, HW-WDT i tak zareaguje później – masz czas na zapis flash.
  4. Dodaj logowanie resetu do EEPROM/FS, aby po restarcie automatycznie wysłać raport.

Ewentualne zastrzeżenia lub uwagi dodatkowe

• 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().

Sugestie dalszych badań

• 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”.

Krótkie podsumowanie

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.

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.