Relógio da Internet usando ESP32 e display OLED
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.
Conteudo
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); }