RTC of Real Time Clock is de meest gebruikte module in elektronica en embedded apparaten om de tijd bij te houden. Maar het probleem met RTC is dat de microchips in computers niet zo nauwkeurig zijn en dat ze alleen de tijd van het lokale apparaat kunnen weergeven. Aan de andere kant is het gebruik van internet om de tijd van NTP-servers op te halen een betere oplossing om tijd te krijgen, omdat het nauwkeuriger is en de tijd van elk geografisch gebied in de wereld kan weergeven. We hebben alleen een Wi-Fi-module en toegang tot internet nodig om de tijd van elke locatie ter wereld te krijgen door NTP-servers te gebruiken. In deze tutorial gebruiken we ESP8266 NodeMCU om de huidige tijd en datum van NTP-servers op te halen en weer te geven op het OLED-scherm.
Network Time Protocol (NTP)
NTP is een van de oudste netwerkprotocollen (IP) voor het synchroniseren van klokken tussen computernetwerken. Het is ontworpen door David L. Mills van de Universiteit van Delaware in 1981. Dit protocol kan worden gebruikt om vele netwerken binnen enkele milliseconden te synchroniseren met Coordinated Universal Time (UTC). UTC is de primaire tijdstandaard waarmee de wereld klok en tijd regelt. UTC verandert niet en varieert voor verschillende geografische locaties. NTP gebruikt UTC als tijdreferentie en biedt nauwkeurige en gesynchroniseerde tijd op internet.
NTP werkt op een hiërarchisch client-server-model. Topmodel heeft referentieklokken die bekend staan als "stratum0", zoals atoomklokken, radiogolven, gps, gsm die tijd ontvangt van de satelliet. De servers die tijd ontvangen van stratum0 worden "stratum1" genoemd en servers die tijd ontvangen van stratum1 worden "stratum2" genoemd, enzovoort. Dit gaat door en de nauwkeurigheid van de tijd neemt na elke fase af. NTP selecteert automatisch de beste van verschillende beschikbare tijdbronnen om te synchroniseren, waardoor het een fouttolerant protocol wordt.
Dus hier in dit project krijgen we tijd van de NTP-server met behulp van ESP8266 NodeMCU en laten deze op OLED-scherm zien. Deze zelfde soort internetklok is gebouwd met ESP32 in de vorige tutorial.
ESP8266 heeft toegang tot NTP-servers via internet om de juiste tijd te krijgen. Hier werkt NTP in client-server- modus, ESP8266 werkt als client-apparaat en maakt verbinding met NTP-servers met UDP (User Datagram Protocol). De client verzendt een verzoekpakket naar NTP-servers en in ruil daarvoor stuurt NTP een tijdstempelpakket dat informatie bevat zoals nauwkeurigheid, tijdzone, UNIX-tijdstempel enz. Vervolgens scheidt de client de datum- en tijddetails die verder kunnen worden gebruikt in toepassingen op basis van de vereisten.
Componenten vereist
- Monochroom 7-pins SSD1306 OLED-scherm van 0,96 inch
- ESP8266 NodeMCU
- Micro USB-kabel
- Breadboard
- Male naar Male Jumper-draden
Schakelschema en aansluitingen
Dit 7-pins OLED-scherm communiceert met de ESP8266-module met behulp van het SPI-protocol, hieronder vindt u het schakelschema en de verbindingstabel om OLED SPI-pinnen te verbinden met NodeMCU om internettijd weer te geven.
Nee. |
OLED-scherm |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) of SDA (I2C) |
D7 |
5 |
RESET |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Volg de link voor meer informatie over dit monochroom 7-pins OLED-scherm en de interface met ESP8266 NodeMCU.
Code Uitleg
Eerst moeten we de NTP-bibliotheek downloaden en installeren in ESP8266. Er zijn veel bibliotheken beschikbaar voor NTP Client. U kunt ze allemaal installeren vanaf Arduino IDE. In deze tutorial heb ik de NTPClient-bibliotheek van Taranais geïnstalleerd omdat deze gemakkelijk te gebruiken is en functies heeft om datum en tijd van NTP-servers te krijgen. ESP8266 NodeMCU kan eenvoudig worden geprogrammeerd met Arduino IDE.
Om de NTP-bibliotheek te installeren, downloadt u eerst de bibliotheek met behulp van bovenstaande link en installeert u deze vervolgens met Arduino IDE. Om het te installeren, ga naar Sketch> Inclusief bibliotheek>.ZIP-bibliotheek toevoegen , open vervolgens de Zip-map door naar de locatie te gaan waar je de zip-map hebt gedownload en start de Arduino IDE opnieuw.
De NTPClient-bibliotheek wordt geleverd met voorbeelden. Open Arduino IDE en ga naar voorbeelden> NTPClient> Geavanceerd . De code in deze schets geeft de tijd van de NTP-server weer op de seriële monitor. We zullen deze schets gebruiken om de huidige tijd en datum op het OLED-scherm weer te geven.
De volledige code is beschikbaar aan het einde van deze tutorial, hier heb ik enkele belangrijke delen van de code uitgelegd.
ESP8266WiFi-bibliotheek biedt ESP8266-specifieke Wi-Fi-routines om verbinding te maken met het netwerk. WiFiUDP.h zorgt voor het verzenden en ontvangen van UDP-pakketten. Omdat we het SPI-protocol gebruiken om OLED met NodeMCU te koppelen, zullen we de "SPI.h" -bibliotheek importeren. En "Adafruit_GFX.h" en "Adafruit_SSD1306.h" worden gebruikt voor OLED-weergave.
# omvatten
Ons OLED-formaat is 128x64, dus we stellen de schermbreedte en -hoogte in op respectievelijk 128 en 64. Dus definieer de variabelen voor OLED-pinnen die zijn verbonden met NodeMCU voor SPI-communicatie.
#define SCREEN_WIDTH 128 // OLED-schermbreedte, in pixels #define SCREEN_HEIGHT 64 // OLED-schermhoogte, in pixels // Verklaring voor SSD1306-scherm verbonden met software SPI (standaardgeval): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 # definiëren OLED_CS D8 # definiëren OLED_RESET D3
Adafruit_SSD1306-scherm (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Vervang "your_ssid" en "your_password" door uw Wi-Fi SSID en wachtwoord in de onderstaande regels code.
const char * ssid = "your_ssid"; const char * password = "your_password";
Stel een Wi-Fi-verbinding in door SSID en wachtwoord te geven aan de WiFi.begin- functie. De verbinding van ESP8266 duurt enige tijd om verbinding te maken met NodeMCU, dus we moeten wachten tot het verbinding heeft gemaakt.
WiFi.begin (ssid, wachtwoord); while (WiFi.status ()! = WL_CONNECTED) { vertraging (500); Serial.print ("."); }
Om datum en tijd op te vragen, initialiseert u de tijdclient met het adres van de NTP-servers. Kies voor een betere nauwkeurigheid het adres van de NTP-servers die zich dicht bij uw geografische gebied bevinden. Hier gebruiken we " pool.ntp.org " die servers van over de hele wereld geeft. Als u servers uit Azië wilt kiezen, kunt u “ asia.pool.ntp.org ” gebruiken. timeClient neemt ook de UTC-tijdverschuiving in milliseconden van uw tijdzone. De UTC-offset voor India is bijvoorbeeld +5: 30, dus we converteren deze offset in milliseconden, wat gelijk is aan 5 * 60 * 60 + 30 * 60 = 19800.
Oppervlakte |
UTC-tijdverschuiving (uren en minuten) |
UTC-tijdverschuiving (seconden) |
INDIA |
+5: 30 |
19800 |
LONDEN |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC wordt gegeven om intern 3.3V te genereren om het display te initialiseren. Wanneer de OLED start, wordt gedurende 3 seconden " WELCOME TO CIRCUIT DIGEST " weergegeven met tekstgrootte 2 en kleur BLAUW.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306-toewijzing mislukt")); voor(;;); // Ga niet verder, loop voor altijd door } display.clearDisplay (); display.setTextSize (2); // Teken tekstweergave op schaal 2X. SetTextColor (BLAUW); display.setCursor (5, 2); display.println ("WELKOM BIJ"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); vertraging (3000);
De NTP-client wordt geïnitialiseerd met de functie begin () om de datum en tijd van NTP-servers in te stellen.
timeClient.begin ();
De functie Update () wordt gebruikt om de datum en tijd te ontvangen wanneer we een verzoek indienen bij NTP-servers.
timeClient.update ();
De baudrate van 115200 is ingesteld om de tijd op een seriële monitor af te drukken.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay zijn de bibliotheekfunctie en geven het huidige uur, minuten, seconden en dag van de NTP-server. De onderstaande code wordt gebruikt om de tijd tussen AM en PM te onderscheiden. Als het uur dat we krijgen met getHours () groter is dan 12, dan stellen we die tijd in als PM, anders is het AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int dag = timeClient.getDay (); if (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"); } int dag = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () wordt gebruikt get date in “jjjj-mm-dd” formaat van de NTP-server. Deze functie geeft datum en tijd weer in het formaat “jjjj-mm-dd T uu: mm: ss . Maar we hebben alleen de datum nodig, dus we moeten deze string, die is opgeslagen in het datum_tijd- formaat, splitsen tot "T", wat wordt gedaan door de functie substring () en vervolgens de datum opslaan in de variabele "date" .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (datum); display.println (datum); display.display ();
Dit is hoe de OLED-internettijdklok er uiteindelijk zal uitzien: