10 de janeiro de 2026

Reset no Arduino

Em alguns projetos pode surgir a necessidade de reiniciar o Arduino, sem apertar o botão físico de reset.

Podemos resetar nosso circuito via software, mas é importante saber que nem toda forma de reset funciona da mesma maneira.

Já vimos que o Watchdog Timer é uma forma de proteger o circuito contra eventos não esperados, efetuando o reset automático.
Mas pode existir situações que precisaremos que o circuito seja reiniciado, seja por algum gatilho automático, que não envolva erros, ou por um gatilho manual, como um comando enviado remotamente.

A maneira mais comum de um reset via software é forçar a execução do programa a voltar para o início, fazendo o setup() rodar novamente.

Funciona como um "recomeçar o código", mas não é um reset completo. Alguns periféricos e configurações internas podem continuar como estavam, o que pode causar comportamentos estranhos em projetos mais complexos.

Nesse caso, é comum utilizar a linha de comando "asm volatile ("jmp 0");" ou declarar a função "void(* resetFunc) (void) = 0;".

Uma outra maneira é forçar o pino RESET para nível baixo, provocando um reset real, equivalente a pressionar o botão da placa. Mas exige ligação de hardware extra e é necessário configurar um pino do Arduino para esse uso e, dependendo do projeto, podemos não ter disponível.

A melhor forma de fazer um reset por software é usando o watchdog timer, e configurando com um tempo muito curto e deixando ele expirar. Dessa maneira o Arduino sofrerá um reset completo de hardware, exatamente como se o botão de reset tivesse sido pressionado.

Segue o código fonte de exemplo com comentários para melhor entendimento.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*----------------------------------------------------------
  Programa : Reset no Arduino com Watchdog Timer
  Autor    : Fellipe Couto [ https://www.efeitonerd.com.br ]
  Data     : 10/01/2026
  ----------------------------------------------------------*/
#include <avr/wdt.h>  //Biblioteca do Watchdog Timer

void setup() {
  //Configura o pino 13 (led da placa) e liga o led
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  //Inicia a comunicação serial e exibe a mensagem
  Serial.begin(115200);
  Serial.println("Arduino inicializado!");
}

void loop() {
  //Exibe o valor do millis na serial
  Serial.println(millis());

  //Se o valor do millis for maior ou igual a 3000 executa a função resetArduino()
  if (millis() >= 3000) {
    resetArduino();
  }

  delay(400);
}

void resetArduino() {
  wdt_enable(WDTO_15MS);  //Ativa o Watchdog Timer com timer de 15 milissegundos
  while (true) {}         //Loop infinito para estourar o tempo do Watchdog Timer
}

Nenhum comentário:

Postar um comentário