- Network Time Protocol (NTP)
- Komponenter, der kræves
- Kredsløbsdiagram og forbindelser
- Kode Forklaring
RTC eller Real Time Clock er det mest anvendte modul i elektronik og indlejrede enheder for at holde styr på tiden. Men problemet med RTC er, at mikrochipene i computere ikke er så nøjagtige, og de kan kun give tiden for lokal enhed. På den anden side er brugen af internettet til at hente tiden fra NTP-servere en bedre løsning til at få tid, da det er mere præcist og kan give tiden for ethvert geografisk område i verden. Vi har bare brug for et Wi-Fi-modul og adgang til internet for at få tid til ethvert sted i verden ved hjælp af NTP-servere. I denne vejledning bruger vi ESP8266 NodeMCU til at hente aktuel tid og dato fra NTP-servere og vise den på OLED-skærm.
Network Time Protocol (NTP)
NTP er en af de ældste netværksinternetprotokoller (IP) til synkronisering af ure mellem computernetværk. Det blev designet af David L. Mills fra University of Delaware i 1981. Denne protokol kan bruges til at synkronisere mange netværk til Coordinated Universal Time (UTC) inden for få millisekunder. UTC er den primære tidsstandard, hvormed verden regulerer ur og tid. UTC ændres ikke og varierer efter forskellige geografiske placeringer. NTP bruger UTC som tidsreference og giver nøjagtig og synkroniseret tid på tværs af Internettet.
NTP fungerer på en hierarkisk klient-server-model. Topmodellen har referenceure kendt som “stratum0” som atomure, radiobølger, GPS, GSM, der modtager tid fra satellitten. Serverne, der modtager tid fra stratum0 kaldes "stratum1", og servere, der modtager tid fra stratum1, kaldes "stratum2" og så videre. Dette fortsætter, og nøjagtigheden af tiden fortsætter med at falde efter hvert trin. NTP vælger automatisk det bedste af flere tilgængelige tidskilder til synkronisering, hvilket gør det til en fejltolerant protokol.
Så her i dette projekt får vi tid fra NTP-server ved hjælp af ESP8266 NodeMCU og viser den på OLED-skærm. Den samme slags internetur er bygget ved hjælp af ESP32 i tidligere tutorial.
ESP8266 har adgang til NTP-servere ved hjælp af internet for at få nøjagtig tid. Her fungerer NTP i klientserver- tilstand, ESP8266 fungerer som klientenhed og opretter forbindelse til NTP-servere ved hjælp af UDP (User Datagram Protocol). Klienten sender en anmodningspakke til NTP-servere, og til gengæld sender NTP en tidsstempelpakke, der består af information som nøjagtighed, tidszone, UNIX-tidsstempel osv. Derefter adskiller klienten dato- og tidsoplysninger, som yderligere kan bruges i applikationer efter krav.
Komponenter, der kræves
- Monokrom 7-polet SSD1306 0,96 ”OLED-skærm
- ESP8266 NodeMCU
- Micro USB-kabel
- Brødbræt
- Mandlige til mandlige jumpertråde
Kredsløbsdiagram og forbindelser
Denne 7-polede OLED-skærm kommunikerer med ESP8266-modulet ved hjælp af SPI-protokol. Nedenfor er kredsløbsdiagrammet og tilslutningstabellen for at forbinde OLED SPI-ben med NodeMCU for at vise internettid.
Ingen. |
OLED-skærm |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) eller SDA (I2C) |
D7 |
5 |
NULSTIL |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
For at lære mere denne monokrome 7-pin OLED-skærm og dens grænseflade med ESP8266 NodeMCU, følg linket.
Kode Forklaring
Først skal vi downloade og installere NTP-bibliotek i ESP8266. Der er mange biblioteker til rådighed for NTP-klienten. Du kan installere nogen af dem fra Arduino IDE. I denne vejledning har jeg installeret NTPClient-biblioteket af Taranais, fordi det er let at bruge og har funktioner til at hente dato og tid fra NTP-servere. ESP8266 NodeMCU kan let programmeres ved hjælp af Arduino IDE.
For at installere NTP-biblioteket skal du først downloade biblioteket ved hjælp af ovenstående link og derefter installere det ved hjælp af Arduino IDE. For at installere det skal du gå til Skitse> Inkluder bibliotek> Tilføj.ZIP-bibliotek , derefter åbne zip-mappen ved at gå til det sted, hvor du har downloadet zip-mappen og genstarte Arduino IDE.
NTPClient-biblioteket leveres med eksempler. Åbn Arduino IDE og Goto-eksempler> NTPClient> Avanceret . Koden i denne skitse viser tiden fra NTP-serveren på den serielle skærm. Vi bruger denne skitse til at vise aktuel tid og dato på OLED-skærm.
Komplet kode er tilgængelig i slutningen af denne tutorial, her har jeg forklaret nogle vigtige dele af koden.
ESP8266WiFi-biblioteket giver ESP8266-specifikke Wi-Fi-rutiner til at oprette forbindelse til netværket. WiFiUDP.h håndterer afsendelse og modtagelse af UDP-pakker. Da vi bruger SPI-protokol til at interface OLED med NodeMCU, vil vi derfor importere "SPI.h" -biblioteket. Og “Adafruit_GFX.h” og “Adafruit_SSD1306.h” bruges til OLED-skærm.
#omfatte
Vores OLED-størrelse er 128x64, så vi indstiller skærmbredde og højde til henholdsvis 128 og 64. Så definer variablerne for OLED-pins forbundet til NodeMCU til SPI-kommunikation.
#define SCREEN_WIDTH 128 // OLED-skærmbredde, i pixels #define SCREEN_HEIGHT 64 // OLED-skærmhøjde, i pixels // Erklæring for SSD1306-skærm forbundet med software SPI (standardtilstand): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306-skærm (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Udskift "your_ssid" og "your_password" med dit Wi-Fi SSID og adgangskode i nedenstående kodelinjer.
const char * ssid = "din_ssid"; const char * password = "dit_passord";
Opret WI-Fi-forbindelse ved at give SSID og adgangskode til WiFi.begin- funktionen. Forbindelsen til ESP8266 tager noget tid at få forbindelse til NodeMCU, så vi bliver nødt til at vente, indtil den bliver forbundet.
WiFi.begin (ssid, password); mens (WiFi.status ()! = WL_CONNECTED) { forsinkelse (500); Serial.print ("."); }
For at anmode om dato og klokkeslæt skal du initialisere tidsklienten med adressen på NTP-serverne. For bedre nøjagtighed skal du vælge adressen på NTP-servere, der er tæt på dit geografiske område. Her bruger vi " pool.ntp.org ", som giver servere fra hele verden. Hvis du ønsker at vælge servere fra Asien, kan du bruge “ asia.pool.ntp.org ”. timeClient tager også UTC-tidsforskydning i millisekunder af din tidszone. For eksempel er UTC-forskydning for Indien +5: 30, så vi konverterer denne forskydning i millisekunder, hvilket er lig med 5 * 60 * 60 + 30 * 60 = 19800.
Areal |
UTC-tidsforskydning (timer og minutter) |
UTC-tidsforskydning (sekunder) |
INDIEN |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC gives til at generere 3,3 V internt for at initialisere skærmen. Når OLED starter, vises " WELCOME TO CIRCUIT DIGEST " med tekststørrelse 2 og farve BLÅ i 3 sekunder.
hvis (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 allokering mislykkedes")); til(;;); // Fortsæt ikke, loop for evigt } display.clearDisplay (); display.setTextSize (2); // Tegn 2X-skala tekst display.setTextColor (BLÅ); display.setCursor (5, 2); display.println ("VELKOMMEN TIL"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); forsinkelse (3000);
NTP-klienten initialiseres ved hjælp af start () -funktionen til at indstille dato og klokkeslæt fra NTP-servere.
timeClient.begin ();
Opdateringsfunktionen () bruges til at modtage dato og klokkeslæt, når vi beder til NTP-servere.
timeClient.update ();
Baudhastighed på 115200 er indstillet til at udskrive tiden på seriel skærm.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay er biblioteksfunktionen og giver den aktuelle time, minutter, sekunder og dag fra NTP-serveren. Koden nedenfor bruges til at skelne mellem AM og PM. Hvis den time, vi bruger getHours (), er større end 12, indstiller vi den tid som PM, ellers er den AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int dag = timeClient.getDay (); hvis (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } andet { 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 () bruges get date i “yyyy-mm-dd” format fra NTP-server. Denne funktion giver dato og tid i “åååå-mm-dd Thh: mm: ss- format. Men vi har kun brug for dato, så vi er nødt til at opdele denne streng, der er gemt i formatet dato_tid til "T", hvilket gøres ved hjælp af substring () -funktionen og derefter gemme datoen i "dato" -variablen.
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (dato); display.println (dato); display.display ();
Sådan ser OLED Internet-uret endelig ud: