24 de agosto de 2019

Watchdog Timer - ESP32

Um sistema de Watchdog é responsável por reiniciar o circuito caso ocorra travamentos.
Vamos ver como configurá-lo no ESP32.


Na postagem Watchdog Timer - Reset Automático do Circuito foi detalhado melhor como funciona um watchdog e, utilizamos um Arduino.

Nesse exemplo veremos como utilizar no ESP32.

A biblioteca do watchdog para o ESP32 é a <esp_task_wdt.h>.

As principais chamadas para seu funcionamento são:

esp_task_wdt_init(tempo em segundos, verdadeiro/falso para reinicialização);
Essa função inicializa o watchdog passando dois parâmetros. O primeiro é o timeout, que deve ser informado em segundos e é do tipo inteiro. O segundo é do tipo booleano e informa se ao atingir o timeout deve ser reinicializado o circuito.

esp_task_wtd_add(tarefa);
Essa função adiciona uma tarefa ao watchdog. Para a tarefa atual devemos passar o parâmetro NULL.

esp_task_wdt_reset();
Essa é a função responsável por resetar o cronômetro do watchdog, não permitindo que o timeout seja atingido.

O exemplo abaixo foi configurado um watchdog com timeout de 4 segundos.
Através do monitor serial é possível acompanhar o funcionamento.

/*---------------------------------------------------------
  Programa : WATCHDOG TIMER - ESP32
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 24/08/2019
  ---------------------------------------------------------*/
#include <esp_task_wdt.h> //Biblioteca do watchdog
#define BUTTON 2          //Porta de conexão do botão

void setup() {
  //Configura a porta com pull-up interno
  pinMode(BUTTON, INPUT_PULLUP);

  //Inicia a comunicação serial e exibe a mensagem
  Serial.begin(115200);
  Serial.println("WATCHDOG TIMER - ESP32");
  Serial.println("Mantenha o botao pressionado por mais de 4 segundos para o reiniciar o circuito.\n");

  //Habilita o watchdog configurando o timeout para 4 segundos
  esp_task_wdt_init(4, true);
  esp_task_wdt_add(NULL);
}

void loop() {
  //Variável para contagem de tempo
  int count = 1;

  //Fica preso no loop enquanto o botão estiver pressionado
  while (digitalRead(BUTTON) == LOW) {
    Serial.print("Botao pressionado... ");
    Serial.println(count);
    count++;
    delay(1000);
  }

  //Reseta o temporizador do watchdog
  esp_task_wdt_reset();
}

Nenhum comentário:

Postar um comentário