- Protocolo de Tempo de Rede (NTP)
- Componentes necessários
- Diagrama de circuito e conexões
- Explicação do código
RTC ou Real Time Clock é o módulo mais comumente usado em eletrônicos e dispositivos incorporados para controlar o tempo. Mas o problema com o RTC é que os microchips nos computadores não são muito precisos e podem fornecer apenas a hora do dispositivo local. Por outro lado, usar a internet para buscar a hora dos servidores NTP é a melhor solução para obter a hora, pois é mais precisa e pode fornecer a hora de qualquer área geográfica do mundo. Precisamos apenas de um módulo Wi-Fi e acesso à internet para obter o horário de qualquer local do mundo usando servidores NTP. Neste tutorial, usaremos ESP8266 NodeMCU para obter a hora e a data atuais dos servidores NTP e exibi-la no display OLED.
Protocolo de Tempo de Rede (NTP)
O NTP é um dos protocolos de rede da Internet (IP) mais antigos para sincronizar relógios entre redes de computadores. Ele foi projetado por David L. Mills, da University of Delaware, em 1981. Este protocolo pode ser usado para sincronizar muitas redes para o Tempo Universal Coordenado (UTC) em poucos milissegundos. UTC é o principal padrão de tempo pelo qual o mundo regula o relógio e a hora. UTC não muda e varia para diferentes localizações geográficas. O NTP usa o UTC como referência de tempo e fornece tempo preciso e sincronizado na Internet.
O NTP funciona em um modelo cliente-servidor hierárquico. Top model tem relógios de referência conhecidos como “stratum0”, como relógios atômicos, ondas de rádio, GPS, GSM que recebe o tempo do satélite. Os servidores que recebem a hora do stratum0 são chamados de “stratum1” e os servidores que recebem a hora do stratum1 são chamados de “stratum2” e assim por diante. Isso continua e a precisão do tempo continua diminuindo após cada estágio. O NTP seleciona automaticamente o melhor de várias fontes de tempo disponíveis para sincronizar, o que o torna um protocolo tolerante a falhas.
Então, aqui neste projeto, estamos obtendo o tempo do servidor NTP usando ESP8266 NodeMCU e exibindo-o no display OLED. Este mesmo tipo de relógio da Internet é construído usando ESP32 no tutorial anterior.
ESP8266 pode acessar servidores NTP usando a internet para obter o tempo preciso. Aqui, o NTP funciona no modo cliente-servidor, o ESP8266 funciona como dispositivo cliente e se conecta a servidores NTP usando UDP (User Datagram Protocol). O cliente transmite um pacote de solicitação aos servidores NTP e, em troca, o NTP envia um pacote de carimbo de data / hora que consiste em informações como precisão, fuso horário, carimbo de data / hora UNIX etc. Em seguida, o cliente separa os detalhes de data e hora que podem ser usados posteriormente em aplicativos de acordo com a necessidade.
Componentes necessários
- Tela OLED SSD1306 de 0,96 ”monocromática de 7 pinos
- ESP8266 NodeMCU
- Cabo micro usb
- Tábua de pão
- Fios de ligação macho para macho
Diagrama de circuito e conexões
Este display OLED de 7 pinos se comunica com o módulo ESP8266 usando o protocolo SPI, abaixo estão o diagrama de circuito e a tabela de conexões para conectar os pinos OLED SPI com NodeMCU para exibir o tempo da Internet.
Não. |
Display OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) ou SDA (I2C) |
D7 |
5 |
REDEFINIR |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Para saber mais sobre este display OLED monocromático de 7 pinos e sua interface com o ESP8266 NodeMCU, siga o link.
Explicação do código
Primeiro, temos que baixar e instalar a biblioteca NTP no ESP8266. Existem muitas bibliotecas disponíveis para o cliente NTP. Você pode instalar qualquer um deles a partir do IDE do Arduino. Neste tutorial instalei a biblioteca NTPClient da Taranais porque é fácil de usar e possui funções para obter data e hora dos servidores NTP. ESP8266 NodeMCU pode ser facilmente programado usando o Arduino IDE.
Para instalar a biblioteca NTP, primeiro baixe a biblioteca usando o link acima e instale-a usando o IDE Arduino. Para instalá-lo, vá para Sketch> Incluir Biblioteca> Adicionar Biblioteca.ZIP , abra a pasta Zip indo para o local onde você baixou a pasta zip e reinicie o IDE Arduino.
A biblioteca NTPClient vem com exemplos. Abra o IDE do Arduino e acesse exemplos> NTPClient> Avançado . O código fornecido neste esboço exibe a hora do servidor NTP no monitor serial. Usaremos este esboço para exibir a hora e a data atuais no display OLED.
O código completo está disponível no final deste tutorial, aqui eu expliquei algumas partes importantes do código.
A biblioteca ESP8266WiFi fornece rotinas específicas de Wi-Fi ESP8266 para conectar à rede. WiFiUDP.h trata do envio e recebimento de pacotes UDP. Como estamos usando o protocolo SPI para fazer a interface OLED com o NodeMCU, importaremos a biblioteca “SPI.h”. E “Adafruit_GFX.h” e “Adafruit_SSD1306.h” são usados para display OLED.
#incluir
O tamanho do nosso OLED é 128x64, portanto, definimos a largura e a altura da tela como 128 e 64, respectivamente. Portanto, defina as variáveis para os pinos OLED conectados ao NodeMCU para comunicação SPI.
#define SCREEN_WIDTH 128 // Largura do display OLED, em pixels #define SCREEN_HEIGHT 64 // Altura do display OLED, em pixels // Declaração para display SSD1306 conectado usando software SPI (caso padrão): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Monitor Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Substitua “your_ssid” e “your_password” pelo seu SSID e senha Wi-Fi nas linhas de código abaixo.
const char * ssid = "your_ssid"; const char * password = "sua_senha";
Configure a conexão WI-Fi fornecendo SSID e senha para a função WiFi.begin . A conexão do ESP8266 leva algum tempo para se conectar ao NodeMCU, então temos que esperar até que seja conectado.
WiFi.begin (ssid, senha); enquanto (WiFi.status ()! = WL_CONNECTED) { atraso (500); Serial.print ("."); }
Para solicitar data e hora, inicialize o cliente de hora com o endereço dos servidores NTP. Para maior precisão, escolha o endereço dos servidores NTP próximos à sua área geográfica. Aqui usamos “ pool.ntp.org ”, que fornece servidores de todo o mundo. Se você deseja escolher servidores da Ásia, pode usar “ asia.pool.ntp.org ”. timeClient também obtém a diferença de horário UTC em milissegundos do seu fuso horário. Por exemplo, o deslocamento UTC para a Índia é +5: 30, portanto, convertemos esse deslocamento em milissegundos, que é igual a 5 * 60 * 60 + 30 * 60 = 19800.
Área |
Ajuste de horário UTC (horas e minutos) |
Tempo UTC (segundos) |
ÍNDIA |
+5: 30 |
19800 |
LONDRES |
0:00 |
0 |
NOVA YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC é fornecido para gerar 3,3 V internamente para inicializar o display. Quando o OLED é iniciado, ele exibe “ BEM-VINDO AO CIRCUITO DIGEST ” com tamanho de texto 2 e cor AZUL por 3 segundos.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 alocação falhou")); para(;;); // Não continue, faça um loop para sempre } display.clearDisplay (); display.setTextSize (2); // Desenhe texto em escala 2X display.setTextColor (BLUE); display.setCursor (5, 2); display.println ("BEM-VINDO A"); display.println ("CIRCUITO"); display.println ("DIGEST"); display.display (); atraso (3000);
O cliente NTP é inicializado usando a função begin () para definir a data e a hora dos servidores NTP.
timeClient.begin ();
A função Update () é usada para receber a data e hora sempre que solicitamos aos servidores NTP.
timeClient.update ();
A taxa de transmissão de 115200 é definida para imprimir a hora no monitor serial.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay são as funções da biblioteca e fornecem a hora, minutos, segundos e dia atuais do servidor NTP. O código abaixo é usado para diferenciar o tempo entre AM e PM. Se a hora que obtivermos usando getHours () for maior que 12, definiremos essa hora como PM ou AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); dia interno = timeClient.getDay (); se (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } dia interno = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () é usado para obter a data no formato “aaaa-mm-dd” do servidor NTP. Esta função fornece data e hora no formato “aaaa-mm-dd T hh: mm: ss . Mas nós precisamos apenas da data, então temos que dividir esta string que é armazenada no formato date_time até “T” que é feito pela função substring () e então armazenar a data na variável “date” .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String data = date_time.substring (0, index_date); Serial.println (data); display.println (data); display.display ();
É assim que o relógio OLED da Internet ficará finalmente: