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!
ola… sei que ja faz um tempo que fez o post… mas minha duvida eh… estou usando a lib accelSteper com o esp8266 e qnt chamo stepper.runToPosition, o watchdog reseta o esp apos poucos segundos… como que insiro o ESP.wdtFeed() ? nao entendo onde ele entra no codigo….
colocando logo apos o stepper.runToPosition()… sendo em {} nao complia e sem {} nao funciona tbm
Se essa funcao fica executando por mais tempo que o watchdog, ou você edita o loop interno dessa função para alimentar o WDT, ou separa essa função em varias chamadas menores, assim você consegue fazer o feed.
Parabéns pelo trabalho! Uma dúvida:
Os Watchdog’s do esp8266 (SW WDTT e HW WDT) precisam ser ativados para funcionarem? Em caso afirmativo,como ativá-los?
Pelo que percebi no texto , pareceu que eles são automaticamente ativados quando o esp recebe alimentação e o cuidado no código será evitar o reset antes do tempo previsto.
O tempo de reset para cada Watchdog pode ser diferente dos que você mencionou?
São ativados no boot por padrão. Quando eu usava o ESP8266, não havia formas de alterar o tempo de timeout.
Parabéns pelo trabalho! Uma dúvida:
Os Watchdog’s, do esp8266 (SW WDTT e HW WDT) precisam ser ativados para funcionarem. Em casa afirmativo,como ativá-los?
Pelo que percebi no texto , pareceu que eles já são automaticamente ativados quando o esp recebe alimentação e o cuidado no código será evitar o reset antes do tempo previsto.
O tempo de reset para cada Watchdog pode ser diferente dos que você mencionou?
Quais as funções que precisam incluir yield ou delay para alimentar o SWT? Fiz todo um código para ESP32 e agr queria migrar pro ESP8266 mas não estou conseguindo devido aos resets do watchdog.
Qualquer loop/função sua que demore mais tempo que o limite do watchdog, deve conter yield(). Se alguma função interna de biblioteca demora mais que o tempo limite e ocasiona o reinicio, você deve inserir o yield() dentro dessa função na biblioteca.
hola amigo me puedes dar una mano. soy novato ….
Ótimo post continue assim
Este código foi feito para um NodeMCU ESP32 é possivel colocar em um NodeMCU ESP8266??
#include
#include
#include
#include
#include
#include
#include
//endereço I2C do MCP23017
#define MCP_ADDRESS 0x20
//ENDEREÇOS DE REGISTRADORES
#define GPA 0x12 // DATA PORT REGISTER A
#define GPB 0x13 // DATA PORT REGISTER B
#define IODIRA 0x00 // I/O DIRECTION REGISTER A
#define IODIRB 0x01 // I/O DIRECTION REGISTER B
#define PINS_COUNT 16 //Quantidade total de pinos
#define DATA_PATH “/pin_data.bin” //Arquivo onde serão salvos os status dos pinos
#define DHTPIN 5 //Pino one está o DHT22
const char *ssid = “TesteESP”;
const char *password = “12345678”;
const char *ip = “192.168.0.154”;
//Criamos um server na porta padrão o http
WebServer server(80);
//Objeto que faz a leitura da temperatura e umidade
SimpleDHT22 dht;
//Variáveis para guardar os valores de temperatura e umidade lidos
float temperature = 0;
float humidity = 0;
//Guarda o estado atual das duas portas do MCP23017 (8 bits cada)
uint8_t currentValueGPA = 0;
uint8_t currentValueGPB = 0;
//faz o controle do temporizador do watchdog (interrupção por tempo)
hw_timer_t *timer = NULL;
void setup()
{
Serial.begin(115200);
//Inicializa os valores dos pinos do MCP23017
setupPins();
//Tenta inicializar SPIFFS
if(SPIFFS.begin(true))
{
loadPinStatus();
}
else
{
//Se não conseguiu inicializar
Serial.println(“SPIFFS Mount Failed”);
}
//inicializa WiFi
setupWiFi();
//Sempre que recebermos uma requisição na raiz do webserver
//a função handleRoot será executada
server.on(“/”, handleRoot);
//Se recebermos uma requisição em uma rota que nao existe
server.onNotFound(handleNotFound);
//Inicializa o server
server.begin();
//Inicializa o watchdog
setupWatchdog();
}
void setupPins()
{
//Inicializa o Wire nos pinos SDA e SCL padrões do ESP32
Wire.begin();
//Velocidade de comunicação
Wire.setClock(200000);
//Configura todos os pinos das duas portas do MCP23017 como saída
configurePort(IODIRA, OUTPUT);
configurePort(IODIRB, OUTPUT);
}
//Função para recuperar o estado atual dos pinos no
//arquivo para que estes permaneçam após um eventual reboot
void loadPinStatus()
{
//Abre o arquivo para leitura
File file = SPIFFS.open(DATA_PATH, FILE_READ);
//Se arquivo não existe
if(!file)
{
//Na primeira vez o arquivo ainda não foi criado
Serial.println(“Failed to open file for reading”);
//Coloca todos os pinos das duas portas do MCP23017 em LOW
writeBlockData(GPA, B00000000);
writeBlockData(GPB, B00000000);
return;
}
//Faz a leitura dos valores
file.read(¤tValueGPA, 1);
file.read(¤tValueGPB, 1);
//fecha o arquivo
file.close();
//Envia os valores para o MCP23017
writeBlockData(GPA, currentValueGPA);
writeBlockData(GPB, currentValueGPB);
}
void setupWiFi()
{
//Coloca como modo station
WiFi.mode(WIFI_STA);
//Conecta à rede
WiFi.begin(ssid, password);
Serial.println(“”);
//Enquanto não conectar
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(“.”);
}
//Se chegou aqui está conectado
Serial.println(“”);
Serial.print(“Connected to “);
Serial.println(ssid);
//Configura o IP
IPAddress ipAddress;
ipAddress.fromString(ip);
WiFi.config(ipAddress, WiFi.gatewayIP(), WiFi.subnetMask());
//Exibe o endereço de IP para abrir no navegador
Serial.print(“IP address: “);
Serial.println(WiFi.localIP());
}
//função que o temporizador irá chamar, para reiniciar o ESP32
void IRAM_ATTR resetModule(){
ets_printf(“(watchdog) reboot\n”);
esp_restart_noos(); //reinicia o chip
}
//função que configura o temporizador
void setupWatchdog()
{
timer = timerBegin(0, 80, true); //timerID 0, div 80
//timer, callback, interrupção de borda
timerAttachInterrupt(timer, &resetModule, true);
//timer, tempo (us), repetição
timerAlarmWrite(timer, 5000000, true);
timerAlarmEnable(timer); //habilita a interrupção //enable interrupt
}
void loop()
{
//reseta o temporizador (alimenta o watchdog)
timerWrite(timer, 0);
//Verifica se existe alguma requisição
server.handleClient();
}
void handleRoot()
{
//Se recebeu argumentos na requisição
if(server.args() > 0)
{
//Executa a ação (on ou off) no pino do argumento
execute(server.argName(0), server.arg(0));
}
//Faz a leitura da temperatura e umidade
readDHT();
//Gera o html e o envia
String html = “”;
html.concat(head());
html.concat(body());
html.concat(“”);
server.send(200, “text/html; charset=UTF-8”, html);
//Salva o status dos pinos para voltar assim no próximo reboot
savePinStatus();
}
//Função para salvar o estado atual dos pinos em
//arquivo para que estes permaneçam após um eventual reboot
void savePinStatus()
{
//Abre o arquivo para escrita
File file = SPIFFS.open(DATA_PATH, FILE_WRITE);
//Se não conseguiu abrir/criar o arquivo
if(!file)
{
Serial.println(“Failed to open file for writing”);
return;
}
//Escreve os valores dos pinos no começo do arquivo
file.seek(0);
file.write(¤tValueGPA, 1);
file.write(¤tValueGPB, 1);
//Fecha o arquivo
file.close();
}
void handleNotFound()
{
//Envia para o navegador a informação que a rota não foi encontrada
server.send(404, “text/plain”, “Not Found”);
}
//Executada a ação junto ao valor (número do relê)
void execute(String action, String value)
{
//Se é uma das duas ações que esperamos
if(action == “on” || action == “off”)
{
//Os relês são numerados a partir do 1, mas o array começa do 0
//então tiramos 1
int index = value.toInt() – 1;
int status = action == “on” ? HIGH : LOW;
digitalWriteMCP(index, status);
}
}
//Retorna o cabeçalho da página com a informação do tempo
//para atualizar a página sozinho e a aparência
String head()
{
return (F(“”
“”
“” //refresh a cada 10 segundos
“”
“body{”
“text-align: center;”
“font-family: sans-serif;”
“font-size: 14px;”
“}”
“p{”
“color:#555;”
“font-size: 12px;”
“}”
“.button{”
“outline: none;”
“display: block;”
“border: 1px solid #555;”
“border-radius:18px;”
“width: 150px;”
“height: 30px;”
“margin: 10px;”
“margin-left: auto;”
“margin-right: auto;”
“cursor: pointer;”
“}”
“.button_off{”
“background-color:#FFF;”
“color: #555;”
“}”
“.button_on{”
“background-color:#2C5;”
“color: #fff;”
“}”
“”
“”));
}
//Exibe os dados dos sensores e cria os botões
String body()
{
String b = “”
“Temperature: ” + String(temperature) + ” °C”
“Humidity: ” + String(humidity) + “%”;
//Cria um botão para cada pino que possui um relê
for(int i=0; i<PINS_COUNT; i++)
{
b.concat(button(i));
}
b.concat("”);
return b;
}
//Cria um botão com a aparência e ação correspondente ao estado atual do relê
String button(int number)
{
String label = String(number + 1);
String className = “button “;
className += getPinStatus(number) == HIGH ? “button_on” : “button_off”;
String action = getPinStatus(number) == HIGH ? “off” : “on”;
return “” + label + “”;
}
uint8_t getPinStatus(int pin)
{
uint8_t v;
//de 0 a 7 porta A, de 8 a 15 porta B
if(pin < 8)
{
v = currentValueGPA;
}
else
{
v = currentValueGPB;
pin -= 8;
}
return !!(v & (1 << pin));
}
//Configura o modo dos pinos das portas (GPA ou GPB)
//como parametro passamos:
// port: GPA ou GPB
// type:
// INPUT para todos os pinos da porta trabalharem como entrada
// OUTPUT para todos os pinos da porta trabalharem como saída
void configurePort(uint8_t port, uint8_t type)
{
if(type == INPUT)
{
writeBlockData(port, 0xFF);
}
else if(type == OUTPUT)
{
writeBlockData(port, 0x00);
}
}
//muda o estado de um pino desejado
void digitalWriteMCP(int pin, int value)
{
uint8_t port;
uint8_t v;
//de 0 a 7 porta A, de 8 a 15 porta B
if(pin < 8){
port = GPA;
v = currentValueGPA;
}else{
port = GPB;
v = currentValueGPB;
pin -= 8;
}
if (value == LOW){
v &= ~(B00000001 << (pin)); // muda o pino para LOW
}
else if (value == HIGH){
v |= (B00000001 << (pin)); // muda o pino para HIGH
}
//Salva os valores dos bits da porta correspondente
if(port == GPA){
currentValueGPA = v;
}else{
currentValueGPB = v;
}
//envia os dados para o MCP
writeBlockData(port, v);
}
//envia dados para o MCP23017 através do barramento i2c
void writeBlockData(uint8_t port, uint8_t data)
{
Wire.beginTransmission(MCP_ADDRESS);
Wire.write(port);
Wire.write(data);
Wire.endTransmission();
delay(10);
}
//Faz a leitura da temperatura e umidade
void readDHT()
{
float t, h;
int status = dht.read2(DHTPIN, &t, &h, NULL);
//Apenas altera as variáveis se a leitura foi bem sucedida
if (status == SimpleDHTErrSuccess)
{
temperature = t;
humidity = h;
}
}
Boa tarde!
A função (ESP.wdtDisable();) tb funciona para o ESP32?
Se sim, qual biblioteca devo utilizar?
Pois não funcionou pra mim.
Obrigado!
Não, é bem diferente. Estou planejando fazer um post sobre os 3 Watchdogs do ESP32, fique no aguardo.
Amigo, só não entendi uma coisa. Fiz os meus primeiros códigos com esp8266 e nem sabia disso, e o HW nunca resetou meu equipamento mesmo sem eu ter alimentado (com o seu feed). E você disse que o HW não alimenta automaticamente no loop. Então porque o meu esp não reseta já que eu não fiz o feed?
O loop() é implementado por uma tarefa do FreeRTOS, do mesmo modo que essa tarefa faz o feed automaticamente do SW WDT, também deve fazer do HW WDT. O HW WDT é mais indicado para travamentos (como o nome sugere) no hardware, por exemplo falha na alimentação antes do código ser iniciado/bootloader (onde o SW WDT é também), então ele é apenas para detalhes menos comuns…
Alimentando corretamente seria o que? Pelo USB ou pelo VIN?
Se não “alimentar” (resetar) o watchdog dentro do tempo estabelecido, irá reiniciar.
Cara! Valeu muito este teu post! Em breve pretendo fazer um vídeo sobre “brincadeiras com automação/monitoramento residencial” e o WATCHDOG é fundamental para a continuidade/confiabilidade!
Muito obrigado por compartilhar teus conhecimentos e parabéns pela excelente didática e organização!!!
amigão, ótimo tutorial, gostaria de saber que display você está usando no vídeo
Nextion 3.2″
Boa noite José,
Agora estou aqui… hehehe
Me tira uma dúvida, é possível incrementar um WDT para verificar a conexão da internet?
Pergunto pois estou tendo alguns problemas ao dar um “dedon” e “dedoff” no modem, meu esp32 não consegue se reconectar, na ocasião estou utilizando o Blynk para controlar algumas funções do ESP e não achei uma maneira de conseguir realizar isso, então pensei em um WDT.
Outra questão, também tive uma compreensão de que no segundo caso, quando o WDT é alimentado corretamente o LED irá piscar rapidamente se o ESP não travou no começo do código, porem se o ESP, ou alguma função travar em algum momento ele será reiniciado pelo WDT, é isso? Obrigado!!!!
Não creio que precise de um wdt próprio para isso. Faça uma função assíncrona (Um timer à chamando a cada X tempo) que verifica a conexão com WiFi (como ping no google), se o ping falhar, é só tomar as ações necessárias.
Mas respondendo mais tecnicamente sua pergunta… Você poderia ao mesmo estilo do citado acima, criar uma tarefa (FreeRTOS) responsável por verificar periodicamente a conexão com a internet e atribua ao Task WDT, que é responsavel por verificar o funcionamento de todas tarefas atribuídas no RTOS. Ainda sim, a tarefa em si que verificará a conexão e o TWDT ficará apenas verificando se a tarefa continua executando dentro do tempo limite.
bom dia. eu faço o monitoriamento da internet checando o status de minha conexão, e incremento em uma variaável, quando atinge o tempo estimado, eu chamo o esp.restart. para mim, funciona, o valor a contar, depende de quanto tempo seu procedimento leva para executar, mas acredito que dê certo.
espero ter ajudado.
Hey, I’m working on a project and each time the Watchdog runs, it clears my EEPROM which is bad
I never see this bug before… You should probably have something in your code that does not manage the EEPROM properly, check it!
had you ever trying to save the epprom after updates? generally I create a structures as variables and two procedures to read it, so I load epprom to my struct var, and after changes I write my struct into epprom with the save procedure.
I hope to help it.
Só pra ver se entendi, você coloca o led pra piscar e monitora o led se travar e o led para de piscar o esp reinicia e isso mesmo?
Há dois códigos para cada Watchdog. A primeira parte não alimenta o WDT, fazendo com que trave. Já na segunda parte, o WDT é alimentando. O LED irá piscar rapidamente se o ESP não travou no começo do código.