RTC లేదా రియల్ టైమ్ క్లాక్ అనేది ఎలక్ట్రానిక్స్ మరియు ఎంబెడెడ్ పరికరాల్లో సాధారణంగా ఉపయోగించే మాడ్యూల్. కానీ ఆర్టీసీతో సమస్య ఏమిటంటే కంప్యూటర్లలోని మైక్రోచిప్లు అంత ఖచ్చితమైనవి కావు మరియు అవి స్థానిక పరికరం యొక్క సమయాన్ని మాత్రమే అందించగలవు. మరోవైపు, ఎన్టిపి సర్వర్ల నుండి సమయాన్ని పొందటానికి ఇంటర్నెట్ను ఉపయోగించడం సమయం పొందడానికి మంచి పరిష్కారం, ఎందుకంటే ఇది మరింత ఖచ్చితమైనది మరియు ప్రపంచంలోని ఏ భౌగోళిక ప్రాంతం యొక్క సమయాన్ని అందిస్తుంది. NTP సర్వర్లను ఉపయోగించడం ద్వారా ప్రపంచంలో ఏ ప్రదేశంలోనైనా సమయం పొందడానికి మాకు Wi-Fi మాడ్యూల్ మరియు ఇంటర్నెట్కు ప్రాప్యత అవసరం. ఈ ట్యుటోరియల్లో, ఎన్టిపి సర్వర్ల నుండి ప్రస్తుత సమయం మరియు తేదీని పొందడానికి మేము ESP8266 నోడ్ఎంసియుని ఉపయోగిస్తాము మరియు దానిని OLED డిస్ప్లేలో ప్రదర్శిస్తాము.
నెట్వర్క్ టైమ్ ప్రోటోకాల్ (NTP)
కంప్యూటర్ నెట్వర్క్ల మధ్య గడియారాలను సమకాలీకరించడానికి పురాతన నెట్వర్కింగ్ ఇంటర్నెట్ ప్రోటోకాల్ (IP) లో NTP ఒకటి. దీనిని 1981 లో డెలావేర్ విశ్వవిద్యాలయానికి చెందిన డేవిడ్ ఎల్. మిల్స్ రూపొందించారు. ఈ ప్రోటోకాల్ అనేక నెట్వర్క్లను కొన్ని మిల్లీసెకన్లలో కోఆర్డినేటెడ్ యూనివర్సల్ టైమ్ (యుటిసి) కు సమకాలీకరించడానికి ఉపయోగపడుతుంది. UTC అనేది ప్రాధమిక సమయ ప్రమాణం, దీని ద్వారా ప్రపంచం గడియారం మరియు సమయాన్ని నియంత్రిస్తుంది. వివిధ భౌగోళిక స్థానాలకు UTC మారదు మరియు మారదు. NTP UTC ని సమయ సూచనగా ఉపయోగిస్తుంది మరియు ఇంటర్నెట్ అంతటా ఖచ్చితమైన మరియు సమకాలీకరించబడిన సమయాన్ని అందిస్తుంది.
NTP క్రమానుగత క్లయింట్-సర్వర్ నమూనాలో పనిచేస్తుంది. టాప్ మోడల్లో అణు గడియారాలు, రేడియో తరంగాలు, జిపిఎస్, జిఎస్ఎమ్ వంటి “స్ట్రాటమ్ 0” అని పిలువబడే రిఫరెన్స్ గడియారాలు ఉన్నాయి, ఇవి ఉపగ్రహం నుండి సమయాన్ని పొందుతాయి. స్ట్రాటమ్ 0 నుండి సమయాన్ని స్వీకరించే సర్వర్లను "స్ట్రాటమ్ 1" అని పిలుస్తారు మరియు స్ట్రాటమ్ 1 నుండి సమయాన్ని స్వీకరించే సర్వర్లను "స్ట్రాటమ్ 2" అని పిలుస్తారు. ఇది కొనసాగుతుంది మరియు ప్రతి దశ తర్వాత సమయం యొక్క ఖచ్చితత్వం తగ్గుతూ ఉంటుంది. సమకాలీకరించడానికి అందుబాటులో ఉన్న అనేక సమయ వనరులలో NTP స్వయంచాలకంగా ఎన్నుకుంటుంది, ఇది తప్పు-తట్టుకోగల సామర్థ్యం గల ప్రోటోకాల్ను చేస్తుంది.
కాబట్టి ఇక్కడ ఈ ప్రాజెక్ట్లో, మేము ESP8266 NodeMCU ని ఉపయోగించి NTP సర్వర్ నుండి సమయాన్ని పొందుతున్నాము మరియు దానిని OLED డిస్ప్లేలో చూపిస్తాము. మునుపటి ట్యుటోరియల్లో ESP32 ని ఉపయోగించడం ద్వారా ఇదే రకమైన ఇంటర్నెట్ గడియారం నిర్మించబడింది.
ESP8266 ఖచ్చితమైన సమయాన్ని పొందడానికి ఇంటర్నెట్ ఉపయోగించి NTP సర్వర్లను యాక్సెస్ చేయవచ్చు. ఇక్కడ NTP క్లయింట్-సర్వర్ మోడ్లో పనిచేస్తుంది, ESP8266 క్లయింట్ పరికరంగా పనిచేస్తుంది మరియు UDP (యూజర్ డేటాగ్రామ్ ప్రోటోకాల్) ఉపయోగించి NTP సర్వర్లతో కలుపుతుంది. క్లయింట్ ఒక అభ్యర్థన ప్యాకెట్ను NTP సర్వర్లకు ప్రసారం చేస్తుంది మరియు దానికి బదులుగా NTP టైమ్స్టాంప్ ప్యాకెట్ను పంపుతుంది, ఇందులో ఖచ్చితత్వం, టైమ్జోన్, యునిక్స్ టైమ్స్టాంప్ మొదలైన సమాచారం ఉంటుంది. అప్పుడు క్లయింట్ తేదీ మరియు సమయ వివరాలను వేరు చేస్తుంది, వీటిని అవసరాలకు అనుగుణంగా అనువర్తనాల్లో ఉపయోగించవచ్చు.
భాగాలు అవసరం
- మోనోక్రోమ్ 7-పిన్ SSD1306 0.96 ”OLED డిస్ప్లే
- ESP8266 నోడ్ఎంసియు
- మైక్రో USB కేబుల్
- బ్రెడ్బోర్డ్
- మగ నుండి మగ జంపర్ వైర్లు
సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్లు
ఈ 7-పిన్ OLED డిస్ప్లే SPI ప్రోటోకాల్ ఉపయోగించి ESP8266 మాడ్యూల్తో కమ్యూనికేట్ చేస్తుంది, ఇంటర్నెట్ సమయాన్ని ప్రదర్శించడానికి OLED SPI పిన్లను NodeMCU తో కనెక్ట్ చేయడానికి సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్ల పట్టిక క్రింద ఉన్నాయి.
లేదు. |
OLED డిస్ప్లే |
నోడ్ఎంసియు |
1 |
GND |
GND |
2 |
VDD |
3.3 వి |
3 |
ఎస్.సి.కె. |
డి 5 |
4 |
MOSI (SPI) లేదా SDA (I2C) |
డి 7 |
5 |
రీసెట్ చేయండి |
డి 3 |
6 |
DC |
డి 2 |
7 |
సి.ఎస్ |
డి 8 |
ఈ మోనోక్రోమ్ 7-పిన్ OLED డిస్ప్లే మరియు ESP8266 NodeMCU తో దాని ఇంటర్ఫేసింగ్ గురించి మరింత తెలుసుకోవడానికి, లింక్ను అనుసరించండి.
కోడ్ వివరణ
మొదట మనం ఎన్టిపి లైబ్రరీని ESP8266 లోకి డౌన్లోడ్ చేసి ఇన్స్టాల్ చేయాలి. ఎన్టిపి క్లయింట్ కోసం చాలా లైబ్రరీలు అందుబాటులో ఉన్నాయి. మీరు వాటిలో దేనినైనా Arduino IDE నుండి ఇన్స్టాల్ చేయవచ్చు. ఈ ట్యుటోరియల్లో నేను తారానైస్ చేత ఎన్టిపి క్లయింట్ లైబ్రరీని ఇన్స్టాల్ చేసాను ఎందుకంటే ఎన్టిపి సర్వర్ల నుండి తేదీ మరియు సమయాన్ని పొందడం సులభం మరియు ఫంక్షన్లను కలిగి ఉంది. ESP8266 NodeMCU ని Arduino IDE ఉపయోగించి సులభంగా ప్రోగ్రామ్ చేయవచ్చు.
NTP లైబ్రరీని వ్యవస్థాపించడానికి, మొదట పై లింక్ ఉపయోగించి లైబ్రరీని డౌన్లోడ్ చేసి, ఆపై Arduino IDE ని ఉపయోగించి ఇన్స్టాల్ చేయండి. దీన్ని ఇన్స్టాల్ చేయడానికి స్కెచ్> లైబ్రరీని చేర్చండి>.ZIP లైబ్రరీని జోడించి , ఆపై మీరు జిప్ ఫోల్డర్ను డౌన్లోడ్ చేసిన స్థానానికి వెళ్లి జిప్ ఫోల్డర్ను తెరిచి, ఆర్డునో IDE ని పున art ప్రారంభించండి.
NTPClient లైబ్రరీ ఉదాహరణలతో వస్తుంది. Arduino IDE మరియు Goto ఉదాహరణలు> NTPClient> అధునాతనమైనవి తెరవండి . ఈ స్కెచ్లో ఇచ్చిన కోడ్ సీరియల్ మానిటర్లోని ఎన్టిపి సర్వర్ నుండి సమయాన్ని ప్రదర్శిస్తుంది. OLED డిస్ప్లేలో ప్రస్తుత సమయం మరియు తేదీని ప్రదర్శించడానికి మేము ఈ స్కెచ్ను ఉపయోగిస్తాము.
ఈ ట్యుటోరియల్ చివరిలో పూర్తి కోడ్ అందుబాటులో ఉంది, ఇక్కడ నేను కోడ్ యొక్క కొన్ని ముఖ్యమైన భాగాన్ని వివరించాను.
ESP8266WiFi లైబ్రరీ నెట్వర్క్కు కనెక్ట్ కావడానికి ESP8266 నిర్దిష్ట Wi-Fi నిత్యకృత్యాలను అందిస్తుంది. WiFiUDP.h UDP ప్యాకేజీలను పంపడం మరియు స్వీకరించడం నిర్వహిస్తుంది. OLED ని NodeMCU తో ఇంటర్ఫేస్ చేయడానికి మేము SPI ప్రోటోకాల్ను ఉపయోగిస్తున్నాము కాబట్టి మేము “SPI.h” లైబ్రరీని దిగుమతి చేస్తాము. మరియు “Adafruit_GFX.h” మరియు “Adafruit_SSD1306.h” OLED డిస్ప్లే కోసం ఉపయోగించబడతాయి.
# చేర్చండి
మా OLED పరిమాణం 128x64 కాబట్టి మేము స్క్రీన్ వెడల్పు మరియు ఎత్తును వరుసగా 128 మరియు 64 గా సెట్ చేస్తున్నాము. కాబట్టి SPI కమ్యూనికేషన్ కోసం NodeMCU కి కనెక్ట్ చేయబడిన OLED పిన్ల కోసం వేరియబుల్స్ నిర్వచించండి.
# define SCREEN_WIDTH 128 // OLED డిస్ప్లే వెడల్పు పిక్సెళ్ళు # define SCREEN_HEIGHT 64 // OLED డిస్ప్లే ఎత్తు, పిక్సెళ్ళు లో // SSD1306 ప్రదర్శన కోసం డిక్లరేషన్ సాఫ్ట్వేర్ SPI (డిఫాల్ట్ సందర్భంలో) ఉపయోగించి కనెక్ట్: # define OLED_MOSI D7 # define OLED_CLK D5 # define OLED_DC D2 # OLED_CS D8 ని నిర్వచించండి # OLED_RESET D3 ని నిర్వచించండి
Adafruit_SSD1306 డిస్ప్లే (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
దిగువ కోడ్ పంక్తులలో “your_ssid” మరియు “your_password” ని మీ Wi-Fi SSID మరియు పాస్వర్డ్తో భర్తీ చేయండి.
const char * ssid = "your_ssid"; const char * password = "your_password";
WiFi.begin ఫంక్షన్కు SSID మరియు పాస్వర్డ్ ఇవ్వడం ద్వారా WI-Fi కనెక్షన్ను సెటప్ చేయండి. ESP8266 యొక్క కనెక్షన్ NodeMCU కి కనెక్ట్ కావడానికి కొంత సమయం పడుతుంది కాబట్టి ఇది కనెక్ట్ అయ్యే వరకు మేము వేచి ఉండాలి.
WiFi.begin (ssid, password); అయితే (WiFi.status ()! = WL_CONNECTED) { ఆలస్యం (500); సీరియల్.ప్రింట్ ("."); }
తేదీ మరియు సమయాన్ని అభ్యర్థించడానికి, NTP సర్వర్ల చిరునామాతో సమయ క్లయింట్ను ప్రారంభించండి. మంచి ఖచ్చితత్వం కోసం మీ భౌగోళిక ప్రాంతానికి దగ్గరగా ఉన్న NTP సర్వర్ల చిరునామాను ఎంచుకోండి. ఇక్కడ మేము ప్రపంచవ్యాప్తంగా పూల్ సర్వర్లను ఇచ్చే “ pool.ntp.org ” ని ఉపయోగిస్తాము. మీరు ఆసియా నుండి సర్వర్లను ఎన్నుకోవాలనుకుంటే మీరు “ asia.pool.ntp.org ” ను ఉపయోగించవచ్చు. టైమ్ క్లయింట్ మీ టైమ్జోన్ యొక్క మిల్లీసెకన్లలో UTC టైమ్ ఆఫ్సెట్ను కూడా తీసుకుంటుంది. ఉదాహరణకు, భారతదేశం కోసం UTC ఆఫ్సెట్ +5: 30 కాబట్టి మేము ఈ ఆఫ్సెట్ను 5 * 60 * 60 + 30 * 60 = 19800 కు సమానమైన మిల్లీసెకన్లలో మారుస్తాము.
ప్రాంతం |
UTC సమయం ఆఫ్సెట్ (గంటలు మరియు నిమిషాలు) |
UTC సమయం ఆఫ్సెట్ (సెకన్లు) |
భారతదేశం |
+5: 30 |
19800 |
లండన్ |
0:00 |
0 |
న్యూయార్క్ |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
ప్రదర్శనను ప్రారంభించడానికి అంతర్గతంగా 3.3V ను ఉత్పత్తి చేయడానికి SSD1306_SWITCHCAPVCC ఇవ్వబడుతుంది. OLED ప్రారంభమైనప్పుడు అది టెక్స్ట్ సైజు 2 తో “ వెల్కమ్ టు సర్క్యూట్ డైజెస్ట్ ” మరియు 3 సెకన్ల పాటు బ్లూ బ్లూను ప్రదర్శిస్తుంది.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 కేటాయింపు విఫలమైంది")); (;;); // కొనసాగవద్దు, ఎప్పటికీ లూప్ చేయండి } display.clearDisplay (); display.setTextSize (2); // 2X- స్కేల్ టెక్స్ట్ display.setTextColor (BLUE) గీయండి ; display.setCursor (5, 2); display.println ("స్వాగతం"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); ఆలస్యం (3000);
NTP సర్వర్ల నుండి తేదీ మరియు సమయాన్ని సెట్ చేయడానికి ప్రారంభ () ఫంక్షన్ను ఉపయోగించి NTP క్లయింట్ ప్రారంభించబడుతుంది .
timeClient.begin ();
మేము NTP సర్వర్లకు అభ్యర్థించినప్పుడల్లా తేదీ మరియు సమయాన్ని స్వీకరించడానికి నవీకరణ () ఫంక్షన్ ఉపయోగించబడుతుంది.
timeClient.update ();
సీరియల్ మానిటర్లో సమయాన్ని ముద్రించడానికి 115200 బాడ్ రేటు సెట్ చేయబడింది.
సీరియల్.బెగిన్ (115200); సీరియల్.ప్రింట్ల్న్ (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay లైబ్రరీ ఫంక్షన్ మరియు NTP సర్వర్ నుండి ప్రస్తుత గంట, నిమిషాలు, సెకన్లు మరియు రోజును ఇస్తుంది. AM మరియు PM మధ్య సమయాన్ని వేరు చేయడానికి క్రింది కోడ్ ఉపయోగించబడుతుంది. మేము getHours () ను ఉపయోగించే గంట 12 కన్నా ఎక్కువ ఉంటే, ఆ సమయాన్ని PM గా దాని AM గా సెట్ చేస్తాము.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = 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 day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () లో తేదీ పొందుటకు ఉపయోగిస్తారు "yyyy-mm-dd" NTP సర్వర్ నుండి ఫార్మాట్. ఈ ఫంక్షన్ తేదీ మరియు సమయాన్ని “yyyy-mm-dd T hh: mm: ss ఆకృతిలో ఇస్తుంది. కానీ మనకు తేదీ మాత్రమే కావాలి కాబట్టి ఈ స్ట్రింగ్ను డేట్_టైమ్ ఫార్మాట్లో “టి” వరకు విభజించవలసి ఉంటుంది, ఇది సబ్స్ట్రింగ్ () ఫంక్షన్ ద్వారా జరుగుతుంది మరియు ఆ తేదీని “డేట్” వేరియబుల్లో నిల్వ చేస్తుంది.
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); స్ట్రింగ్ తేదీ = date_time.substring (0, సూచిక_ తేదీ); సీరియల్.ప్రింట్ల్న్ (తేదీ); display.println (తేదీ); display.display ();
ఈ ఎలా ఉంది OLED ఇంటర్నెట్ సమయం గడియారం చివరకు కనిపిస్తుంది: