Data e hora no ESP8266 com NTP

Todos sabemos da importância do tempo, e sabemos que ele não para e não sofre nenhuma influência, pelo menos com a tecnologia que temos hoje!

No artigo de hoje, vou mostrar como utilizar o NTP (Network Time Protocol), que é um protocolo utilizado para a sincronização dos relógios dos computadores. Este protocolo é amplamente utilizado em sistemas, que nem sempre possuem grande exatidão, havendo a necessidade de sincronismo.

Em sistemas embarcados, que necessitam de relógios, é comumente utilizado o RTC (Real Time Clock), que serve para contar o tempo. O RTC pode contar com baterias dedicadas para manter a contagem do tempo mesmo na ausência de energia no restante do circuito.

RTC no ESP8266

O ESP8266, não possui um RTC convencional. O ESP tem apenas um contador de tempo que é zerado sempre que a alimentação é cortada.

Para utilizar RTC no ESP, é necessário adicionar um hardware, porém para sistemas em que quase sempre há uma conexão com a Internet, podemos utilizar o NTP como um relógio de tempo real, bastando apenas uma sincronização com o servidor de tempo.

Time Epoch

O time epoch (UNIX Time) é uma representação de tempo que conta os segundos desde o dia 1 de Janeiro 1970, e é amplamente utilizada em sistemas, já que ocupa menos espaço e simplifica algumas operações, principalmente na comparação de datas.

Para o exemplo de NTP no ESP, vamos utilizar o time epoch como representação de tempo.

Código

Para o exemplo de código, vamos utilizar a plataforma Arduino e a biblioteca NTPClient. A IDE é o platformIO.

Para a intalação da biblioteca:

platformio lib install 551

 

Note que na variável utc, definimos o fuso horário, que no caso do Brasil é UTC -3:00.

int16_t utc = -3; //UTC -3:00 Brazil

O servidor de tempo (a.st1.ntp.br), foi utilizado da base do ntp.br.

Para forçar a atualização do relógio no servidor NTP, basta chamar a função forceUpdate.

É importante lembrar que somente na inicialização ou quando a atualização é forçada, a conexão com a internet é necessária.

Para obter o horário em formato Gregoriano, utilize a função timeClient.getFormattedTime().

Conclusão

Em sistemas em que saber o tempo é importante, é essencial utilizar de um RTC, ou a técnica de sincronização com NTP. Acontece que no universo da Internet das Coisas, entende-se que a conexão com a internet não será problema, sendo assim a sincronização com o NTP é uma solução muito eficaz.

O RTC por hardware já é o mais indicado para sistemas em que não há internet.

Happy Hacking!

6 Comments

  1. tiago alexandre batista

    Opa, show de bola, agora é só fundir esse code com o projeto de webserver

    Reply
  2. Robson

    Só faltou o principal, a biblioteca do ESP8266:
    fatal error: ESP8266WiFi.h: No such file or directory

    Reply
    1. Pedro Minatel (Post author)

      Robson, está com a IDE Arduino?

      Reply
  3. Rômulo Azevedo

    É possível acionar uma saída fazendo uma comparação com o horário gerado?

    Reply
  4. Rômulo Azevedo

    É possível extrair dia, mês e ano do servidor NTP?

    Reply
    1. Pedro Minatel (Post author)

      Sim, por meios de funções de conversão de time epoch, como esse exemplo: http://www.epochconverter.com/programming/c

      Abrs,
      Pedro

      Reply

Deixe seu comentário