Manual
do
Maker
.
com
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.
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.
#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:
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.
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.
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.
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!
Duas seriais no ESP32, ESP32 com Nextion e motor de passo
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.