Estou usando uma placa ESP32, ela possui um RTC Interno. Adaptei um código que encontrei na internet e ele conta o horário de acordo com o UNIX time.
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_system.h>
#include <time.h>
#include <sys/time.h>
struct tm data;
void setup()
{
Serial.begin(9600);
timeval tv;
tv.tv_sec = 1621070029;
settimeofday(&tv, NULL);
while (1)
{
vTaskDelay(pdMS_TO_TICKS(1000));//Espera 1 seg
time_t tt = time(NULL);
data = *gmtime(&tt);
char data_formatada[64];
strftime(data_formatada, 64, "%H:%M:%S", &data);
printf("Data formatada: %s\n", data_formatada);
}}
void loop(){}
E desconheço a maior parte dos comandos e por que alguns caracteres foram empregados. Vou citá-los e expor minha dúvida em cada um.
struct tm data;
O que seria esta "struct tm" qual a razão dela existir e não uma int, por exemplo?
timeval tv;
Pelo que entendi é para criar uma estrutura temporária, mas qual a razão de se fazer necessário uma estrutura temporária?
tv.tv_sec
Sei que a função no código é para atribuir o valor do UNIX, mas o que significa este comando?
settimeofday(&tv, NULL);
Este comando faz com que o ESP32 mantenha sempre atualizando, com base no RTC, o tempo escrito em tv.tv_sec, mas para que serve o NULL? O que significa este "&tv"?
vTaskDelay(pdMS_TO_TICKS(1000));
Ele atua como um delay, mas qual a diferença entre um delay(); para este comando? O que significa esta conversão "pdMS_TO_TICKS"?
time_t tt = time(NULL);
Novamente, o que significa o NULL? O que é "time_t tt"?
*data = gmtime(&tt)
Esta serve para colocar a variável data na estrutura, mas para que serve o "*" antes de gmtime? O que é o gmtime? O que (&tt)
strftime(data_formatada, 64, "%H:%M:%S", &data);
Nesta linha definimos como parâmetro o formato da estrutura que desejamos. Minuto, Hora, Dia, Mês, Ano... No entanto, desconheço o comando srtftime e seu funcionamento.
printf("Data formatada: %s\n", data_formatada);
Nesta linha não entendi a razão do "%s\n" dentro do texto, seria para fazer um espaço?
Perceba que aqui eu praticamente disse ""não entendi NADA deste código, poderia me explicar?" e é exatamente disso que estou precisando. A maioria destes comandos desconheço pois provém das bibliotecas citadas nas includes. Caso puder me explicar, fico agradecido!
Também, se vcs conhecerem alguma fonte onde eu possa consultar isso de maneira didática, gostaria de conhecê-la também.
Muito obrigado pela atenção!!!