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:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <avr/wdt.h> //włączamy bibliotekę do programu void setup() { wdt_enable(WDTO_1S); //aktywujemy watchdog z argumentem czasu - w tej sytuacji 1 sekunda //wstawiamy w dowolnym miejscu w setup...od tego momentu watchdog już działa;) } void loop(){ wdt_reset(); //reset zegara watchdog //(jeśli w ciągu w tym wypadku sekundy program nie zrealizuje funkcji wdt_reset() - Arduino zresetuje się samoczynnie. } |
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:
1 2 3 4 5 6 7 8 9 10 11 |
Czas oczekiwania: Argument funkcji "wdt_enable": 15mS WDTO_15MS 30mS WDTO_30MS 60mS WDTO_60MS 120mS WDTO_120MS 250mS WDTO_250MS 500mS WDTO_500MS 1S WDTO_1S 2S WDTO_2S 4S WDTO_4S 8S WDTO_8S |
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