banner

Ir para o Forum

Não perca tempo: use NTP!




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





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;
}





Faça o download dos arquivos






3 comentários:

  1. Genial ! Vou economizar nos meus projetos de automação :-)

    ResponderExcluir
  2. UM VERDADEIRO INFERNO PRA COMPILAR ISSO
    VC 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

    ResponderExcluir
  3. 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,

    ResponderExcluir

Tecnologia do Blogger.