O que é Watchdog e como usar do ESP8266?
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!
[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
- 1 - ESP8266 (Usaremos dois NodeMCU).
- LED OnBoard
Montando o projeto
Para este exemplo, acenderemos o LED_BUILTIN do NodeMCU, este LED OnBoard, está conectado ao pino D4 do NodeMCU.
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!