
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:



