O código foi escrito para IDE Arduino e compilado em ESP32.
O ESP32 tem um RTC interno que faz esse trabalho de manter a data atualizada, porém assim como os outros RTC externos que se compram com Arduino, ele também precisa de uma bateria dedicada em caso de queda da alimentação, pois, caso contrário, a hora irá se perder ou congelar. Para manter a data atualizada e de fácil gerenciamento pelo MCU, vamos utilizar a data no formato Unix time, que são os segundos corridos desde 01/01/1970.
O NTP é um protocolo para sincronização dos relógios dos computadores baseado no protocolo UDP sob a porta 123, para sincronização do relógio de um conjunto de computadores em redes de dados com latência variável. O NTP permite manter o relógio de um computador com a hora sempre certa e com grande exatidão.
Código completo
#include <WiFi.h> #include <WiFiUDP.h> #include <NTPClient.h> //-------- Configurações de Wi-fi----------- const char* ssid = "wifi"; // Substitua pelo nome da rede const char* password = "Senha"; // Substitua pela senha WiFiUDP udp; NTPClient ntp(udp, "a.st1.ntp.br", -3 * 3600, 60000);//Cria um objeto "NTP" com as configurações.utilizada no Brasil struct tm data;//Cria a estrutura que contem as informacoes da data. int hora; char data_formatada[64]; int ATUALIZAR_DH; String hora_ntp; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); // Aguarda meio segundo Serial.println("Conectando ao WiFi.."); // Conectando } Serial.println("Conectado"); // Conectado ntp.begin(); // Inicia o protocolo ntp.forceUpdate(); // Atualização . // Variável que armazena } String relogio_ntp(int retorno) { //Esta condição será chamada uma unica fez para atualizar a data e hora com NTP if (retorno == 0 || ATUALIZAR_DH == 0) { Serial.print(" Atualizando data e hora..."); hora = ntp.getEpochTime(); //Atualizar data e hora usando NTP online Serial.print(" NTP Unix: "); Serial.println(hora); timeval tv;//Cria a estrutura temporaria para funcao abaixo. tv.tv_sec = hora;//Atribui minha data atual. Voce pode usar o NTP para isso ou o site citado no artigo! settimeofday(&tv, NULL);//Configura o RTC para manter a data atribuida atualizada. time_t tt = time(NULL);//Obtem o tempo atual em segundos. Utilize isso sempre que precisar obter o tempo atual data = *gmtime(&tt);//Converte o tempo atual e atribui na estrutura strftime(data_formatada, 64, "%d/%m/%Y %H:%M:%S", &data);//Cria uma String formatada da estrutura "data" Serial.print(" Data e hora atualizada:"); Serial.println(data_formatada); ATUALIZAR_DH = 1; } if (retorno == 1) { time_t tt = time(NULL);//Obtem o tempo atual em segundos. Utilize isso sempre que precisar obter o tempo atual data = *gmtime(&tt);//Converte o tempo atual e atribui na estrutura strftime(data_formatada, 64, "%d/%m/%Y %H:%M:%S", &data);//Cria uma String formatada da estrutura "data" hora_ntp = data_formatada; } if (retorno == 2) { time_t tt = time(NULL);//Obtem o tempo atual em segundos. Utilize isso sempre que precisar obter o tempo atual data = *gmtime(&tt);//Converte o tempo atual e atribui na estrutura strftime(data_formatada, 64, "%d/%m/%Y", &data);//Cria uma String formatada da estrutura "data" hora_ntp = data_formatada; } if (retorno == 3) { time_t tt = time(NULL);//Obtem o tempo atual em segundos. Utilize isso sempre que precisar obter o tempo atual data = *gmtime(&tt);//Converte o tempo atual e atribui na estrutura strftime(data_formatada, 64, "%H%M", &data);//Cria uma String formatada da estrutura "data" hora_ntp = data_formatada; } return hora_ntp; } void loop() { Serial.println(relogio_ntp(1)); delay(1000); Serial.println(relogio_ntp(2)); delay(1000); Serial.println(relogio_ntp(3)); Serial.println(); delay(1000); }
Veja o resultado impresso na saÃda serial da IDE: