RESOLVIDO - Duvida - Software RTC sincronizado com NTP - ESP8266 via IDE Arduino

Bom dia pessoal,

Já estou batalhando com meu wemos mini, estou gostando da plaquinha, consegui montar um webserver, acendi um led hehe, no entanto a maioria dos meu projetos necessitam de um RTC, e a função que mais me interessou nesses esp's é o RTC interno e a capacidade de realizar conexão NTP.

No entanto os exemplos de NTP que consegui encontrar na NET sempre dão erro, eu encontrei um que é recente no GItHub é esse Lib aqui a ultima atualização é do ddia 20/08

https://github.com/gmag11/NtpClient

Mas infelizmente a minha IDE 1.6.6 não reconheceu, dando o seguinte erro abaixo, mas instalei certinho como todas as outras libs

arduino-1.6.6-windows\arduino-1.6.6\libraries\NtpClient

exit status 1
Erro compilando.

Nesse exemplo do Ivan Grokhotkov  esta com uma falha no código ele mesmo removeu do GitHub dele devido a falha

https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiF... Código

exit status 1
'sendNTPpacket' was not declared in this scope

Exibições: 2555

Responder esta

Respostas a este tópico

Esclarecendo:

 Network Time Protocol (NTP) time server

Difícil hein ! Se o Ivan não conseguiu ainda, é porque não é facil não ! Ele que adaptou a IDE do Arduino para o ESP8266. 

Jã tentou com a IDE 1.6.11 ?  A mais recente ? 

https://www.arduino.cc/en/Main/Software

Murta, acho que consegui alguma coisa depois de muito apanhar, dei uma "arrumada" no código do Ivan Grokhotkov, agora esta funcionando, para imprimir a hora local.

Esse negocio de Unix time é meio chato pq ele conta o tempo a partir de 1970 em segundos, então é possivel saber o dia e hora exatos através de algumas formulas extensas considerando horario de verão fuso, ano bissexto, mas de inicio corrigi com o fuso local, o que já da para brincar com alguns futuros projetos hehe.

O problema não era IDE, mas sim uma questão de lógica, estava na sequência errada algumas funções.

Em anexo o exemplo de NTP que funcionou no meu ESP8266

Anexos

Fiz uma nova catação na net, verifiquei uma erro no meu código corrigi, agora ele corrige corretamente o fuso, minha gambiarra não havia dado certo. melhorei um pouco a estrutura para ficar o mais simples possível.

Mas como faço para ele manter a contagem durante as sincronizações com o RTC interno?, considerando que este código apenas puxa a informação, pois a internet sempre oscila ou cai, não da para depender 100% da rede. Desconsiderando a falta de energia e claro.

Anexos

Estou em dúvida ! Afinal o módulo ESP8266 tem um relógio interno RTC ou não?

No forum ESP8266 informa que não tem :

http://www.esp8266.com/viewtopic.php?f=8&t=4289

ESP8266 doesn't have an internal RTC.

E no forum da Espressif informa que tem um RTC :

http://bbs.espressif.com/viewtopic.php?t=107&sid=349a772d3a2bbd...

Qual a sua conclusão ? 

Parece que realmente o ESP8266 tem um contador RTC interno. Mas como todos os RTC internos não são precisos. 

http://bbs.espressif.com/viewtopic.php?f=65&t=2304&p=7386&a...

 (RTC counter is too innacurate and drifts in time or with temperature)

Recomendo que use um RTC externo DS3231 ou outro...

Pretendo encomendar alguns destes em breve, eu gostei daqueles para rasberry pi parecem bem práticos.

Só para constar, não é o DS1307 que é impreciso, mas sim o cristal, notem que é o cristal que precisa ter uma boa qualidade.

Vou exemplificar, eu ganhei um relógio digital, de uma companhia de transporte rodoviário, quando estive na Espanha, eu gostava muito do relógio, mas ele adiantava, e bastante, em alguns dias já se notavam os minutos querendo correr mais do que deveria, kkk.

Depois de anos assim, pois hoje em dia, temos relógio em qualquer lugar, resolvi trocar o cristal, e retirei o cristal de uma placa mãe de computador da marca ASUS, que operava com um Pentium 4.

Como resultado, ficou perfeitamente sincronizado com o celular, já a várias semanas.

Então, antes de saírem atirando no pobre coitado do DS1307, que na verdade é só um contador com um oscilador, experimentem usar um bom cristal, como por exemplo, o cristal de uma placa mãe de computador, e de marca boa.

pois é, ja ouvi falar sobre isso, mas nunca tive oportunidade de achar uma placa para arrancar o cristal.

Então, eu não sei na sua região como é, mas por aqui as assistências técnicas de informática mandam para o lixo (reciclagem) então talvez dando uma passada em alguma oficina de manutenção de computador possa conseguir as placas.

Boa sorte!

Interessante, eu havia encontrado antes varias bibliografias que citam a existência desse RTC, com alguns exemplos complexos de uso dele, em especial no deep sleep. Agora fico na duvida se tem ou não.

No entanto seria uma questão de uso de terminologia inadequada de minha parte, mas nesse link http://www.esp8266.com/viewtopic.php?f=8&t=4289 o martinayotte matou minha charada.

A forma de meu questionamento seria em como utilizar os dados obtidos via NTP para sincronizar um relógio simples de software?

Tem sim o RTC, e  é usado para funções como SLEEP.

Mas como eu já disse, os RTCs internos não são precisos. 

Se for usar um RTC externo (ou interno) , capture o Date/Time do relógio do servidor NTP e acerte o rélógio RTC com esses dados. Qual a dúvida ? 

Então, não sei fazer rsrs

tentei fazer assim  mas acho que não é melhor forma, mas mesmo assim da erro

fica assim na serial

Unix time = 1472563715
hora local:00:00:14
sending NTP packet...

(...) trecho do codigo

unsigned long epoch = secsSince1900 - seventyYears;// obtem valor em Unix time
Serial.println(epoch);
// imprime hora local
int h, m, s;// hora, minuto, segundos
h = (epoch % 86400L) / 3600; // converte unix em hora (86400 equals secs per day)
m = (epoch % 3600) / 60; // converte unix em minuto (3600 equals secs per minute)
s = (epoch % 60); // converte unix em segundo

int seg = h, min = m, hor = s; //  recupera o valor obtido do NTP
char hora[30];// concatena a impressão da hora
static unsigned long ult_tempo = 0;
int tempo = millis();
if (tempo - ult_tempo >= 1000) {
ult_tempo = tempo;
seg++;
}
if (seg >= 60)
{
seg = 0;
min++;
}
if (min >= 60) {
min = 0;
hor++;
}
if (hor >= 24)
{
hor = 0;
min = 0;
}
// wait ten seconds before asking for the time again
sprintf( hora, "%02d:%02d:%02d", hor, min, seg);// concatena os valores h,m,s
Serial.print("hora local:");
Serial.println (hora);
delay(1000);
}

(...) trecho do codigo

segue o código  completo no pastebin

http://pastebin.com/ZpTraNKD

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço