relógio com ESP32 e OLED

Relógio com ESP32 e OLED conectado com servidor NTP 10

Neste post será mostrado como criar um relógio que atualiza as horas automaticamente pela internet (se conectando a um servidor de horários NTP) utilizando apenas o Módulo WiFi ESP32 Bluetooth com Display OLED. O horário será apresentado diretamente no display OLED integrado à placa. Para descarregar o código, será utilizada a IDE do Arduino. No final você terá um projeto de relógio com ESP32 e OLED.

O display OLED embutido na placa opera com o barramento de comunicação I2C, que utiliza as portas SDA (conectado ao pino digital 5 e responsável pelo clock) e SCL (conectado ao pino digital 4 e responsável pela transmissão dos dados). Além disso, todo dispositivo I2C possui um endereço, sendo o endereço padrão do display 0x3C.

Configurando o suporte para a ESP32 na IDE do Arduino

Para descarregar o seu código na ESP32 utilizando a IDE do Arduino, você precisará instalar a biblioteca da placa na sua IDE.

Para isso, você deve acessar o menu Arquivo > Preferências.

Preferências IDE Arduino

Adicione a seguinte url no campo URLs Adicionais para Gerenciadores de Placas, como mostrado na foto abaixo:

https://dl.espressif.com/dl/package_esp32_index.json

Configuração IDE Arduino para ESP32

Em seguida, acesse o menu Ferramentas > Placas > Gerenciador de Placas e instale o pacote “esp32 by Espressif Systems”.

Instalação da placa ESP32 na IDE Arduino

Para descarregar o código para a versão da ESP32 com o display OLED, devem ser utilizados os seguinte parâmetros (presentes no menu Ferramentas):

  • Placa: WEMOS LOLIN 32
  • Upload Speed: 921600
  • Flash Frequency: 80MHz
  • Partition Scheme: “Padrão”

Não esqueça de selecionar a porta em que a sua placa está conectada.

Informações Adicionais de Configuração

Erro de compilação

Caso você receba alguma mensagem de erro (como a apresentada acima) ao descarregar algum código para a sua ESP32, talvez você não possua a biblioteca pyserial do Python instalada.

Para isso, você deverá instalar alguma versão do Python em sua máquina (caso ainda não tenha instalado) e utilizar o gerenciador de pacotes pip para instalar a biblioteca pyserial no seu computador.

Instalar Bibliotecas do Servidor NTP e do Display

Antes de executar o código do relógio na sua ESP32, será necessário instalar as bibliotecas NTPClient e SSD1306Wire na sua IDE do Arduino. Para isso, acesse o menu Ferramentas > Gerenciar Bibliotecas… e instale as seguintes bibliotecas:

  • ESP8266 and ESP32 Oled Driver for SSD1306 display by Daniel Eichhorn, Fabrice Weinberg
  • NTPClient by Fabrice Weinberg

Instalação da biblioteca para display OLED Instalação da biblioteca para HTTP

Código-Fonte do relógio com ESP32 e OLED

O código abaixo irá conectar a sua placa em uma rede Wi-Fi, atualizar as informações de horário do servidor NTP e imprimir essas informações no display embutido.

A conexão com o servidor NTP ocorre através do protocolo UDP: é feita uma requisição ao servidor, que retorna a informação do horário em Posix Time, um formato de tempo adotado em sistemas computacionais. A biblioteca NPTClient, então, faz a conversão da informação para o formato tradicional de hora.

O serviço de impressão do display funciona de forma semelhante a uma lista: você irá adicionar na lista itens a serem impressos (como textos, linhas e polígonos) e, quando o comando display.display( ) for chamado, esses itens serão impressos. Para limpar a lista, utilize o comando display.clear( ). Outros comandos referentes ao display podem ser encontrados na documentação da biblioteca.

Antes de descarregar o código, lembre-se de alterar o nome e a senha da rede Wi-Fi que você deseja se conectar.

#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>

#include <Wire.h>
#include <SSD1306Wire.h>


// Configurações do WiFi
const char* ssid     = "nome-da-rede-wifi"; // Nome da rede WiFi
const char* password = "senha-da-rede-wifi"; // Senha da rede WiFi


// Configurações do Servidor NTP
const char* servidorNTP = "a.st1.ntp.br"; // Servidor NTP para pesquisar a hora

const int fusoHorario = -10800; // Fuso horário em segundos (-03h = -10800 seg)
const int taxaDeAtualizacao = 1800000; // Taxa de atualização do servidor NTP em milisegundos

WiFiUDP ntpUDP; // Declaração do Protocolo UDP
NTPClient timeClient(ntpUDP, servidorNTP, fusoHorario, 60000);


// Configuração do Display OLED
SSD1306Wire display(0x3C, 5, 4);


void setup()
{  
  // Declarar Serial para realizar debug do código
  Serial.begin(115200);
  delay(10);


  // Conectar ao WiFi
  WiFi.begin(ssid, password);


  // Iniciar display e configurar interface
  display.init();
  display.clear();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_CENTER);


  // Aguardando conexão do WiFi
  while (WiFi.status() != WL_CONNECTED)
  {
      display.clear();
      display.drawString(63, 12, "...");
      display.display();

      Serial.print(".");
      delay(500);
  }
  
  Serial.println("");
  Serial.print("WiFi conectado. Endereço IP: ");
  Serial.println(WiFi.localIP());


  // Iniciar cliente de aquisição do tempo
  timeClient.begin();
}
 
void loop()
{
  timeClient.update();
  Serial.println(timeClient.getFormattedTime());

  String horario = timeClient.getFormattedTime();

  display.clear(); // Limpa o conteúdo do display
  display.drawString(63, 19, horario); // Adiciona o texto à lista de escrita do display
  display.drawLine(10, 52, 117, 52); // Adiciona uma linha à lista de escrita do display
  display.display(); // Escreve as informações da lista de escrita no display

  delay(800);
}

Após descarregar o código, você deve ter um resultado como o do GIF abaixo:

relógio com ESP32 e OLED

Gostou do relógio com ESP32 e OLED? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial.

Faça seu comentário

Acesse sua conta e participe

10 Comentários

  1. Olá.

    Onde consigo o PINOUT completo dessa placa com display, por favor?

    1. Olá Igor,

      Você encontra o pinout aqui: https://ae01.alicdn.com/kf/HTB1O.bgX_HuK1RkSndVq6xVwpXa9.jpg

      Abraços!
      Vinícius – Equipe MakerHero

  2. Olá! Parabéns pelo trabalho. Só uma dúvida. Aonde eu consigo a biblioteca wifiudp.h?

  3. Excelente!

    Existe algum meio de passar os dados da rede (ssid e password) por uma função?

    Assim, quando estiver em uma rede diferente bastaria informar via HMI (display touch por exemplo).

    Obrigado!

    1. Edelson

      Você teria que retirar a propriedade “const” dessas variáveis no código. Depois, criar um método em que espera o usuário digitar os dados. Os dados digitados vão ser então armazenados nas variáveis ssid e password novamente.

      Abraços!
      Diogo – Equipe MakerHero

  4. Italo, bastante simples e interessante. Pergunto: tem alguma função para separar a hora, minuto, mes, ano etc ?
    Obrigado. O código ajudou muito.

    1. Olá, Ivan

      A biblioteca tem alguns métodos para conseguir alguns valores:

      getDay //adquire os dias
      getHours //adquire as horas
      getMinutes //adquire os minutos
      getSeconds //adquire os segundos

      Abraços!
      Diogo – Equipe MakerHero

  5. Fantastico.
    It works at firts test.
    I onli changed the fuso.
    Now I want to make that changes the fuso ever spring and autumn.

    1. Olá,

      É muito bom saber que você gostou do nosso trabalho!

      Abraço!
      Rosana – Equipe MakerHero