Bom dia!

Pessoal, eu fiz um projeto em que o Arduino me envia email a cada 15 min. Porém, depois de algumas horas ele para de enviar. Percebi que quando eu conecto meu PC nele, ele volta a mandar o email. Desconfio que isso acontece porque ele passa por um auto reset.

Minha dúvida é a seguinte: Tem alguma maneira de programar um reset a cada tantos minutos? Pois assim ele voltará a enviar os emails sem eu precisar ir resetar manualmente.

Obrigado!

Exibições: 2940

Responder esta

Respostas a este tópico

Felipe tem sim, se chama Watch DOG, ou cão de guarda, que utiliza um segundo processador do atmega328 para monitorar o funcionamento do chip, só que o tempo máximo que o arduino reseta é a cada 8 segundos

a estrutura do código com Wdt fica assim, só para exemplo

//inicio do codigo
#include //importa o wacht dog

void setup() {
// put your setup code here, to run once:

wdt_enable(WDTO_8S); //Função que ativa e altera o Watchdog
}

void loop() {
// put your main code here, to run repeatedly:

wdt_reset(); //reseta o arduino
}

//fim

materiais sobre o assunto
https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer

recomendo que nunca use WDT menor que 500ms, pois vc pode não conseguir mais reprogramar o seu arduino.

Tiago, muito obrigado. Eu não conhecia essa função ainda. Deu certo aqui.

Aqui eu faço assim: crio uma função chamada software_Reset() , e quando preciso resetar, chamo tal função

void software_Reset() 
{
        asm volatile (" jmp 0");
}

esse comando reseta o arduino via software. Apesar de não ser tão eficiente, às vezes funciona, às vezes não. Ele não é um reset "limpo", não apaga alguns registradores, mas é uma opção.

veja essa discussão sobre o assunto reset. Ali vc encontrará outras várias opções pra resetar.

Hugo, já tentei fazer isso. Mas o Arduino resetou e não voltou mais. Obrigado

Felipe, sua placa voltou?

Qualquer coisa, talvez seja necessario regravar o bootloader para o ATmega328 voltar a funcionar.

nos comentarios deste post, tem uma resposta  do fabio henrique que é muito boa;

http://labdegaragem.com/forum/topics/reset-interno-arduino?id=62230...

fabio henrique em 17 outubro 2012 at 15:14

A forma correta de resetar o AVR é usando o watchDog, ligando um pino do proprio arduino não garante que o tempo minimo em LOW do pino fará um reset pleno...

Para usar o Watchdog deve-se incluir o header no começo do sketch:

 

#include <avr/wdt.h>

Quando se trabalha com o watchdog, uma vez ativado, e não zerado, ele fará o reset 

mas voltará ativado, causando loop infinito... deve-se desativa-lo no começo do sketch(1° linha do setup)

wdt_disable();//desabilita o watchdog

No ponto do programa que quiser resetar o AVR inclua as linhas:

wdt_enable(WDTO_2S); ativa o watchdog para resetar em 2 segundos.

while(1); entra em loop até resetar...

referência:avrlibc. "

Oi amigo, entendo que o reset resolve seu problema e tudo mais, mas a questão aqui acho que seria encontrar o pq da necessidade desse reset. Veja bem, n sei bem o que vc ta mandando pro email, mas se vc estiver usando strings para montar uma mensagem, pode ser que seu problema do arduino travar esteja sendo causado por estouro da memória SRAM. Já tive esse problema em um projeto e quase morri tentando resolver.

Primeiro: faça uma rotina simples de teste, tenho usado essa abaixo e ela sempre funcionou legal. Mande o arduino escrever o resultado da rotina em cada email que vc receber, ai vc poderá saber se o problema é ou não o consumo da SRAm. Se o valor resultante da função ir decaindo a cada email recebido, com certeza esse é seu problema.

int memoryTest()
{
int byteCounter = 0;
byte *byteArray;

while ( (byteArray = (byte*) malloc (byteCounter * sizeof(byte))) != NULL )
{
byteCounter++; // if allocation was successful, then up the count for the next try
free(byteArray); // free memory after allocating it
}

free(byteArray); // also free memory after the function finishes
return byteCounter; // send back the highest number of bytes successfully allocated

}

Segundo: se o problema for esse mesmo, use a macro F( ) em suas strings, como o José Augusto explica aqui:

http://labdegaragem.com/forum/topics/dica-string-otimiza-o-de-sketc...

É bom quando achamos uma saída para nossos problemas no programa, mas temos sempre que tomar o cuidado de não usar gambiarras para não tornarmos o programa instavel ou de dificil manutenção! Eu fiz isso várias vezes e me arrependi duramente depois em alguns casos!

Espero ter ajudado!

Em tempo:

Esse código de teste que passei não é de minha autoria. Peguei ele pronto tem um bom tempo e não sei referenciar de onde tirei.

Basicamente o código faz tentar alocar vários bites na memória e depois retorna a quantidade de bites que foram alocados com sucesso, dando assim a quantidade de memória que estava livre ao rodar a rotina.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço