RTC eller sanntidsklokke er den mest brukte modulen i elektronikk og innebygde enheter for å holde oversikt over tiden. Men problemet med RTC er at mikrochipene i datamaskiner ikke er så nøyaktige, og de kan bare gi tiden til lokal enhet. På den annen side er bruk av internett for å hente tiden fra NTP-servere en bedre løsning for å få tid, siden den er mer nøyaktig og kan gi tiden til ethvert geografisk område i verden. Vi trenger bare en Wi-Fi-modul og tilgang til internett for å få tid hvor som helst i verden ved hjelp av NTP-servere. I denne opplæringen vil vi bruke ESP8266 NodeMCU for å få aktuell tid og dato fra NTP-servere og vise den på OLED-skjerm.
Network Time Protocol (NTP)
NTP er en av de eldste nettverksinternettprotokollene (IP) for å synkronisere klokker mellom datanettverk. Den ble designet av David L. Mills ved University of Delaware i 1981. Denne protokollen kan brukes til å synkronisere mange nettverk til Coordinated Universal Time (UTC) innen få millisekunder. UTC er den primære tidsstandarden der verden regulerer klokke og tid. UTC endres ikke og varierer for forskjellige geografiske steder. NTP bruker UTC som tidsreferanse og gir nøyaktig og synkronisert tid over Internett.
NTP fungerer på en hierarkisk klient-servermodell. Toppmodellen har referanseklokker kjent som “stratum0” som atomur, radiobølger, GPS, GSM som mottar tid fra satellitten. Serverne som mottar tid fra stratum0 kalles "stratum1" og servere som mottar tid fra stratum1 kalles "stratum2" og så videre. Dette fortsetter og nøyaktigheten av tiden avtar etter hvert trinn. NTP velger automatisk den beste av flere tilgjengelige tidskilder som skal synkroniseres, noe som gjør det til en protokoll som kan fungere som tolerant.
Så her i dette prosjektet får vi tid fra NTP-serveren ved hjelp av ESP8266 NodeMCU og viser den på OLED-skjerm. Den samme typen internettklokke er bygget ved hjelp av ESP32 i forrige opplæring.
ESP8266 har tilgang til NTP-servere ved hjelp av internett for å få nøyaktig tid. Her fungerer NTP i klient-server- modus, ESP8266 fungerer som klientenhet og kobles til NTP-servere ved hjelp av UDP (User Datagram Protocol). Klienten sender en forespørselspakke til NTP-servere, og til gjengjeld sender NTP en tidsstempelpakke som består av informasjon som nøyaktighet, tidssone, UNIX-tidsstempel osv. Deretter skiller klienten dato og klokkeslett som kan brukes videre i applikasjoner i henhold til krav.
Komponenter kreves
- Monokrom 7-pinners SSD1306 0,96 ”OLED-skjerm
- ESP8266 NodeMCU
- Micro USB-kabel
- Brettbrett
- Mann til hann Jumper ledninger
Kretsdiagram og tilkoblinger
Denne 7-pinners OLED-skjermen kommuniserer med ESP8266-modulen ved hjelp av SPI-protokollen. Nedenfor er kretsskjemaet og tilkoblingstabellen for å koble OLED SPI-pinner med NodeMCU for å vise internettid.
Nei. |
OLED-skjerm |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) eller SDA (I2C) |
D7 |
5 |
NULLSTILLE |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
For å lære mer denne monokrome 7-pin OLED-skjermen og grensesnittet med ESP8266 NodeMCU, følg lenken.
Kode Forklaring
Først må vi laste ned og installere NTP-biblioteket i ESP8266. Det er mange biblioteker tilgjengelig for NTP Client. Du kan installere noen av dem fra Arduino IDE. I denne opplæringen har jeg installert NTPClient-biblioteket av Taranais fordi det er enkelt å bruke og har funksjoner for å få dato og tid fra NTP-servere. ESP8266 NodeMCU kan enkelt programmeres ved hjelp av Arduino IDE.
For å installere NTP-biblioteket, må du først laste ned biblioteket ved hjelp av lenken ovenfor og deretter installere det ved hjelp av Arduino IDE. For å installere det, gå til Skisse> Inkluder bibliotek> Legg til.ZIP-bibliotek , åpne deretter Zip-mappen ved å gå til stedet der du har lastet ned zip-mappen og start Arduino IDE på nytt.
NTPClient-biblioteket kommer med eksempler. Åpne Arduino IDE og Goto-eksempler> NTPClient> Avansert . Koden gitt i denne skissen viser tiden fra NTP-serveren på den serielle skjermen. Vi vil bruke denne skissen til å vise gjeldende tid og dato på OLED-skjerm.
Komplett kode er tilgjengelig på slutten av denne opplæringen, her har jeg forklart noen viktige deler av koden.
ESP8266WiFi-biblioteket gir ESP8266 spesifikke Wi-Fi-rutiner for å koble til nettverket. WiFiUDP.h håndterer sending og mottak av UDP-pakker. Siden vi bruker SPI-protokoll for å grensesnitt OLED med NodeMCU, vil vi derfor importere "SPI.h" -biblioteket. Og “Adafruit_GFX.h” og “Adafruit_SSD1306.h” brukes til OLED Display.
#inkludere
Vår OLED-størrelse er 128x64, så vi setter skjermbredde og høyde til henholdsvis 128 og 64. Så definer variablene for OLED-pinner koblet til NodeMCU for SPI-kommunikasjon.
#define SCREEN_WIDTH 128 // OLED-skjermbredde, i piksler #define SCREEN_HEIGHT 64 // OLED-skjermhøyde, i piksler // Erklæring for SSD1306-skjerm tilkoblet ved bruk av programvare SPI (standardtilfelle): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306-skjerm (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Bytt ut "your_ssid" og "your_password" med Wi-Fi SSID og passord i kodelinjene nedenfor.
const char * ssid = "your_ssid"; const char * password = "ditt_passord";
Sett opp WI-Fi-tilkobling ved å gi SSID og passord til WiFi.begin- funksjonen. Tilkoblingen av ESP8266 tar litt tid å bli koblet til NodeMCU, så vi må vente til den blir koblet til.
WiFi.begin (ssid, passord); mens (WiFi.status ()! = WL_CONNECTED) { forsinkelse (500); Serial.print ("."); }
For å be om dato og tid, initialiser tidsklienten med adressen til NTP-serverne. For bedre nøyaktighet velger du adressen til NTP-servere som ligger nær ditt geografiske område. Her bruker vi “ pool.ntp.org ” som gir servere fra hele verden. Hvis du ønsker å velge servere fra Asia, kan du bruke “ asia.pool.ntp.org ”. timeClient tar også UTC-tidsforskyvning i millisekunder av tidssonen din. For eksempel er UTC-forskyvning for India +5: 30, så vi konverterer denne forskyvningen i millisekunder som er lik 5 * 60 * 60 + 30 * 60 = 19800.
Område |
UTC-tidsforskyvning (timer og minutter) |
UTC tidsforskyvning (sekunder) |
INDIA |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC er gitt for å generere 3,3 V internt for å initialisere skjermen. Når OLED starter, vises " VELKOMMEN TIL KRETSDIGESTE " med tekststørrelse 2 og farge BLÅ i 3 sekunder.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 allocation failed")); til(;;); // Ikke fortsett, loop for alltid } display.clearDisplay (); display.setTextSize (2); // Tegn 2X-skala tekstvisning.setTextColor (BLÅ); display.setCursor (5, 2); display.println ("VELKOMMEN TIL"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); forsinkelse (3000);
NTP-klienten initialiseres ved hjelp av start () -funksjonen for å stille dato og tid fra NTP-servere.
timeClient.begin ();
Oppdateringsfunksjonen () brukes til å motta dato og klokkeslett når vi ber om NTP-servere.
timeClient.update ();
Baudrate på 115200 er satt til å skrive ut tiden på seriell skjerm.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay er biblioteksfunksjonen og gir gjeldende time, minutter, sekunder og dag fra NTP-serveren. Koden nedenfor brukes til å skille tid mellom AM og PM. Hvis timen vi får getHours () er større enn 12, setter vi tiden som PM ellers er 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"); } annet { 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 () brukes get date i “yyyy-mm-dd” format fra NTP-server. Denne funksjonen gir dato og tid i “yyyy-mm-dd Thh: mm: ss format. Men vi trenger bare dato, så vi må dele denne strengen som er lagret i formatet date_time til "T", som gjøres med substring () - funksjonen og deretter lagre datoen i "date" -variabelen.
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 ();
Slik vil OLED Internett-tidsklokke endelig se ut: