Bom dia queridos amigos, Gostaria de solicitar uma ajuda para vcs.
Eu estava com um problema em acionar uma sirene varias vezes por dia... tinha comprado temporizadores específicos para isso, mas depois de um certo tempo a hora não ficava correta com o servidor da empresa
e isso já estava causando problema pois os funcionários estavam batendo o ponto na hora errada, então pensei comigo mesmo... vou achar uma forma do arduino pegar a hora do servidor via NTP e assim acionar um rele para tocar a sirene em determinado tempo pre configurado.
encontrei um programa pronto da biblioteca do arduino para conseguir coletar a hora via NTP para um servidor externo(internet)... então apenas modifiquei o IP para o servidor interno(rede), e show de bola configurei os horários com um IF e acionando uma saída por RELE... e ate então estava as mil maravilhas.
O problema que esta acontecendo é que as vezes a sirene trava acionada, só para se resetar o arduino...mas não é um problema persistente que acontece em um determinado horário... é aleatorio as vezes acontece as 7:00:00 as vezes acontece 11:30:00 e etc... já se passou meses sem dar esse problema como no mesmo dia já ocorreu 2 vezes
Segue link do programa, nao consegui postar diretamente aqui pois passou o limite de caracteres
Utilizo o comando asm volatile (" jmp 0"); depois de cada batida para o Arduíno reiniciar e coletar novamente o horário do servidor.
Alguém tem alguma explicação para isso ou alguma outra forma de resolver esse problema?
Não utilizar essa instrução é o primeiro passo. Porque necessitas de fazer isso para ir buscar a hora?
Ele busca a hora apenas quando é ligado... e foi o único comando que achei para faze-lo reiniciar
Pesquisa por watchdog... essa é a maneira de o fazer reiniciar. Além do mais, porque não mudar a instrução de sincronização da hora para dentro da função loop??
bubulindo:
Pesquisa por watchdog... essa é a maneira de o fazer reiniciar. Além do mais, porque não mudar a instrução de sincronização da hora para dentro da função loop??
achei esse outro comando
void(* resetFunc) (void) = 0;
resetFunc();
para ele reiniciar... funcionou do mesmo jeito.
Se eu colocar a instrução de sincronização dentro do loop, ele vai ficar buscando uma hora nova todo tempo??
O problema não é a hora... a hora esta correta para mim... meu problema e que as vezes o arduino trava com o rele acionado... mantendo a sirene ligada....
Essas instruções são um problema porque não fazem reset do chip, apenas voltam ao inicio... logo poderão haver posições de memória com valores que dão problemas ao correr código.
Os relés costumam também dar problemas, logo seria bom teres a certeza que a alimentação é apropriada para alimentar um relé e também um condensador para tentar minimizar as baixas de tensão ao activar o relé.
Por último, a hora vai desviando a pouco e pouco, mas não deixa de continuar a contar, como tal, podes usar o relógio interno e utilizares um pedaço de código para correr a sincronização com o servidor.
Algo como:
unsigned code sync = 0;
if (hora == 0 && minuto == 0) sync = 0;
if (hora == 5 && minuto == 0 && sync == 0) {
sync = 1;
//corre codigo de sincronização.
}
Isto corre a sincronização todos os dias às 5 da madrugada (se tiveres o relógio em modo de 24 horas).
Simples e escusas de andar a fazer reset do Arduino.