Relógio da Internet usando ESP32 e display OLED

Tempo de leitura: 4 minutes

No tutorial anterior, criamos o relógio RTC usando DS3231 e ESP32. Para minimizar os requisitos de hardware, faremos um relógio para Internet sem usar o módulo RTC. Isso é mais preciso em comparação com o relógio RTC. ESP32 é um módulo Wi-Fi e pode ser facilmente conectado à internet, então usaremos NTP (Network Time Protocol) e UDP (User Datagram Protocol) para buscar o tempo da internet usando Wi-Fi. Este relógio da Internet pode ser muito útil durante a construção de Projetos IoT.

O que é NTP ??

Network Time Protocol (NTP) é um protocolo de rede usado para sincronização de tempo entre sistemas e redes de dados. A estrutura do NTP depende dos servidores de horário da Internet. O NTP possui algoritmos para ajustar com precisão a hora do dia. Os servidores NTP têm software que envia a hora do dia do relógio para computadores clientes usando UDPport 123. Então, aqui neste projeto, estamos obtendo o tempo do servidor NTP usando ESP32 e exibindo-o no display OLED.

 

Materiais requisitados:

  • ESP32
  • Tela OLED de 128*64
  • ProtoBoard ou min ProtoBoard
  • Fios macho-fêmea

 

Diagrama de circuito:

Aqui, estamos usando o modo SPI para conectar nosso Módulo de display OLED de 128×64 (SSD1306) ao ESP32. Portanto, ele usará 7 pinos. As conexões com ESP32 são fornecidas como:

Pino CS (seleção de chip) de OLED -> PIN D5 de ESP32
Pino DC do OLED -> PIN D4 do ESP32
Pino RES de OLED -> PIN D2 de ESP32
Pino SDA de OLED -> PIN D23, ou seja, MOSI de ESP32
Pino SCK de OLED -> PIN D18, ou seja, SCK de ESP32
Vdd de OLED -> Vcc de ESP32
GND de OLED -> GND de ESP32

Você precisa de arquivos de placa para o ESP32. Menu suspenso do gerenciador de placa de check-in do Arduino IDE para kit de desenvolvimento ESP32. Caso não esteja, siga os passos indicados no link

Você também pode usar ESP12 para este projeto, aprenda aqui a usar ESP12.

Usaremos Arduino IDE para escrever nosso programa conforme explicado no artigo acima.

 

Explicação do código:

O código completo para ESP32 Internet Clock é fornecido no final do artigo. Aqui estamos explicando algumas partes importantes do código.

Precisamos de várias bibliotecas para usar em nosso código, que podem ser baixadas dos links abaixo:

1. Adafruit_SSD1306: https://github.com/adafruit/Adafruit_SSD1306
2. SPI: https://github.com/PaulStoffregen/SPI
3. Adafruit_GFX: https://github.com/adafruit/Adafruit-GFX-Library
4. NTPClient:  https://github.com/arduino-libraries/NTPClient
5.WiFiUdp: https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi

Portanto, incluímos todas as bibliotecas e variáveis definidas para inserir o nome e a senha do Wi-Fi.

#include <WiFi.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

const char* ssid     = "*******";    // WiFi Nome
const char* password = "*********";  // WiFi Senha

Aqui, a biblioteca NTPClient.h é usada para se conectar ao servidor de horário. Demora um servidor NTP para mantê-lo sincronizado. E a biblioteca Hhre WiFiUdp.h é usada para enviar e receber mensagens UDP. UDP é um protocolo que envia e recebe mensagens curtas de nosso sistema para o servidor NTP.

Portanto, para obter o tempo da Internet, temos que definir três variáveis em nosso programa para NTP.

ntp_offset que é o fuso horário do seu país, ou seja, para a Brasil, é -3: timezone = -3 , timeZone*3600

ntp_intervalo que é o intervalo de tempo levado pelo NTP para atualizar o tempo. É 60-64 segundos.

ntp_url é o servidor NTP do seu país. Para a Brasil, você pode usar “br.pool.ntp.org”.

//Fuso Horário, no caso horário de Brasília 
int timeZone = -3;

#define ntp_offset   timeZone*3600        // em Segundos
#define ntp_intervalo 60*1000             // em Segundos
#define ntp_url      "0.br.pool.ntp.org"  // Server

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP,         //socket udp
                     ntp_url,        //URL do servwer NTP
                     ntp_offset,     //Deslocamento do horário em relacão ao GMT 0
                     ntp_intervalo); //Intervalo entre verificações online

Na função de configuração, inicialize as configurações de Wi-Fi para se conectar à internet.

void setup()
{
  display.begin();
  Serial.begin(9600);
  Serial.println();
  Serial.println();
  Serial.print("Conectando à");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  timeClient.begin();

Em seguida, inicialize as funções de exibição para mostrar a hora no OLED.

display.begin(SSD1306_SWITCHCAPVCC);

Na função de loop, usamos timeClient.update(), esta função pega o tempo atualizado do NTP na forma de string e o armazena na variável formattedTime. Em seguida, exiba-o no OLED usando a função display.println().

void loop()
{
   timeClient.update();
   String formattedTime = timeClient.getFormattedTime();
   display.clearDisplay();
   display.setTextSize(2);                         // defina esses parâmetros de acordo com sua necessidade.
   display.setCursor(0, 0);
   display.println(formattedTime);

O programa completo é fornecido abaixo. Agora, finalmente, programe o ESP32 com o Arduino IDE e seu relógio de Internet estará pronto para mostrar a hora.

 

Código

#include <WiFi.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <NTPClient.h>
#include <WiFiUdp.h>
const char* ssid     = "*******";
const char* password = "*********";

int timeZone = -3; 
#define ntp_offset timeZone*3600    // em Segundos 
#define ntp_intervalo 60*1000       // em Segundos 
#define ntp_url "0.br.pool.ntp.org" // Server 

WiFiUDP ntpUDP; 
NTPClient timeClient(ntpUDP,         //socket udp 
                     ntp_url,        //URL do servwer NTP 
                     ntp_offset,     //Deslocamento do horário em relacão ao GMT 0 
                     ntp_intervalo); //Intervalo entre verificações online

#define OLED_MOSI  23
#define OLED_CLK   18
#define OLED_DC    4
#define OLED_CS    5
#define OLED_RESET 2
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  display.begin();
  Serial.begin(9600);
  Serial.println();
  Serial.println();
  Serial.print("Conectando à");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  timeClient.begin();
  display.begin(SSD1306_SWITCHCAPVCC);

  display.clearDisplay();
  display.setTextColor(WHITE);
  //display.startscrollright(0x00, 0x0F);
  display.setTextSize(2);
  //display.setCursor(0,0);
  //display.print("  Internet ");
  //display.println("  Clock ");
  //display.display();
  //delay(3000);
}

void loop()
{
  timeClient.update();
  String formattedTime = timeClient.getFormattedTime();

  // Serial.println(formattedTime);
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.println(formattedTime);

  display.display();   // escreve o buffer no display
  delay(10);
  delay(100);
}