A contagem de tempo. Esse é um assunto bastante falado pelos meus seguidores e, por qual motivo? Bem simples e de suma importância: é indispensável quando você faz um datalogger, quando você precisa pegar uma medida de umidade e temperatura, ou seja, é importante para tudo que envolve automação e que necessita da hora correta. E são diversas as formas de medir o tempo: relógio com bateria, o RTC (Real Time Clock), entre outras. Mas, a que quero mostrar para vocês hoje, que informa data, dia da semana e horário, é o NTP (Network Time Protocol), que é online. Vamos, então, neste vídeo de hoje, recuperar online as informações sobre data e hora e exibir as informações no display.
Demonstração
Montagem
Montagem – Tabela
Biblioteca Adafruit GFX
Na IDE do Arduino vá em Sketch->Incluir
Biblioteca->Gerenciar Bibliotecas...
Instale Adafruit GFX Library
Biblioteca Adafruit ST7735
Na IDE do Arduino vá em
Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale Adafruit ST7735
Biblioteca NTPClient
Vá até https://github.com/taranais/NTPClient
e realize o download da biblioteca NTPClient modificada por taranais.
Descompacte e coloque a pasta
em
C:\Users\<SEU_USUARIO>\Documents\Arduino\libraries
C:\Users\<SEU_USUARIO>\Documents\Arduino\libraries
ESP32_NTP.ino
Includes e defines
#include <WiFi.h>
#include <NTPClient.h> //Biblioteca NTPClient modificada
#include <WiFiUdp.h> //Socket UDP
#include <Adafruit_GFX.h> //Display
#include <Adafruit_ST7735.h> //Display
#include <SPI.h>
//Pinos do display
#define DISPLAY_DC 12 //A0
#define DISPLAY_CS 13 //CS
#define DISPLAY_MOSI 14 //SDA
#define DISPLAY_CLK 27 //SCK
#define DISPLAY_RST 0
//Fuso Horário, no caso horário de verão de Brasília
int timeZone = -2;
//Struct com os dados do dia e hora
struct Date{
int dayOfWeek;
int day;
int month;
int year;
int hours;
int minutes;
int seconds;
};
//Socket UDP que a lib utiliza para recuperar dados sobre o horário
WiFiUDP udp;
//Objeto responsável por recuperar dados sobre horário
NTPClient ntpClient(
udp, //socket udp
"0.br.pool.ntp.org", //URL do servwer NTP
timeZone*3600, //Deslocamento do horário em relacão ao GMT 0
60000); //Intervalo entre verificações online
//Nomes dos dias da semana
char* dayOfWeekNames[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Objeto responsável pelo display
Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST);
Setup
void setup()
{
Serial.begin(115200);
setupDisplay();
connectWiFi();
setupNTP();
//Cria uma nova tarefa no core 0
xTaskCreatePinnedToCore(
wifiConnectionTask, //Função que será executada
"wifiConnectionTask", //Nome da tarefa
10000, //Tamanho da memória disponível (em WORDs)
NULL, //Não vamos passar nenhum parametro
2, //prioridade
NULL, //Não precisamos de referência para a tarefa
0); //Número do core
}
SetupNTP
void setupNTP()
{
//Inicializa o client NTP
ntpClient.begin();
//Espera pelo primeiro update online
Serial.println("Waiting for first update");
while(!ntpClient.update())
{
Serial.print(".");
ntpClient.forceUpdate();
delay(500);
}
Serial.println();
Serial.println("First Update Complete");
}
WifiConnectionTask
//Tarefa que verifica se a conexão caiu e tenta reconectar
void wifiConnectionTask(void* param)
{
while(true)
{
//Se a WiFi não está conectada
if(WiFi.status() != WL_CONNECTED)
{
//Manda conectar
connectWiFi();
}
//Delay de 100 ticks
vTaskDelay(100);
}
}
ConnectWiFi
void connectWiFi()
{
Serial.println("Connecting");
//Troque pelo nome e senha da sua rede WiFi
WiFi.begin("SSID", "12345678");
//Espera enquanto não estiver conectado
while(WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
}
SetupDisplay
void setupDisplay()
{
display.initR(INITR_BLACKTAB); //Inicializa o display
display.setRotation(3); //Rotaciona
display.setTextSize(2); //Tamanho do texto
display.fillScreen(ST77XX_BLACK); //Preenche com a cor preta
display.setCursor(0, 0); //Coloca o cursor no começo
display.setTextColor(ST77XX_WHITE, ST77XX_BLACK); //Texto branco com fundo preto
display.setTextWrap(false); //Não pula linha automaticamente
}
Loop
void loop()
{
//Recupera os dados sobre a data e horário
Date date = getDate();
//Reseta o cursor
display.setCursor(0, 0);
//Exibe os dados no display
display.printf(" %s \n\n %s \n\n %02d/%02d/%d\n\n %02d:%02d:%02d",
WiFi.SSID().c_str(),
dayOfWeekNames[date.dayOfWeek],
date.day,
date.month,
date.year,
date.hours,
date.minutes,
date.seconds);
delay(100);
}
GetDate
Date getDate()
{
//Recupera os dados de data e horário usando o client NTP
char* strDate = (char*)ntpClient.getFormattedDate().c_str();
//Passa os dados da string para a struct
Date date;
sscanf(strDate, "%d-%d-%dT%d:%d:%dZ",
&date.year,
&date.month,
&date.day,
&date.hours,
&date.minutes,
&date.seconds);
//Dia da semana de 0 a 6, sendo 0 o domingo
date.dayOfWeek = ntpClient.getDay();
return date;
}







9 Comentários
Genial ! Vou economizar nos meus projetos de automação :-)
ResponderExcluirnão da pra baixar os aquivvos
ExcluirUM VERDADEIRO INFERNO PRA COMPILAR ISSO
ResponderExcluirVC INCLUI A ADAFRUIT ELE PASSA E PEDE OUTRA...PASSA PEDE OUTRA ...
DEPOIS PEDE UMA dns??????.h QUE DEVE ESTAR NUMA PASTA apps/dns????.h E NAO ACHA... PQP
AÍ COLOQUE NO BRAÇO ATÉ QUA A DISGRAÇA COMPILOU
MAS P.Q.P. É DIFÍCIL PRA SER FELIZ E COMEÇAR A APROVEITAR O QUE O FK QUER TRANSMITIR, ELE SE ESFORÇA... FAZ BEM.... MAS CARAAAAAAAIIIIII.... O TRECO É TENEBROSO PRA COMPILAR
Bom dia. Montei esse projeto (Não perca tempo:use NTP). Funcionou perfeitamenta,mas tem um porém. Funciona somente quando alimento o ESP32 pela porta USB de qualquer computador. Se eu tentar usar um carregador de celular (5V) e o mesmo cabo USB, o display acende, o LED da placa ESP32 acende, mas nada é informado no display. Alguma sugestão? Obrigado,
ResponderExcluirProvavelmente ruido da rua rede.Faz um teste, tenta alimenta com bateria 3.7v
ExcluirMuito bom, Vc podia fazer um vídeo usando time com RTC do ESP32...
ResponderExcluirO arquivo .zip está corrompido.
ResponderExcluirmuito bom esse exemplo para por no display, tem esse exemplo aqui mostra como usar a hora numa ação
ResponderExcluirhttps://portal.vidadesilicio.com.br/protocolo-de-tempo-ntp-esp/
complementa bastante o entendimento
o meu horário NTP está atrasando e as vezes ele mostra que é 3hs e pouco.
ResponderExcluir