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.
Autor: Thales Ferreira