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.
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
Em seguida, acesse o menu Ferramentas > Placas > Gerenciador de Placas e instale o pacote “esp32 by Espressif Systems”.
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
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
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:
Gostou do relógio com ESP32 e OLED? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial.
Olá.
Onde consigo o PINOUT completo dessa placa com display, por favor?
Olá Igor,
Você encontra o pinout aqui: https://ae01.alicdn.com/kf/HTB1O.bgX_HuK1RkSndVq6xVwpXa9.jpg
Abraços!
Vinícius – Equipe MakerHero
Olá! Parabéns pelo trabalho. Só uma dúvida. Aonde eu consigo a biblioteca wifiudp.h?
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!
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
Italo, bastante simples e interessante. Pergunto: tem alguma função para separar a hora, minuto, mes, ano etc ?
Obrigado. O código ajudou muito.
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
Fantastico.
It works at firts test.
I onli changed the fuso.
Now I want to make that changes the fuso ever spring and autumn.
Olá,
É muito bom saber que você gostou do nosso trabalho!
Abraço!
Rosana – Equipe MakerHero
Perfeito!