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