top of page
Crescer (fundo transparente)_Negativo_pn
Você sabia que a Crescer ensina, fornece e faz soluções de automação e IoT com Arduino e ESP32?

Fale com um especialista

2.png
3.png
1.png

Data e hora no ESP32 sem RTC

Atualizado: 6 de mar.

Em projetos de Internet das Coisas (IoT) e dispositivos embarcados, obter informações precisas de data e horário é fundamental para uma variedade de aplicações. Normalmente, a solução para essa necessidade é o uso de um circuito RTC (Real-Time Clock) externo, que fornece uma fonte confiável de tempo mesmo em casos de reinicialização ou falta de energia. No entanto, a ESP32 oferece uma alternativa interessante: a possibilidade de obter data e horário utilizando seu RTC interno, sem a necessidade de componentes adicionais.


Neste artigo, exploraremos como a ESP32 pode ser configurada para rastrear o tempo de maneira confiável, com auxílio de uma conexão WiFi, eliminando a necessidade de um circuito RTC externo.



Sumário



RTC interno do ESP32


O RTC (Relógio de Tempo Real) é um circuito utilizado por dispositivos digitais para manter e calcular a data e hora de forma precisa. O ESP32 possui um RTC interno que desempenha essa função. No entanto, assim como outros RTCs externos, ele também requer uma bateria dedicada para garantir o funcionamento contínuo em caso de interrupção no fornecimento de energia. Sem essa bateria, a data poderá ser perdida ou ficar congelada, comprometendo a precisão do relógio interno.


Após configurar a data no código, o ESP32 manterá automaticamente seu valor atualizado, permitindo o acesso à data e hora atuais a qualquer momento. No entanto, é importante considerar que o clock interno do RTC do ESP32 pode ter uma variação de aproximadamente 5%, o que pode levar a uma discrepância ao longo de longos períodos de tempo. Para evitar esse problema, é altamente recomendado atualizar periodicamente a data utilizando uma conexão com a internet. Dessa forma, você garantirá uma precisão mais consistente dos valores no seu dispositivo ESP32.



Como utilizar RTC interno no ESP32


O código utilizado para esse blog foi adaptado a partir do exemplo SPIFFS_time, disponível na IDE do Arduino, aqui serão apresentados os principais pontos do código. O primeiro passo é configurar a conexão com a rede WiFi.


const char* ssid     = "nome_da_rede";
const char* password = "senha";

Para atualizar e definir os valores do RTC interno com o horário atual utilizando uma conexão com a internet, primeiro é necessário definir o fuso horário (variável timezone) e o deslocamento da luz do sol (variável daysavetime). O deslocamento da luz do sol não é tão importante para o projeto.


long timezone = -3;
byte daysavetime = 1;

Além disso, o endereço do Servidor NTP é especificado. O projeto pool.ntp.org realiza uma seleção automática de servidores de tempo que estão fisicamente próximos à você.


configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");

Depois do RTC interno configurado o ESP32 não precisa mais estar conectado à internet. Nesse ponto, o hardware interno do RTC irá fazer todo trabalho necessário para implementação do relógio. Porém, é interessante que os valores do dispositivo sejam atualizados pela rede periodicamente, para garantir a exatidão do horário.


Para obter os valores do RTC interno, primeiro declaramos uma variável chamada tmstruct com o tipo de estrutura struct tm. Essa estrutura é usada para representar informações de data e hora e faz parte da biblioteca padrão C "time.h". Ela será responsável por armazenar data e hora quando é feita a leitura do RTC.


struct tm tmstruct ;

A função getLocalTime é utilizada para atribuir o valor do RTC para tmstruct.

getLocalTime(&tmstruct);

Por fim, organizamos os valores das variáveis para exibi-las de forma legível no monitor serial.


String date = (((tmstruct.tm_year) + 1900) + "-" + String(( tmstruct.tm_mon) + 1) + "-" + String(tmstruct.tm_mday));

String hour = (String(tmstruct.tm_hour) + ":" + String(tmstruct.tm_min) + ":" + String(tmstruct.tm_sec));

Na figura abaixo, podemos observar o resultado obtido no monitor serial.




Código exemplo


O código a seguir foi utilizado como exemplo para demonstrar o funcionamento do RTC neste blog.


#include <time.h>
#include <WiFi.h>

const char* ssid     = "nome_da_rede";
const char* password = "senha";

long timezone = -3;
byte daysavetime = 1;

void setup() {
  Serial.begin(115200);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  int i = 0;

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20) {
      ESP.restart();
    }
    i++;
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Contacting Time Server");
  configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");

}

void loop() {

  struct tm tmstruct ;

  tmstruct.tm_year = 0;
  getLocalTime(&tmstruct);

  String date = (((tmstruct.tm_year) + 1900) + "-" + String(( tmstruct.tm_mon) + 1) + "-" + String(tmstruct.tm_mday));
  
  String hour = (String(tmstruct.tm_hour) + ":" + String(tmstruct.tm_min) + ":" + String(tmstruct.tm_sec));

  Serial.println("Date: " + date + " - Time: " + hour);

  delay(1000);
}

Para mais informações e ver uma aplicação da utilização do RTC interno, assista ao nosso vídeo.



Neste artigo, exploramos o RTC interno da ESP32, uma solução confiável para obter informações precisas de data e horário em projetos de IoT, sem a necessidade de um circuito RTC externo. Configurar e utilizar o RTC interno é simples e eficiente, permitindo agendar eventos, registrar dados com precisão temporal e simplificar a implementação de projetos de automação e monitoramento.


Posts recentes

Ver tudo
ícone do whatsapp

Fale com um
especialista:

bottom of page