Manual

do

Maker

.

com

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

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.he 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!

getTimeEsp32.webp
Siga-nos no Manual do Maker no Facebook.

Duas seriais no ESP32, ESP32 com Nextion e motor de passo

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.