relógio com ESP32 e OLED

Relógio com ESP32 e OLED conectado com servidor NTP Deixe um comentário

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 OLEDInstalaçã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. Não se esqueça de visitar o Fórum da Filipeflop para postar suas ideias e dúvidas!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *