Watchdog (do inglês Cão de Guarda) é uma ferramenta, tanto de software como de hardware, criada para monitorar o bom funcionamento de equipamentos.
Consiste essencialmente em um timer, que deve ser resetado periodicamente pelo sistema para demostrar que o mesmo está funcionando corretamente.
Se por algum motivo esse comando de reset do timer não for acionado o Watchdog é ativado e reseta todo o sistema ao estado inicial.SPK6C9A.gif
Nos Microcontroladores essa ferramenta é muito importante pois, se bem programado, pode deixar o equipamento muito mais confiável.

A utilização de Watchdog em certos equipamentos é essencial para aumentar sua segurança. 
Por exemplo, vamos pensar em um avião. Lá dentro existem milhares de microcontroladores que possuem um fim específico, como controlar a pressurização da cabine, e que estão subordinados a um controlador principal. Se por uma falha na programação ou um evento externo, como um raio, um desses equipamentos começarem a alimentar o sistema principal com uma informação errada as consequências seriam catastróficas!
Numa hora dessas, um Watchdog bem programado é capaz de atuar e voltar o sistema que está com falha para sua configuração inicial e resolver o problema.

As boas técnicas de programação incentivam a criar um watchdog de software a cada uma das diferentes tarefas do firmware (execução do main, interrupção do timer, interrupção de ethernet e etc.)

Apesar de ser mais comum, nem sempre a implementação do watchdog é feita dentro do programa principal ou no microcontrolador a ser resetado. 
No link abaixo temos uma implementação de um watchdog utilizando um CI 555, que pode ser utilizado para resetar o sistema independente de programação. (em inglês)

fKt6Yto.jpg
http://www.openhardwarehub.com/projects/36-Arduino-Hardware-Reset-Circuit-Breadboard?show_all=1#!pre...

Watchdog no Arduino

Geralmente o Watchdog de software pode ser acionado quando incluímos sua biblioteca na programação. 

No Arduino a biblioteca do watchdog pode ser incluída com o comando:

#include <avr/wdt.h>

e os parâmetros:

wdt_enable(WDT0_8s)  - Para iniciar a contagem do timer e estabelecer o tempo que ele aguardará até resetar todo sistema (no caso, 8 segundos).

wdt_reset() - Reseta o Watchdog

Para fins didáticos, segue um exemplo muito interessante para entendermos o funcionamento do watchdog no Arduino.

LEMBRETE: NEM TODO ARDUINO É CAPAZ DE EXECUTAR O WATCHDOG SATISFATORIAMENTE, SE A IMPLEMENTAÇÃO FOR FEITA INCORRETAMENTE PODE OCORRER UM 'SOFTBRICK' EM SUA PLACA E VOCÊ NÃO CONSEGUIRÁ GRAVAR MAIS NADA NELA. USE OS CÓDIGOS ABAIXO POR SUA CONTA EM RISCO.

Isso ocorre porque quando o Arduino é inicializado ele já começa a rodar o código que está em sua memória. Então, digamos que seja implementado um Watchdog de 1 segundo. 
Antes de se conseguir gravar um novo programa na placa o sistema será resetado e a transferência não será concluída a tempo.
Isso nos obrigaria a utilizar um gravador externo para resetar toda memória do Arduino, o que não é fácil.


Segue o código comentado e com os devidos créditos.

/*
crédito : http://labdegaragem.com/forum/topics/reset-interno-arduino?id=6223006%3ATopic%3A172031&page=3#commen...

PROGRAMA DE EXPLICAÇÃO DA FUNÇÃO WATCHDOG
FINALIDADE:  Fazer com que o arduino reset caso o arduino trave em algum local entrando em algum loop infinito.
FUNCIONAMENTO:  Esse programa simula um travamento,  primeiramente ele acende um led que esta no void setup e é ativado apenas uma vez na inicialização do arduino, dai ele cria um loop normal sendo que a cada volta ele acrescenta um valor a uma variável que é apresentada na serial, após um numero de voltas programados (no nosso caso 20) ele entra em um laço que simula um travamento não passando pelo reset do watchdog, mas executando uma segunda função para a serial,  como resultado apos 8 segundos o arduino é reiniciado.

AGRADECIMENTOS: A toda turma que faz parte do lab de garagem em especial Alian Vargas e ao Fabio henrique que expuseram essa tecnica maravilhosa de forma tão competente

*/
#include <avr/wdt.h>  // inclui a função watchdog, biblioteca já consta dentro do sistema do arduino

int led = 12;  // indica um pino para led que servirá de referencia visual
int soma = 0;  // cria variavel para demonstracão de tempo de funcionamento normal
int temporeset = 0;  // cria uma variavel para informar em quanto tempo o watchdog funcionará

void setup() {
  
  Serial.begin(9600);    // inicia a serial
  pinMode(led, OUTPUT);    // indica o pino como saida
  digitalWrite(led, HIGH);   // liga o led dentro do setup
  delay(1000);               // aguarda um segundo aceso
  digitalWrite(led, LOW);    // desliga o led
 
wdt_enable(WDTO_8S);  // habilita o watchdog
}

void loop() {
  soma++;  // soma mais um a variavel soma
  Serial.println(soma);   // imprime na serial o valor de soma
  delay(500);  //  aguarda meio segundo
  
  wdt_reset();  //  reseta o watchdog,  ou seja se o programa travar e não ativar esse reset em 8 segundos o watchdog sera ativado
 
while(soma >= 20){  //  cria uma condição de loop para que o pointer não passe pela funcao reset
   temporeset++;    // soma mais um a variavel tempo de reset
   Serial.print("tempo reset: ");   // imprime texto indicativo
   Serial.println(temporeset);     //  imprime o valor da variavel tempo de reset
   delay(1000);   //    aguarda um segundo
 }
 }


Esse código foi testado em um Arduino Uno e funcionou satisfatoriamente. Porém, não conseguimos fazê-lo funcionar no Arduino Leonardo.


Referências:

http://www.instructables.com/id/Raspberry-Pi-and-Arduino-Building-Reliable-Systems/?ALLSTEPS

https://selivre.wordpress.com/2012/08/14/servindo-watchdog-adequadamente/


http://forum.arduino.cc/index.php/topic,42205.0.html


http://rafaellindemann.blogspot.com.br/2012/05/watchdog-timer-wdt.html


Atividades recentes