Como pegar hora da Internet com ESP32 (e ESP8266?)

Esse artigo de como pegar hora da Internet com ESP32 não é nada complexo nem elaborado e é baseado em um sketch, mas acho bom escrever a respeito para não perder tempo com isso quando estiver implementando o recurso no Cuco  para fazer o ajuste de hora buscando a informação na Internet (as peças de correção e mais 2 relógios cuco completos chegam em mais um ou dois dias).

Bem, tendo em mente que o relógio só precisa se conectar à Internet caso o ajuste de hora deva ser feito de forma automática, após pegar a hora ele não precisará mais ficar online. Mas se quisermos, por exemplo, escolher o som do cuco, do sino e intervalo de toque (veremos detalhes sobre tudo isso no artigo correspondente), pode ser bom mantê-lo disponível no modo AP. Vamos focar exclusivamente em buscar a hora na Internet e imprimir na serial.

Configurar WiFi no ESP32

Tem duas maneiras de fazer. Acredito que as pessoas quase sempre preferem o caminho mais simples, mas tem o jeito ESP-IDF de fazer. Vou começar por ele e depois mostro o mais simples, que será o utilizado no sketch de exemplo.

ESP-IDF

#include "esp_wifi.h"
#include "esp_wpa2.h"
#include "esp_event_loop.h"

...
static void initialise_wifi(void){
    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_start() );
    uart_write_bytes(UART_NUM_0, (const char *) "WiFi configurado\n", 20);
}

Fora de loop() e setup(), crie essa função com o nome que desejar. A primeira linha da função inicializa o adaptador, então a segunda linha checa por erros, que seriam exibidas na serial.

Na terceira linha pega-se as configurações padrão, então as 3 linhas posteriores exibem os erros, caso ocorram durantes os processos:

  • Inicialização do wifi, utilizando as configurações padrão.
  • Modo de inicialização – no caso, station (poderia ser AP).
  • Inicia  a conexão.

A última linha exibe na serial a mensagem de ok. Mas não vou mostrar como configurar a UART com recursos nativos do ESP-IDF, tem outros artigos explicando isso, é só clicar em ESP32 no menu aí em cima da página.

Basta chamar essa função em setup() para suceder a conexão.

Arduino API

Agora vamos do jeito fácil.

#include <WiFi.h>
const char* ssid       = "SEU_SSID";
const char* password   = "SUA_SENHA";
...

void setup(){
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
...
}

Eu não faço questão de decorar, só fiz questão de aprender, compreender. Portanto, quando não lembro tudo de cabeça, recorro às minhas próprias referências e, sendo assim, sempre prefiro usar o modo do ESP-IDF.

Pegar hora da Internet com ESP32

Alguns parâmetros precisa ser ajustados, mas a quantidade de código para pegar a hora é insignificante.

#include "time.h"

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = -3600*3;

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

...
void setup(){
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
...
}

Primeiro, incluímos a biblioteca time.h e declaramos as variáveis com o nome do servidor ntp (os servidores ntp são serviços para sincronização de hora em servidores de uma estrutura – e serve também para qualquer outro computador). Em seguida,  gmtOffset_sec em 0 (veremos outra hora) e então daylightOffset_sec em -3:00. Cada hora tem 3600 segundos e o horário é baseado em GMT (Greenwich Meridian Time – ou, Meridiano de Greenwich), Como estamos à esquerda do Meridiano e temos mais de um fuso (porque vamos de -2:00 à -5:00 e temos horário de verão em algumas regiões), devemos subtrair o número de horas em relação ao ponto 0, conforme a região do país e época do ano em que estivermos.

Depois temos a função printLocalTime, apenas para exibir o resultado formatado. Em setup(), ela é chamada depois de configTime(), que faz a busca no servidor conforme descrito acima.

Código completo para pegar hora da Internet com ESP32

O código completo para testes é esse, lembre-se apenas de ajustar o fuso e o login da sua rede WiFi. A desconexão é feita após pegar a hora, mas se quiser utilizar para outro propósito, apenas remova-a.

#include <WiFi.h>
#include "time.h"

const char* ssid       = "SEU_SSID";
const char* password   = "SUA_SENHA";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 0;

//nao esqueca de ajustar o fuso
const int   daylightOffset_sec = -3600*3;

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Falha ao obter a hora");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);
  
  //connect to WiFi
  Serial.printf("Conectando em %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" Feito");
  
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop()
{
  delay(5000);
  printLocalTime();
}

Quase nada de código para pegar hora da internet com esp32, hum? Mas no cuco o trabalho vai além. Bem além, espero que acompanhe os próximos artigos!

Pegar hora da Internet com ESP32

Siga-nos no Do bit Ao Byte no Facebook.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR

https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR

https://www.facebook.com/groups/raspberrybr/
Orange Pi BR

https://www.facebook.com/groups/OrangePiBR/
Odroid BR

https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR

https://www.facebook.com/groups/SistemasEmbarcadosBR/

Sistemas Eletrônicos

https://www.facebook.com/groups/544679592355388/

Projetos Arduino | Eletrônica

https://www.facebook.com/groups/projetosarduinoeletronica/

ESP8266 e ESP32

https://www.facebook.com/groups/ESP8266BR/

ARM Brasil

https://www.facebook.com/groups/508153815944410/

MIPS BR

https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte

https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

 

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

2 comentários em “Como pegar hora da Internet com ESP32 (e ESP8266?)

Fechado para comentários.