O que é Watchdog e como usar do ESP8266?

Vamos aprender o que é e como usar o Watchdog do ESP8266. O ESP conta com dois Watchdog’s, um implementado via software, e outro via hardware (interno), aprenderemos uma utilidade básica para esta incrível ferramenta no mundo dos micro controladores!

Este tutorial exige um conhecimento no mínimo intermediário/avançado sobre programação e hardware!

 

Watchdog

 

[toc]

 

Sobre o Watchdog

Watchdog (traduzindo para cão de guarda) é um dispositivo interno ou externo, separado do clock e processador principal. Sendo assim, caso o micro controlador ou software venha a travar, por ser independente do resto, irá reiniciar o sistema.

O Watchdog é basicamente um “Contador” fora do sistema principal. Quando ele é ativado, é necessário reseta-lo dentro do tempo pré-estabelecido, caso contrario, o Watchdog irá reiniciar completamente o micro controlador ou software em que for implementado.

Imagine que você colocou seu prato de comida no microondas e digitou 15 Segundos para apenas aquecer a comida, e por algum motivo, o microondas trave enquanto o aquecimento esta ligado. Sua comida poderia super-aquecer ou coisa pior. Este travamento poderia ser resolvido com o uso do Watchdog, já que com o sistema travado, não ocorreria o Feed do Watchdog, e assim ocasionaria o reinicio do sistema, preservando sua comida.

Os usos desta ferramenta são gigantescos, já que todo sistema pode travar e gerar terríveis danos. Um motor ligado a um sistema travado, pode gerar perdas em fábricas ou até matar alguém. Watchdog é de suma importância em diversos projetos!

Entretanto, até o Watchdog pode falhar. Nunca confie em um único sistema de segurança, se for preciso, adicione mais formas! O tutorial é apenas uma apresentação da ferramenta, não nos responsabilizamos por nada.

O ESP8266, conta com dois Watchdog’s, um via software e outro via hardware. É possível desabilitar o SW WDT (Software Watchdog), mas até o momento não há formas de desabilitar o HW WDT (Hardware Watchdog).

Software Watchdog tem duração de ~3,2 Segundos. Se não for alimentado durante este tempo, irá reiniciar o software do ESP e manterá os estados dos pinos.

Hardware Watchdog tem duração de ~8 Segundos. Se não for alimentado durante este tempo, irá reiniciar completamente o ESP, inclusive mudando os estados dos pinos para o padrão do boot.

 

 

Mais sobre Watchdog’s do ESP8266, clique AQUI.


Mãos à obra

Componentes utilizados

Montando o projeto

Para este exemplo, acenderemos o LED_BUILTIN do NodeMCU, este LED OnBoard, está conectado ao pino D4 do NodeMCU.

Led Nodemcu ESP8266

Código do projeto

O código e explicação serão separada por partes, mostrando ambos Watchdog’s resetando o ESP, e também como corrigir este problema.

Será duas partes por Watchdog, uma que faz o Watchdog reiniciar o MCU, e outro que faz a alimentação correta e não reiniciando o MCU.

Para entender o que foi repassado com os código, leia a explicação do software logo abaixo!

 

Software Watchdog (Parte 1, sem alimentar):

void setup()
{
   pinMode(D4, OUTPUT);//Define o LED Onboard como saida.
   digitalWrite(D4, 1);//Apaga o LED.
   delay(2000);//Espera 2 segundos para visualizarmos que o ESP foi iniciado.

   for (long x = 0; x < 20; x++)//Ira piscar o LED 10x com intervalo de 250mS.
   {
      digitalWrite(D4, !digitalRead(D4));//Inverte o estado do LED.
      delayMicroseconds(250000);//Espera 250mS
   }

//Após piscar 10x sem erros, irá entrar no loop e o LED começara a piscar
// rapidamente indicando que não ocorreu erros.

//Este código não efetua o FEED do SW WDT dentro do FOR, e ocasionara no 
// reset do ESP, então nunca irá piscar rapidamente, desde que não irá para o loop.
}

void loop()
{
   digitalWrite(D4, !digitalRead(D4));
   delay(50);
}

 

Software Watchdog (Parte 2, alimentando corretamente):

void setup()
{
   pinMode(D4, OUTPUT);//Define o LED Onboard como saida.
   digitalWrite(D4, 1);//Apaga o LED.
   delay(2000);//Espera 2 segundos para visualizarmos que o ESP foi iniciado.

   for (long x = 0; x < 20; x++)//Irá piscar o LED 10x com intervalo de 250mS
   {
      digitalWrite(D4, !digitalRead(D4));//Inverte o estado do LED.
      delayMicroseconds(250000);//Espera 250mS
      yield();//Efetua o feed do SW WDT.
   }

//Após piscar 10x sem erros, irá entrar no loop e o LED começara a piscar
// rapidamente indicando que não ocorreu erros.

//Este código efetua o feed do SW WDT, então logo após as 10 piscadas,
// começara a piscar rapidamente pois entrou no loop.
}

void loop()
{
   digitalWrite(D4, !digitalRead(D4));
   delay(50);
}

 

Hardware Watchdog (parte 1, sem alimentar):

void setup()
{
   pinMode(D4, OUTPUT);//Define o LED Onboard como saida.
   digitalWrite(D4, 1);//Apaga o LED.
   delay(2000);//Espera 2 segundos para visualizarmos que o ESP foi iniciado.
   ESP.wdtDisable();//Desabilita o SW WDT.

   for (long x = 0; x < 20; x++)//Irá piscar o LED 10x com intervalo de 1 Segundo
   {
      digitalWrite(D4, !digitalRead(D4));//Inverte o estado do LED.
      delay(1000);//Espera 1 Segundo.
      yield();
   }


//Após piscar 10x sem erros, irá entrar no loop e o LED começara a piscar
// rapidamente indicando que não ocorreu erros.

//Este código não efetua o FEED do HW WDT dentro do FOR, e ocasionara no
// reset do ESP, então nunca irá piscar rapidamente, desde que não irá para o loop.
}

void loop()
{
   digitalWrite(D4, !digitalRead(D4));
   delay(50);
   ESP.wdtFeed();//Alimenta o HW WDT.
}

 

Hardware Watchdog (parte 2, alimentando corretamente):

void setup()
{
   pinMode(D4, OUTPUT);//Define o LED Onboard como saida.
   digitalWrite(D4, 1);//Apaga o LED.
   delay(2000);//Espera 2 segundos para visualizarmos que o ESP foi iniciado.
   ESP.wdtDisable();//Desabilita o SW WDT. 

   for (long x = 0; x < 20; x++)//Irá piscar o LED 10x com intervalo de 1 Segundo
   {
      digitalWrite(D4, !digitalRead(D4));//Inverte o estado do LED.
      delay(1000);//Espera 1 Segundo.
      yield();
      ESP.wdtFeed();//Alimenta o Watchdog.
   }


//Após piscar 10x sem erros, irá entrar no loop e o LED começara a piscar
// rapidamente indicando que não ocorreu erros.

//Este código efetua o feed do HW WDT, então logo após as 10 piscadas,
// começara a piscar rapidamente pois entrou no loop.
}

void loop()
{
   digitalWrite(D4, !digitalRead(D4));
   delay(50);
   ESP.wdtFeed();//Alimenta o Watchdog.
}

 

Entendendo a fundo

Software

O Feed do Software Watchdog no ESP, é feito em diversas formas, e normalmente não é necessário preciso implementar as funções de Feed. Os 4 principais métodos para efetuar o feed do Software Watchdog no ESP são:

 

delay();

Usando o clássico delay(), automaticamente é feito o Feed do SW WDT, então não é preciso se preocupar. Lembre-se que a função delayMicroseconds() não efetua o feed do SW WDT. Também é possível usar delay(0) para efetuar o feed do SW WDT.

 


yield();

Esta função faz diversos processamentos de background no ESP, inclusive o Feed do SW WDT. Esta função é praticamente o coração do ESP.

 


ESP.wdtFeed();

Esta outra função também alimenta o SW WDT.

 


Término do Loop principal.

Ao termino do loop principal, é feito automaticamente a chamada do yield(), que ocasiona no gerenciamento das tarefas de background do ESP.

 


A ideia do código usado para mostrar no funcionamento do SW WDT, é que pisque o LED lentamente 10x no inicio do código para mostrar que o ESP foi ligado/reiniciado. Logo em seguida após passar pelo setup(), já dentro do loop(), é feito com que o LED pisque mais rapidamente, para permitir a visualização de que o código prosseguiu sem resetar.

Pensado nisto, ao testarmos o código do Software Watchdog (parte 1), percebemos que isto não ocorre, pois como foi dito anteriormente, o SW WDT, tem um tempo de ~3,2 Segundos, e dentro do laço FOR foi usado o delayMicroseconds(250000) que não faz o feed do SW WDT. Logo percebemos que o LED irá piscar 6x totalizando ~3 Segundos, e não 10. Isto ocorre pois não efetuamos o feed do SW WDT antes de acabar o tempo estabelecido, ocasionando o Reset do ESP. Podemos confirmar isto olhando o Serial Monitor, que mostra o Reset do ESP.

 

 

Agora avançando ao Software Watchdog (parte 2), você perceberá que o ESP não é reiniciado, isto pois dentro do laço FOR, colocamos um dos métodos para efetuar o feed do SW WDT, neste caso, o yield(). É possível ver que após o ESP piscar lentamente 10x, ele entra no loop() e começa a piscar rapidamente, mostrando que o código continua fluindo.

Resumo: Até aqui foi mostrado como é feito o feed do software Watchdog. É possível desabilita-lo caso seja necessário, chamando a função ESP.wdtDisable(). Agora vamos ao Hardware Watchdog!

 

Hardware Watchdog

Este HW WDT, não pode ser desabilitado, e tem o tempo de ~8 Segundos para efetuar o Reset ao micro controlador. O feed do HW WDT, é feito unicamente pela função ESP.wdtFeed(). Os outros métodos citados acima não fazem o feed o HW WDT!

A ideia deste código, é a mesma que a anterior. Adicionar um laço FOR para o LED piscar 10x, e após acabar, irá entrar no loop() piscando rapidamente o LED, indicando que não houve Reset.

Testando o código Hardware Watchdog (parte 1), percebe-se que o LED piscou ~4x e após isto, o ESP é resetado por causa que não efetuamos o feed corretamente com a função necessária. Veja que mesmo utilizando dois métodos do SW WDT, (delay e yield), o ESP irá reiniciar. Já que o ESP reseta, não é possível ver o LED piscar rapidamente após entrar no loop().

 

 

Já com o código do Hardware Watchdog (parte 2), podemos ver que o LED pisca 10x lentamente e após isto, começa a piscar rapidamente, indicando que o código não travou no laço FOR. Você deve efetuar o feed do HW WDT pela função própria, não se esqueça!

 

Colocando para funcionar

Mostraremos o funcionamento na prática do SW WDT ligado à um solenoide pequeno. Não é necessário o código, apenas entender que:

Botão da esquerda: Liga ou Desliga o solenoide.

Botão da direita: Gera um travamento no sistema por um loop infinito (While).

 

Ao inicio do código, o solenoide é ativado 2x, indicando o inicio do programa. Podemos perceber que o controle do solenoide funciona perfeitamente, invertendo seu estado atual. Mas após gerar um evento que trava o ESP, o botão de controle do solenoide para de funcionar, isto acontece pois o ESP travou!

Mas logo após ~3 Segundos, o ESP é reiniciado automaticamente pelo Software Watchdog e os controle voltam a funcionar.


Fechamento

Aprender a utilizar esta ferramenta de extrema importância em projetos é quase indispensável se você pretende “seguir carreira” nesse mundo. Um sistema travado por gerar danos grandes nas mais diversas áreas e situações, sempre tome cuidado com a garantia de funcionamento do seu projeto! Dúvidas? Sugestões? Críticas? Comente abaixo!

Privacy Preference Center