The Arduino hang guardian - Watchdog timer tutorial

An introduction to how the Arduino watchdog timer operates, how you can use it and how it can help you with a remote placed project.
Aug 08, 2019 — 3 mins read — Arduino

The Arduino hang guardian - Watchdog timer tutorial

It happens to all of us. You build a project, enthusiastically connect all of the sensors, and all of a sudden, the Arduino hangs and no input is processed. 

“What is going on?”, you’ll ask and start digging through your code, only to realize that you’ve got stuck in an infinite loop. Thank God the Arduino was on your bench and not in a remote location.

Today, we’ll look at how we can use the watchdog timer on the Arduino to prevent this from happening. 

The Arduino watchdog timer as the name implies is a timer that runs separately from the main CPU on the board. This timer can be used to periodically check the state of the board and in circumstances where the board got stuck in a software loop or got stuck because of hardware failure, the watchdog timer can reset the Arduino and have it start all over again. 

By default when not in use this timer is disabled on all projects and only when we enable it, we need to make sure to periodically tell it to not reset our board if it is still operating as expected.

To be able to use the watchdog timer, we first need to include the avr/wdt.h file in our Arduino sketch. This is the standard library that holds the watchdog actions. 

To enable the timer, we use the function “wdt_enable” where we need to pass in the threshold interval at which the board will be reset. Depending on our use case, this can be anywhere from 15 milliseconds to up to 8 seconds in pre-defined settings that are contained in the watchdog library. 

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

Now, with the timer enabled, to prevent it from resetting our Arduino we need to periodically call the “wdt_reset” function to reset the watchdog timer before the threshold interval expires.

When choosing a reset interval, it is crucial that we take into consideration any lengthy operation like reading or sending data or connecting to external sensors. The reset threshold should be at least one and a half times greater than these times to prevent any accidental resets.

In the example program that you can download on the link in the description, we first set up the watchdog timer with a reset interval of 4 seconds. Then to know that we are in the setup function, we flash an LED for 3 times quickly and then in the main loop we first reset the timer, light up an LED with progressively longer intervals and then we turn it off. The next loop resets the timer again until the light-up time is longer than 4 seconds. 

When this happens, the watchdog timer resets the board and the setup is executed again.

One possible issue with the watchdog timer, depending on the bootloader of your Arduino is that if the watchdog timer value is too low and the bootloader does not reset the timer when uploading new code, you may end up damaging your Arduino board in a way that it will always be stuck in the boot phase. The bootloader will try to start, but the timer will keep resetting the board, never allowing it to properly start. To prevent issues like this, make sure to always use threshold intervals of 2 seconds or more.

If you have an example of where you have used the watchdog timer in a real project, let me know down in the video comments, make sure to like the video and don’t forget to subscribe.

arduino basic electronics watchdog timer Introduction
Read next

The use of particleboard in the workshop

Beyond my electronics and computer desk, I’m building a workshop in my basement where I can work on bigger projects and furniture items for...

You might also enojy this

Hand washing timer

In my previous article I looked at the options of using a PIR sensor in Arduino projects and I came to the conclusion that the best option i...