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!
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!
2 thoughts on “Como pegar hora da Internet com ESP32 (e ESP8266?)”
Comments are closed.