Introduction: Don’t Waste Your Time: Use NTP!
Make your time count! This is a frequently discussed topic among my subscribers, and for what reason? Due to the simple and indispensable fact that when you make a datalogger, and for everything involving automation, you need the correct time! And there are several ways to measure time: clock with battery, RTC (Real Time Clock), among others. But the one I want to show you today (which informs date, day of the week, and time) is the NTP (Network Time Protocol), which is online. In this video, we’ll retrieve the date and time information online, and show the information on the display.
Step 1: Demonstration
Step 2: Assembly
Step 3: Assembly - Table
Step 4: Adafruit GFX Library
In the Arduino IDE, go to Sketch->Include Library->Manage Libraries ...
Install Adafruit GFX Library
Step 5: Adafruit ST7735 Library
In the Arduino IDE, go to Sketch->Include Library->Manage Libraries ...
Install Adafruit ST7735
Step 6: NTPClient Library
Go to https://github.com/taranais/NTPClient and download the taranais-modified NTPClient library.
Unzip and put the folder in C:\Users\\Documents\Arduino\libraries
Step 7: ESP32_NTP.ino
Includes and define
#include <WiFi.h>
#include <NTPClient.h> //Biblioteca NTPClient modificada #include <WiFiUdp.h> //Socket UDP #include <Adafruit_GFX.h> //Display #include <Adrafuit_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; }