RTC interno do ESP32

Programação

O código abaixo esta demonstrando como usar o RTC (Real Time Clock) do ESP32 e como manter a data e a hora atualizada por meio do NTP (Network Time Protocol).



O código foi escrito para IDE Arduíno 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 Arduíno, 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.








 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include 
#include 

//-------- 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);
}

Fonte

Equipe SuaDica

Mais Dicas

[+] Veja todas
© 2012-2021 suadica.com