RTC أو Real Time Clock هي الوحدة النمطية الأكثر استخدامًا في الإلكترونيات والأجهزة المضمنة لتتبع الوقت. لكن مشكلة RTC هي أن الرقائق الدقيقة في أجهزة الكمبيوتر ليست دقيقة إلى هذا الحد ويمكنها فقط توفير وقت الجهاز المحلي. من ناحية أخرى ، يعد استخدام الإنترنت لجلب الوقت من خوادم NTP حلاً أفضل للحصول على الوقت لأنه أكثر دقة ويمكن أن يوفر الوقت لأي منطقة جغرافية في العالم. نحتاج فقط إلى وحدة Wi-Fi والوصول إلى الإنترنت للحصول على الوقت من أي مكان في العالم باستخدام خوادم NTP. في هذا البرنامج التعليمي ، سوف نستخدم ESP8266 NodeMCU للحصول على الوقت والتاريخ الحاليين من خوادم NTP وعرضه على شاشة OLED.
بروتوكول وقت الشبكة (NTP)
يعد NTP أحد أقدم بروتوكولات الإنترنت الشبكية (IP) لمزامنة الساعات بين شبكات الكمبيوتر. تم تصميمه بواسطة David L. Mills من جامعة ديلاوير في عام 1981. يمكن استخدام هذا البروتوكول لمزامنة العديد من الشبكات مع التوقيت العالمي المنسق (UTC) في غضون أجزاء قليلة من الثانية. UTC هو معيار الوقت الأساسي الذي ينظم العالم من خلاله الساعة والوقت. لا تتغير شركة UTC وتختلف باختلاف المواقع الجغرافية. يستخدم NTP التوقيت العالمي المنسق كمرجع زمني ويوفر وقتًا دقيقًا ومتزامنًا عبر الإنترنت.
يعمل NTP على نموذج خادم العميل الهرمي. يحتوي الطراز الأعلى على ساعات مرجعية تُعرف باسم "الطبقة 0" مثل الساعات الذرية ، وموجات الراديو ، ونظام تحديد المواقع العالمي ، ونظام GSM الذي يستقبل الوقت من القمر الصناعي. تسمى الخوادم التي تتلقى الوقت من stratum0 باسم “stratum1” والخوادم التي تتلقى الوقت من الطبقة 1 تسمى “stratum2” وهكذا. يستمر هذا وتتناقص دقة الوقت بعد كل مرحلة. يختار NTP تلقائيًا أفضل مصادر الوقت المتاحة المتعددة للمزامنة مما يجعله بروتوكولًا قادرًا على تحمل الأخطاء.
هنا في هذا المشروع ، نحصل على وقت من خادم NTP باستخدام ESP8266 NodeMCU ونعرضه على شاشة OLED. تم إنشاء هذا النوع نفسه من ساعة الإنترنت باستخدام ESP32 في البرنامج التعليمي السابق.
يمكن لـ ESP8266 الوصول إلى خوادم NTP باستخدام الإنترنت للحصول على وقت دقيق. هنا يعمل NTP في وضع خادم العميل ، ويعمل ESP8266 كجهاز عميل ويتصل بخوادم NTP باستخدام UDP (بروتوكول مخطط بيانات المستخدم). يرسل العميل حزمة طلب إلى خوادم NTP وفي المقابل يرسل NTP حزمة طابع زمني تتكون من معلومات مثل الدقة والمنطقة الزمنية والطابع الزمني لـ UNIX وما إلى ذلك. ثم يفصل العميل تفاصيل التاريخ والوقت التي يمكن استخدامها في التطبيقات وفقًا للمتطلبات.
المكونات مطلوبة
- شاشة OLED أحادية اللون ذات 7 سنون SSD1306 0.96 بوصة
- ESP8266 NodeMCU
- كابل Micro USB
- اللوح
- ذكر إلى ذكر الأسلاك الطائر
مخطط الدائرة والتوصيلات
تتصل شاشة OLED ذات 7 سنون بوحدة ESP8266 باستخدام بروتوكول SPI ، فيما يلي مخطط الدائرة وجدول التوصيلات لتوصيل دبابيس OLED SPI بـ NodeMCU لعرض وقت الإنترنت.
لا. |
شاشة OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3 فولت |
3 |
SCK |
د 5 |
4 |
MOSI (SPI) أو SDA (I2C) |
د 7 |
5 |
إعادة تعيين |
د 3 |
6 |
العاصمة |
د 2 |
7 |
CS |
د 8 |
لمعرفة المزيد عن شاشة OLED أحادية اللون هذه وواجهتها مع ESP8266 NodeMCU ، اتبع الرابط.
شرح الكود
أولاً ، يتعين علينا تنزيل مكتبة NTP وتثبيتها في ESP8266. هناك العديد من المكتبات المتاحة لعميل NTP. يمكنك تثبيت أي منها من Arduino IDE. في هذا البرنامج التعليمي ، قمت بتثبيت مكتبة NTPClient بواسطة Taranais لأنها سهلة الاستخدام ولديها وظائف للحصول على التاريخ والوقت من خوادم NTP. يمكن برمجة ESP8266 NodeMCU بسهولة باستخدام Arduino IDE.
لتثبيت مكتبة NTP ، قم أولاً بتنزيل المكتبة باستخدام الرابط أعلاه ثم قم بتثبيتها باستخدام Arduino IDE. لتثبيته ، انتقل إلى Sketch> Include Library> Add.ZIP Library ، ثم افتح مجلد Zip بالانتقال إلى الموقع الذي قمت بتنزيل المجلد المضغوط فيه وأعد تشغيل Arduino IDE.
مكتبة NTPClient تأتي مع أمثلة. افتح Arduino IDE و Goto Examples> NTPClient> Advanced . يعرض الرمز الوارد في هذا الرسم البياني الوقت من خادم NTP على الشاشة التسلسلية. سنستخدم هذا الرسم التخطيطي لعرض الوقت والتاريخ الحاليين على شاشة OLED.
الكود الكامل متاح في نهاية هذا البرنامج التعليمي ، هنا شرحت بعض الأجزاء المهمة من الكود.
توفر مكتبة ESP8266WiFi إجراءات Wi-Fi محددة لـ ESP8266 للاتصال بالشبكة. يتعامل WiFiUDP.h مع إرسال واستقبال حزم UDP. نظرًا لأننا نستخدم بروتوكول SPI لواجهة OLED مع NodeMCU ، فسنقوم باستيراد مكتبة "SPI.h". ويتم استخدام "Adafruit_GFX.h" و "Adafruit_SSD1306.h" لعرض OLED.
#تضمن
حجم OLED الخاص بنا هو 128 × 64 ، لذلك نحن نضع عرض الشاشة وارتفاعها على 128 و 64 على التوالي. لذلك حدد متغيرات دبابيس OLED المتصلة بـ NodeMCU لاتصال SPI.
#define SCREEN_WIDTH 128 // عرض عرض OLED ، بالبكسل #define SCREEN_HEIGHT 64 // OLED display height ، بالبكسل // إعلان لشاشة SSD1306 متصلة باستخدام برنامج SPI (الحالة الافتراضية): # تعريف OLED_MOSI D7 # تعريف OLED_CLK D5 # تعريف 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" ؛
قم بإعداد اتصال WI-Fi عن طريق إعطاء SSID وكلمة المرور لوظيفة WiFi.begin . يستغرق اتصال ESP8266 بعض الوقت للاتصال بـ NodeMCU لذلك يتعين علينا الانتظار حتى يتم الاتصال.
WiFi.begin (SSID ، كلمة المرور) ؛ while (WiFi.status ()! = WL_CONNECTED) { delay (500) ؛ Serial.print (".") ؛ }
لطلب التاريخ والوقت ، قم بتهيئة عميل الوقت بعنوان خوادم NTP. للحصول على دقة أفضل ، اختر عنوان خوادم NTP القريبة من منطقتك الجغرافية. هنا نستخدم “ pool.ntp.org ” الذي يوفر خوادم من جميع أنحاء العالم. إذا كنت ترغب في اختيار خوادم من آسيا يمكنك استخدام " asia.pool.ntp.org ". يأخذ timeClient أيضًا موازنة التوقيت العالمي المنسق (UTC) بالمللي ثانية من منطقتك الزمنية. على سبيل المثال ، تعويض التوقيت العالمي المنسق (UTC) للهند هو +5: 30 لذلك نقوم بتحويل هذا الإزاحة بالمللي ثانية والتي تساوي 5 * 60 * 60 + 30 * 60 = 19800.
منطقة |
تعويض الوقت بالتوقيت العالمي المنسق (ساعات ودقائق) |
تعويض الوقت بالتوقيت العالمي المنسق (بالثواني) |
الهند |
+5: 30 |
19800 |
لندن |
0:00 |
0 |
نيويورك |
-5: 00 |
-18000 |
WiFiUDP ntpUDP ؛ NTPClient timeClient (ntpUDP، "pool.ntp.org"، 1980060000) ؛
يتم إعطاء SSD1306_SWITCHCAPVCC لتوليد 3.3 فولت داخليًا لتهيئة العرض. عند بدء تشغيل OLED ، يعرض " WELCOME TO CIRCUIT DIGEST " بحجم النص 2 واللون الأزرق لمدة 3 ثوانٍ.
إذا (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("فشل تخصيص SSD1306")) ؛ إلى عن على(؛؛)؛ // لا تتابع ، حلقة للأبد } display.clearDisplay ()؛ display.setTextSize (2) ، // رسم عرض نص بحجم 2X.setTextColor (أزرق) ؛ display.setCursor (5، 2) ؛ display.println ("WELCOME TO") ؛ display.println ("CIRCUIT") ؛ display.println ("DIGEST") ؛ display.display () ، تأخير (3000) ؛
تتم تهيئة عميل NTP باستخدام وظيفة start () لتعيين التاريخ والوقت من خوادم NTP.
timeClient.begin () ،
تُستخدم وظيفة Update () لتلقي التاريخ والوقت كلما طلبنا ذلك إلى خوادم NTP.
timeClient.update () ،
معدل الباود 115200 مضبوط لطباعة الوقت على الشاشة التسلسلية.
Serial.begin (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 = timeClient.getDay () ، إذا (hh> 12) { hh = hh-12 ؛ display.print (hh) ؛ display.print (":") ؛ طباعة الشاشة (مم) ؛ display.print (":") ؛ display.print (ss) ؛ display.println ("PM") ؛ } else { display.print (hh)؛ display.print (":") ؛ طباعة الشاشة (مم) ؛ 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 حتى "T" الذي يتم بواسطة دالة substring () ثم تخزين التاريخ في متغير "date" .
date_time = timeClient.getFormattedDate () ، int index_date = date_time.indexOf ("T") ؛ تاريخ السلسلة = date_time.substring (0، index_date) ؛ Serial.println (التاريخ) ؛ display.println (التاريخ) ؛ display.display () ،
هكذا ستبدو ساعة OLED Internet Time Clock أخيرًا: