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






5 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
    Respostas
    1. Provavelmente ruido da rua rede.Faz um teste, tenta alimenta com bateria 3.7v

      Excluir
  4. JEAN CARLOS RIBEIRO30 de janeiro de 2019 19:53

    Muito bom, Vc podia fazer um vídeo usando time com RTC do ESP32...

    ResponderExcluir

Tecnologia do Blogger.