आरटीसी या रियल टाइम क्लॉक, समय का ध्यान रखने के लिए इलेक्ट्रॉनिक्स और एम्बेडेड उपकरणों में सबसे अधिक उपयोग किया जाने वाला मॉड्यूल है। लेकिन आरटीसी के साथ समस्या यह है कि कंप्यूटर में माइक्रोचिप्स बहुत सटीक नहीं हैं और वे केवल स्थानीय डिवाइस का समय प्रदान कर सकते हैं। दूसरी ओर, एनटीपी सर्वर से समय प्राप्त करने के लिए इंटरनेट का उपयोग करना समय प्राप्त करने के लिए बेहतर समाधान है क्योंकि यह अधिक सटीक है और दुनिया के किसी भी भौगोलिक क्षेत्र का समय प्रदान कर सकता है। हमें बस एनटीपी सर्वरों का उपयोग करके दुनिया के किसी भी स्थान का समय पाने के लिए वाई-फाई मॉड्यूल और इंटरनेट तक पहुंच की आवश्यकता है। इस ट्यूटोरियल में, हम एनटीपी सर्वरों से वर्तमान समय और दिनांक प्राप्त करने और इसे OLED डिस्प्ले पर प्रदर्शित करने के लिए ESP8266 NodeMCU का उपयोग करेंगे ।
नेटवर्क टाइम प्रोटोकॉल (NTP)
कंप्यूटर नेटवर्क के बीच घड़ियों को सिंक्रनाइज़ करने के लिए NTP सबसे पुराना नेटवर्किंग इंटरनेट प्रोटोकॉल (IP) है। यह डेलावेयर विश्वविद्यालय के डेविड एल मिल्स द्वारा 1981 में डिजाइन किया गया था। इस प्रोटोकॉल का उपयोग कुछ मिली सेकेंड के भीतर कई नेटवर्क को समन्वित यूनिवर्सल टाइम (यूटीसी) में सिंक्रनाइज़ करने के लिए किया जा सकता है । UTC प्राथमिक समय मानक है जिसके द्वारा दुनिया घड़ी और समय को नियंत्रित करती है। यूटीसी अलग-अलग भौगोलिक स्थानों के लिए बदलता और बदलता नहीं है। NTP समय संदर्भ के रूप में UTC का उपयोग करता है और इंटरनेट पर सटीक और सिंक्रनाइज़ समय प्रदान करता है।
NTP एक पदानुक्रमित क्लाइंट-सर्वर मॉडल पर काम करता है। शीर्ष मॉडल में परमाणु घड़ियों, रेडियो तरंगों, जीपीएस, जीएसएम जैसे "स्ट्रैटमू" के रूप में जानी जाने वाली संदर्भ घड़ियां हैं जो उपग्रह से समय प्राप्त करती हैं। वे सर्वर जिन्हें स्ट्रैटम 0 से समय मिलता है, उन्हें "स्ट्रैटम 1" कहा जाता है और स्ट्रैटम 1 से समय प्राप्त करने वाले सर्वरों को "स्ट्रैटम 2" कहा जाता है । यह आगे बढ़ता है और प्रत्येक चरण के बाद समय की सटीकता कम होती चली जाती है। NTP स्वचालित रूप से सिंक्रनाइज़ करने के लिए कई उपलब्ध समय स्रोतों में से सर्वश्रेष्ठ का चयन करता है जो इसे दोष-सहिष्णु सक्षम प्रोटोकॉल बनाता है।
इसलिए इस परियोजना में, हम ईएसपी 8266 एनओडीएमसीयू का उपयोग करके एनटीपी सर्वर से समय निकाल रहे हैं और इसे ओएलईडी डिस्प्ले पर दिखा रहे हैं । इसी तरह की इंटरनेट घड़ी पिछले ट्यूटोरियल में ईएसपी 32 का उपयोग करके बनाई गई है।
ईएसपी 8266 सटीक समय प्राप्त करने के लिए इंटरनेट का उपयोग करके एनटीपी सर्वरों तक पहुंच सकता है। यहाँ NTP क्लाइंट-सर्वर मोड में काम करता है, ESP8266 क्लाइंट डिवाइस के रूप में काम करता है और UDP (उपयोगकर्ता डेटाग्राम प्रोटोकॉल) का उपयोग करते हुए NTP सर्वर से जुड़ता है । क्लाइंट एनटीपी सर्वरों के लिए एक अनुरोध पैकेट पहुंचाता है और बदले में NTP एक टाइमस्टैम्प पैकेट भेजता है जिसमें सटीकता, टाइमज़ोन, UNIX टाइमस्टैम्प इत्यादि जैसी जानकारी होती है। फिर क्लाइंट तारीख और समय के विवरण को अलग करता है जिसे आवश्यकता के अनुसार अनुप्रयोगों में आगे उपयोग किया जा सकता है।
अवयव आवश्यक
- मोनोक्रोम 7-पिन SSD1306 0.96 ”OLED डिस्प्ले
- ESP8266 NodeMCU
- माइक्रो यूएसबी केबल
- ब्रेड बोर्ड
- नर से नर जम्पर तार
सर्किट आरेख और कनेक्शन
यह 7-पिन ओएलईडी डिस्प्ले एसपीआई प्रोटोकॉल का उपयोग करते हुए ईएसपी 8266 मॉड्यूल के साथ संचार करता है, नीचे एनएलएमसीयू के साथ ओएलईडी एसपीआई पिंस को इंटरनेट समय प्रदर्शित करने के लिए सर्किट आरेख और कनेक्शन तालिका है ।
नहीं। |
OLED प्रदर्शन |
NodeMCU |
1 |
GND |
GND |
२ |
VDD |
3.3 |
३ |
SCK |
D5 |
४ |
MOSI (SPI) या SDA (I2C) |
डी 7 |
५ |
रीसेट |
डी 3 |
६ |
डीसी |
डी 2 |
। |
सीएस |
डी 8 |
इस मोनोक्रोम 7-पिन ओएलईडी डिस्प्ले और ईएसपी 8266 एनओडीएमसीयू के साथ इसके इंटरफेसिंग के बारे में अधिक जानने के लिए, लिंक का अनुसरण करें।
कोड स्पष्टीकरण
सबसे पहले हमें NTP लाइब्रेरी को ESP8266 में डाउनलोड और इंस्टॉल करना होगा। NTP क्लाइंट के लिए कई लाइब्रेरी उपलब्ध हैं। आप Arduino IDE से उनमें से कोई भी इंस्टॉल कर सकते हैं। इस ट्यूटोरियल में मैंने टारैनिस द्वारा NTPClient लाइब्रेरी स्थापित की है क्योंकि इसका उपयोग करना आसान है और NTP सर्वर से दिनांक और समय प्राप्त करने के लिए फ़ंक्शन करना आवश्यक है। ESP8266 NodeMCU को Arduino IDE का उपयोग करके आसानी से प्रोग्राम किया जा सकता है।
NTP लाइब्रेरी स्थापित करने के लिए, पहले उपरोक्त लिंक का उपयोग करके लाइब्रेरी डाउनलोड करें और फिर इसे Arduino IDE का उपयोग करके इंस्टॉल करें। इसे स्थापित करने के लिए स्केच पर जाएं> लाइब्रेरी> Add.ZIP लाइब्रेरी शामिल करें , फिर उस स्थान पर जाकर ज़िप फ़ोल्डर खोलें जहां आपने ज़िप फ़ोल्डर डाउनलोड किया है और Arduino IDE को पुनरारंभ करें।
NTPClient पुस्तकालय उदाहरण के साथ आता है। Arduino IDE और गोटो उदाहरण खोलें > NTPClient> उन्नत । इस स्केच में दिया गया कोड सीरियल मॉनिटर पर NTP सर्वर से समय प्रदर्शित करता है। हम इस स्केच का उपयोग OLED प्रदर्शन पर वर्तमान समय और तारीख को प्रदर्शित करने के लिए करेंगे।
इस ट्यूटोरियल के अंत में पूरा कोड उपलब्ध है, यहाँ मैंने कोड के कुछ महत्वपूर्ण भाग के बारे में बताया है।
ESP8266WiFi लाइब्रेरी नेटवर्क से कनेक्ट करने के लिए ESP8266 विशिष्ट वाई-फाई दिनचर्या प्रदान करता है। WiFiUDP.h UDP पैकेज भेजने और प्राप्त करने का काम संभालता है। चूंकि हम NodeMCU के साथ OLED को इंटरफ़ेस करने के लिए SPI प्रोटोकॉल का उपयोग कर रहे हैं इसलिए हम "SPI.h" लाइब्रेरी आयात करेंगे। और OLED प्रदर्शन के लिए "Adafruit_GFX.h" और "Adafruit_SSD1306.h" का उपयोग किया जाता है।
#शामिल
हमारा 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 OLEDDC D2 #define OLED_CS D8 #define OLED_RESET डी 3
Adafruit_SSD1306 प्रदर्शन (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
कोड के नीचे लाइनों में अपने वाई-फाई SSID और पासवर्ड के साथ "your_ssid" और "your_password" को बदलें।
const char * ssid = "your_ssid"; const char * पासवर्ड = "your_password";
WiFi.begin फ़ंक्शन को SSID और पासवर्ड देकर WI-Fi कनेक्शन सेट करें । ESP8266 का कनेक्शन NodeMCU से जुड़ने में कुछ समय लेता है इसलिए हमें इसके कनेक्ट होने तक इंतजार करना होगा।
WiFi.begin (ssid, पासवर्ड); जबकि (WiFi.status ()! = WL_CONNECTED) { विलंब (500); सीरियल.प्रिंट ("।"); }
दिनांक और समय का अनुरोध करने के लिए, एनटीपी सर्वर के पते के साथ टाइम क्लाइंट को इनिशियलाइज़ करें । बेहतर सटीकता के लिए NTP सर्वर का पता चुनें जो आपके भौगोलिक क्षेत्र के करीब हैं। यहाँ हम “ pool.ntp.org ” का उपयोग करते हैं, जो दुनिया भर से सर्वर देता है। यदि आप एशिया से सर्वर चुनना चाहते हैं तो आप " asia.pool.ntp.org " का उपयोग कर सकते हैं । timeClient आपके टाइमज़ोन के मिलीसेकंड में UTC के समय की ऑफ़सेट भी लेता है। उदाहरण के लिए, भारत के लिए UTC ऑफसेट +5: 30 है इसलिए हम इस ऑफसेट को मिलीसेकंड में परिवर्तित करते हैं जो 5 * 60 * 60 + 30 * 60 = 19800 के बराबर है।
क्षेत्र |
यूटीसी समय ऑफसेट (घंटे और मिनट) |
UTC समय ऑफ़सेट (सेकंड) |
भारत |
+5: 30 |
19800 |
लंडन |
0 |
० |
न्यूयॉर्क |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC डिस्प्ले को इनिशियलाइज़ करने के लिए आंतरिक रूप से 3.3V जेनरेट करने के लिए दिया गया है। जब OLED शुरू होता है तो यह टेक्स्ट साइज़ 2 और 3 सेकंड के लिए BLUE रंग के साथ " WELCOME TO CIRCUIT DIGEST " प्रदर्शित करता है ।
अगर (प्रदर्शन.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 आवंटन विफल")); के लिये(;;); // आगे न बढ़ें, लूप हमेशा के लिए } display.clearDisplay (); display.setTextSize (2); // 2X- स्केल टेक्स्ट डिस्प्ले ड्रा करें ।setTextColor (BLUE); display.setCursor (5, 2); display.println ("आपका स्वागत है"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); देरी (3000);
NTP क्लाइंट आरंभिक () फंक्शन को NTP सर्वर से दिनांक और समय निर्धारित करने के लिए उपयोग करके आरंभीकृत किया जाता है।
timeClient.begin ();
अद्यतन () फ़ंक्शन का उपयोग दिनांक और समय प्राप्त करने के लिए किया जाता है जब भी हम एनटीपी सर्वरों से अनुरोध करते हैं।
timeClient.update ();
115200 की बॉड दर सीरियल मॉनीटर पर समय प्रिंट करने के लिए निर्धारित है।
सीरियल.बेगिन (115200); Serial.println (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 (":"); display.print (ss); display.println ("PM"); } और { display.print (hh); display.print (":"); डिस्प्ले.प्रिंट (मिमी); display.print (":"); display.print (ss); display.println ("AM"); } int day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () का उपयोग NTP सर्वर से "yyyy-mm-dd" प्रारूप में दिनांक प्राप्त करने के लिए किया जाता है। यह फ़ंक्शन “yyyy-mm-dd T hh: mm: ss प्रारूप ” में दिनांक और समय देता है । लेकिन हमें केवल तारीख की आवश्यकता है इसलिए हमें इस स्ट्रिंग को विभाजित करना होगा जो दिनांक_ समय प्रारूप में "टी" तक संग्रहीत होती है जो कि विकल्प () फ़ंक्शन द्वारा किया जाता है और फिर तारीख को "तिथि" चर में संग्रहीत किया जाता है ।
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); स्ट्रिंग तिथि = date_time.substring (0, index_date); धारावाहिक.प्रदर्शन (तारीख); display.println (तारीख); display.display ();
यह कैसे OLED इंटरनेट समय घड़ी अंत में दिखेगा: