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.
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