ESP32 – Utilizando o RTC interno do ESP32 

Se você já tentou fazer algum acionamento por datas e horários específicos, já deve conhecer os RTC’s (Real Time Clock), que são na maioria dos casos, placas externas e dedicadas a esta função. Manter uma placa dedicada para este propósito pode ser necessário quando a precisão deve ser alta e atrasos/avanços em datas e horas são indesejáveis (Clock Drift), mas em muitos casos (principalmente com internet disponível) você pode utilizar o RTC interno do seu microcontrolador (se disponível, como no caso do ESP32) para baratear produtos. Neste tutorial, nós vamos aprender a utilizar o RTC interno do ESP32 para manter a nossa data atualizada.

kit arduino robótica educacional

[toc]

O que é um RTC ?

RTC (Real Time Clock, Relógio de Tempo Real) é um “sistema” utilizado para manter datas atualizadas e “seguras” em caso de quedas de energia (na maioria do casos). 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.

 

  • Depois da data configurada no código, o ESP32 manterá a data atualizada automaticamente mesmo durante DEEP-SLEEP, então você poderá lê-la a qualquer momento que estará atualizada pro momento atual.
  • O clock do interno do RTC no ESP32 tem 5% de variação (drift), então você pode perceber a data atrasada ou adiantada caso utilize o sistema por longos períodos. Para corrigir isso, basta atualizar a data de tempos em tempos com NTP por exemplo, ou até aplicar algoritmos de correção do drift.
ESP32 Block (RTC)

O que é Unix time ?

Unix time é a contagem de segundos desde 01/01/1970 que os sistemas computacionais usam para guardar datas em memórias, efetuar operações como IF’s e também mostrar as informações de data e hora ao usuário formatadas, claro. Foi esse mesmo Unix time que foi responsável pelo famoso “Bug do milênio” nos anos 2000, que fez alguns computadores voltarem para 01/01/1970 por conta da variável utilizada sofrer de Overflow.

No momento que escrevo esse post, o Unix time esta com o valor de 1551355200 segundos desde 01/01/1970. Se você quer pegar o Unix time de agora ou uma data especifica, consulte: https://www.unixtimestamp.com/


Mãos à obra – Utilizando o RTC do ESP32

Componentes necessários

Programando

Foi utilizada a ESP-IDF, mas funciona perfeitamente na Arduino IDE bastando trocar o void app_main() pelo void setup() e adicionar o void loop() ao fim do código, como é feito na Arduino IDE.

Se você ainda não conhece ou instalou a ESP-IDF (local de programação nativo do ESP32), veja nosso artigo clicando AQUI.

A biblioteca responsável pelas funções de tempo (time.h) já vem baixada por padrão nos arquivos do ESP32, basta apenas inclui-la.

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>
#include <time.h>
#include <sys/time.h>

struct tm data;//Cria a estrutura que contem as informacoes da data.


void app_main()
{
	timeval tv;//Cria a estrutura temporaria para funcao abaixo.
	tv.tv_sec = 1551355200;//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.
	



	while (1)
	{
		vTaskDelay(pdMS_TO_TICKS(1000));//Espera 1 seg


		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

		
		char data_formatada[64];
		strftime(data_formatada, 64, "%d/%m/%Y %H:%M:%S", &data);//Cria uma String formatada da estrutura "data"


		printf("\nUnix Time: %d\n", int32_t(tt));//Mostra na Serial o Unix time
		printf("Data formatada: %s\n", data_formatada);//Mostra na Serial a data formatada




		/*
			Com o Unix time, podemos facilmente controlar acoes do MCU por data, visto que utilizaremos os segundos
			e sao faceis de usar em IFs

			Voce pode criar uma estrutura com a data desejada e depois converter para segundos (inverso do que foi feito acima)
			caso deseje trabalhar para atuar em certas datas e horarios

			No exemplo abaixo, o MCU ira printar o texto **APENAS** na data e horario (28/02/2019 12:00:05) ate (28/02/2019 12:00:07)
		*/
		if (tt >= 1551355205 && tt < 1551355208)//Use sua data atual, em segundos, para testar o acionamento por datas e horarios
		{
			printf("Acionando carga durante 3 segundos...\n");
		}
	}

	
}

 

Colocando para funcionar

Testando o código

Entendendo a fundo

struct tm data;
struct tm
{
   tm_sec;         /* seconds,  range 0 to 59          */
   tm_min;         /* minutes, range 0 to 59           */
   tm_hour;        /* hours, range 0 to 23             */
   tm_mday;        /* day of the month, range 1 to 31  */
   tm_mon;         /* month, range 0 to 11             */
   tm_year;        /* The number of years since 1900   */
   tm_wday;        /* day of the week, range 0 to 6    */
   tm_yday;        /* day in the year, range 0 to 365  */
   tm_isdst;       /* daylight saving time             */
};

A estrutura “data” nos permite obter os dados individuais da data atual, como por exemplo mês, dia, hora, segundo, ano, etc.

Se você deseja obter apenas a hora atual, basta utilizar data.tm_hour

 

 

strftime(data_formatada, 64, "%d/%m/%Y %H:%M:%S", &data);

A função strftime() formata a data atual (da estrutura indicada) num formato que você deseja. Caso você queira alterar o formato da data, veja mais detalhes clicando AQUI


Considerações finais 

Unix time é de enorme importância na computação por facilitar extremamente as operações por datas e horários, já que podemos trabalhar facilmente com os segundos dentro de IF’s e etc. Continue praticando e olhe a referência abaixo para mais detalhes sobre a biblioteca time.h utilizada.


Referências

https://en.wikipedia.org/wiki/Unix_time

https://pt.wikipedia.org/wiki/Problema_do_ano_2000

https://www.tutorialspoint.com/c_standard_library/time_h.htm

Privacy Preference Center