Arduino watchdog

Watchdog w Arduino to bardzo pożyteczna funkcja, w szczególności gdy zakończyliśmy już testy programu i chcemy użyć go w warunkach rzeczywistych. Na przykład zaprogramowaliśmy układ zamka szyfrowego do mieszkania i zainstalowaliśmy go na drzwiach wejściowych. Co jeśli z różnych przyczyn (np. jakiś zakłóceń, nieznanego wcześniej błędu w kodzie) procesor płytki arduino zawiesi się?
Nie wejdziemy w tej sytuacji do mieszkania…
Aby tak się nie stało dołączamy do kodu programu warchdog, który w przypadku gdy program zawiesi się, resetuje Arduino.

Użycie jest bardzo proste:

Użycie funkcji wdt_reset() musi być przemyślane. Nie możemy wprowadzić np. w tym wypadku komendy np. delay(2000);
Arduino zatrzyma się na delay i nie zresetuje zegara watchdog w ciągu sekundy – arduino się zresetuje z powodu błędu logicznego w kodzie.
Również uważać należy na pętle “for” i “while”…jeśli to konieczne można użyć wdt_reset() w kodzie kilkukrotnie – również wewnątrz pętli.

Jednak jeśli Arduino z jakiegoś powodu zawiesiło się i program w ciągu sekundy nie odczyta funkcji “wdt_reset()” nastąpi reset programu.
Można zapisywać liczbę resetów spowodowanych przez watchdog w pamięci eeprom (aby po jakimś czasie sprawdzić czy program lub układ elektroniczny jest stabilny).

Tabela dostępnych argumentów funkcji “wdt_enable” – tzn. okres w jakim watchdog sprawdza czy Arduino się nie zawiesiło:

Uwaga praktyczna: Zdarza się, że watchdog jest w konflikcie z bootloaderem Arduino. Dzieje się tak np. w arduino nano – aby wykorzystać w tej sytuacji watchdog płytkę należy zaprogramować przez SPI a nie przez USB – wtedy wszystko działa.

Watchdog może być użyty również do oszczędzania energii zasilania w Arduino.
Więcej informacji o watchdog można uzyskać na angielskojęzycznej stronie:
https://folk.uio.no/jeanra/Microelectronics/ArduinoWatchdog.html