Introdução ao RTC

Olá amigos, estou começando agora a trabalhar com o RTC mas estou enfrentando grandes dificuldades. O conteúdo que encontrei é sempre excessivamente direto, não entendi a maioria dos códigos e lógicas que tratam sobre isso... Enfim.

  1. Alguém poderia me introduzir este assunto ou possui alguma aula que faça isso de forma "fundamental" e didática?

  2. Pretendo construir algumas rotinas que tornam VariávelX = HIGH em determinado horário.

  3. Variar o horário que o item 2 ocorre, de acordo com a data, por exemplo, de Janeiro até Junho irá disparar 13h, de Julho até Dezembro irá disparar 15h.

Agradeço desde já a ajuda!!

Que tipo de RTC estamos a falar? Que tipo de Arduino?

É externo ou interno? O que não percebes nos códigos exemplo?

Boa tarde @nicolasmmp

o que vou postar aqui é uma versão simplificada traduzida do original:

por favor leia com atenção e ajude-nos a ajuda-lo.

Olá,

As pessoas que tentam ajudar em seu projeto são voluntários que fazem isso de graça em seu tempo livre.
Se você seguir essas diretrizes, isso nos ajudará a ajudá-lo e fazer seu projeto funcionar rapidamente.

Sem as informações corretas é difícil ou impossível dar-lhe a ajuda de que necessita e tudo o que acontece
é uma longa troca de mensagens enquanto tentamos obter as informações de que necessitamos para o ajudar.
Isso é frustrante para você e para nós.

Abaixo estão algumas coisas de que precisamos que muitas vezes não percebem as pessoas que postam pela primeira vez.

Hardware:


Precisamos saber exatamente qual hardware você possui. Precisamos saber qual placa Arduino (ou outra marca, como ESP32)  você está usando e exatamente a que outro hardware está conectando.
Quanto mais detalhes tivermos, mais fácil será ajudar.

Se você estiver usando algo que não seja um produto Arduino, é útil ter um link para a folha de dados
técnicos ou um link para onde você o comprou.

Problemas de código:


só podemos encontrar problemas no código que podemos ver. Forneça seu código completo em arquivo

Postar um pedaço de código geralmente é inútil. O problema geralmente está em outra parte do programa.

Antes de postar o código, use Ferramentas / formatação automática na parte superior do IDE.
Isso torna o código muito mais fácil de ler e provavelmente você mesmo o achará muito útil.
Ao postar códigos ou printouts use tags .

Não publique uma imagem de código em vez do próprio código, ou uma imagem de mensagens de
erro em vez das próprias mensagens de erro.

É muito importante ter clareza sobre o que se espera do código e o que acontece em seu lugar.
Código SEMPRE funciona, essa é a natureza do código. Se ele faz o que você espera é uma coisa
totalmente diferente.

Precisamos saber o que você esperava que o código fizesse e o que aconteceu em vez disso.

Esquemas ou diagramas de circuito:


A linguagem da eletrônica é um diagrama esquemático ou de circuito. Longas descrições do que está conectado
ao que geralmente são inúteis. Um esquema é um desenho do que se conecta ao quê, por favor,
faça um e fotografe.

Não nos importamos se for desenhado à mão, desalinhado e não usar os símbolos corretos.
Por favor, não publique diagramas de Fritzing. Eles podem ter uma boa aparência, mas são muito fáceis de

interpretar mal.

Se você quiser usar um software de computador para criar um esquema, experimente o Eagle ou o KiCad .

DIGITAR EM MAIÚSCULAS é considerado GRITO.

Isso não vai te dar uma resposta mais rápida, só vai irritar as pessoas. 

Pesquisa:


Por favor, faça alguma pesquisa antes de postar. A maioria dos problemas para iniciantes já foi tratada no fórum, portanto, use a ferramenta de pesquisa do fórum.

Seja específico:
faça uma pergunta específica sobre o problema que você está enfrentando para que possamos fornecer uma resposta clara e específica.

Se você não entender alguns dos conselhos que receber, diga-o. Então, podemos explicar com mais detalhes.

Sobre nós:


Aqueles de nós que respondem a perguntas têm uma grande variedade de experiências e conhecimentos de eletrônica, alguns trabalhando com eletrônica, alguns através da eletrônica como hobby, alguns ambos.
A maioria de nós não é treinada como professores, então provavelmente perdemos os pontos mais importantes
de como ensinar e explicar as coisas de forma eficaz.

Não somos, com raras exceções, funcionários ou representantes do Arduino.

Sobre você:


Nós só sabemos sobre você e seu projeto o que você nos diz. Se você nos contar seu nível de experiência com eletrônicos ou microcontroladores, podemos adaptar nossa resposta ao seu nível de conhecimento. Também não sabemos se você tem problemas com o inglês, o idioma ou as comunicações em geral, a menos que você nos informe.

Podemos ser solidários com coisas que conhecemos, mas se você não nos contar, não sabemos.


Obrigado.

RV mineirin
1 Like

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!!!

Olá @nicolasmmp
acredito que este código que você mostra é o mesmo encontrado no link:

Correto?

Como você já acessou este link acredito que tenha lido toda a explanação sobre o uso do RTC no ESP32.
Correto?

Agora vamos para a segunda parte:
As perguntas sobre o significado dos "comandos", denota que você não tem uma base de conhecimento de programação.

E explicar estes "comandos", seria uma tarefa complexa, uma vez que eles depende do conhecimento de estruturas de linguagens de programação.

Esta programação que você postou usa a estrutura de linguagem C ( C, C++, Cplus, etc)

O que posso sugerir é que você faça um curso de C.
Existe um bom curso e que gosto muito, é o principal. É grátis. (0800)

www.learncpp.com

Se não é "bom" no inglês, use o a tradução do google em tempo real.

RV mineirin

Vou buscar aperfeiçoar isto. Obrigado.

Encontrei este canal ensinando a utilizar a lógica que preciso.

No entanto, agora estou enfrentando um problema diferente. A ESP nunca conecta na primeira tentativa, é sempre necessário resetar uma vez pelo menos para conectar.

// INCLUSÃO DE BIBLIOTECAS
#include <NTPClient.h>
#include "WiFiConfig.h"


// INSTANCIANDO OBJETOS
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "a.st1.ntp.br", -3 * 3600 , 60000); // (CONEXÃO UDP, SERVIDOR NTP, AJUSTE DE FUSO (EM MINUTOS), TEMPO DE ATUALIZAÇÃO)


void setup() {
  Serial.begin(9600);
   delay(1000); //DELAY PARA EXIBIR SERIAL.PRINT
  Serial.print("Conectando ao WiFi ");

  WiFi.begin(ssid, password); // CONECTA NO WIFI
 while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
  
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  timeClient.begin();

}

void loop() {
  
  timeClient.update(); // SINCROZINA COM O HORARIO DA INTERNET
 Serial.println(timeClient.getFormattedTime());
delay(1000);


}

Eu também tenho enfrentado este problema em alguns sketchs, e ainda não descobri o motivo.
Se você descobrir não deixe de me contar.

RV mineirin

1 Like