RTC או שעון זמן אמת הוא המודול הנפוץ ביותר באלקטרוניקה והתקנים משובצים כדי לעקוב אחר הזמן. אך הבעיה ב- RTC היא שהמיקרו-שבבים במחשבים אינם מדויקים כל כך והם יכולים לספק רק את זמן המכשיר המקומי. מצד שני, שימוש באינטרנט בכדי להביא את הזמן משרתי NTP הוא פיתרון טוב יותר לקבלת זמן מכיוון שהוא מדויק יותר ויכול לספק את הזמן של כל אזור גאוגרפי בעולם. אנחנו פשוט צריכים מודול Wi-Fi וגישה לאינטרנט כדי לזמן זמן מכל מקום בעולם באמצעות שרתי NTP. במדריך זה, נשתמש ב- ESP8266 NodeMCU בכדי לקבל זמן ותאריך נוכחיים משרתי NTP ולהציגו בתצוגת OLED.
פרוטוקול זמן רשת (NTP)
NTP הוא אחד מ- Internet Protocol (IP) הוותיקים ביותר לסינכרון שעונים בין רשתות מחשבים. הוא תוכנן על ידי דייוויד ל. מילס מאוניברסיטת דלאוור בשנת 1981. ניתן להשתמש בפרוטוקול זה לסינכרון רשתות רבות עם זמן אוניברסלי מתואם (UTC) תוך מספר אלפיות שניות. UTC הוא תקן הזמן העיקרי לפיו העולם מווסת את השעון והשעה. UTC אינו משתנה ומשתנה בהתאם למיקומים גיאוגרפיים שונים. NTP משתמש ב- UTC כנקודת זמן ומספק זמן מדויק ומסונכרן ברחבי האינטרנט.
NTP עובד על מודל שרת לקוח-היררכי. למודל העליון יש שעוני ייחוס המכונים "שכבה 0" כמו שעוני אטום, גלי רדיו, GPS, GSM שמקבל זמן מהלוויין. השרתים המקבלים זמן משכבה 0 מכונים "שכבה 1" ושרתים המקבלים זמן משכבה 1 מכונים "שכבה 2" וכן הלאה. זה נמשך ודיוק הזמן ממשיך ופוחת לאחר כל שלב. NTP בוחר אוטומטית את מיטב מקורות הזמן הזמינים לסינכרון, מה שהופך אותו לפרוטוקול מסוגל לתקלות.
אז כאן בפרויקט זה, אנחנו מקבלים זמן משרת NTP באמצעות ESP8266 NodeMCU ומציגים אותו בתצוגת OLED. אותו סוג של שעון אינטרנט נבנה באמצעות ESP32 במדריך הקודם.
ESP8266 יכול לגשת לשרתי NTP באמצעות האינטרנט כדי לקבל זמן מדויק. כאן NTP עובד במצב שרת לקוח, ESP8266 עובד כהתקן לקוח ומתחבר לשרתי NTP באמצעות UDP (User Datagram Protocol). הלקוח מעביר חבילת בקשה לשרתי NTP ובתמורה NTP שולח חבילת חותמת זמן הכוללת מידע כמו דיוק, אזור זמן, חותמת זמן של UNIX וכו 'ואז הלקוח מפריד בין פרטי התאריך והשעה אשר ניתן להשתמש בהם ביישומים בהתאם לדרישה.
רכיבים נדרשים
- מונוכרום 7 פינים SSD1306 0.96 ”OLED
- ESP8266 NodeMCU
- כבל מיקרו USB
- קרש לחם
- חוטי מגשר בין זכר לזכר
תרשים מעגלים וחיבורים
תצוגת OLED 7 פינים זו מתקשרת עם מודול ESP8266 באמצעות פרוטוקול SPI, להלן תרשים המעגל וטבלת החיבורים לחיבור סיכות OLED SPI עם NodeMCU להצגת זמן אינטרנט.
לא. |
תצוגת OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3 וולט |
3 |
SCK |
D5 |
4 |
MOSI (SPI) או SDA (I2C) |
D7 |
5 |
אִתחוּל |
D3 |
6 |
זֶרֶם יָשָׁר |
D2 |
7 |
CS |
D8 |
למידע נוסף על תצוגת OLED מונוכרום 7 פינים והתממשקותה עם ESP8266 NodeMCU, עקוב אחר הקישור.
הסבר קוד
ראשית עלינו להוריד ולהתקין את ספריית NTP לתוך ESP8266. ישנן ספריות רבות הזמינות עבור לקוח NTP. אתה יכול להתקין כל אחד מהם מ- Arduino IDE. במדריך זה התקנתי את ספריית NTPClient על ידי Taranais מכיוון שהיא קלה לשימוש ויש לה פונקציות להשגת תאריך ושעה משרתי NTP. ניתן לתכנת בקלות את ה- ESP8266 NodeMCU באמצעות Arduino IDE.
כדי להתקין את ספריית NTP, הורד תחילה את הספרייה באמצעות הקישור שלמעלה ואז התקן אותה באמצעות Arduino IDE. כדי להתקין אותו עבור אל סקיצה> כלול ספרייה> הוסף. ספריית.ZIP , ואז פתח את תיקיית ה- Zip על ידי מעבר למיקום שבו הורדת את תיקיית ה- zip והפעל מחדש את ה- IDE של Arduino.
ספריית NTPClient מגיעה עם דוגמאות. פתח Arduino IDE ו- Goto דוגמאות> NTPClient> מתקדם . הקוד המופיע בסקיצה זו מציג את הזמן משרת NTP בצג הטורי. נשתמש בסקיצה זו כדי להציג את השעה והתאריך הנוכחיים בתצוגת OLED.
קוד מלא זמין בסוף הדרכה זו, כאן הסברתי על חלק חשוב בקוד.
ספריית ESP8266WiFi מספקת שגרות Wi-Fi ספציפיות ל- ESP826 להתחברות לרשת. WiFiUDP.h מטפל בשליחה וקבלת חבילות UDP. מכיוון שאנו משתמשים בפרוטוקול SPI לממשק OLED עם NodeMCU ולכן נייבא את ספריית "SPI.h". ו- "Adafruit_GFX.h" ו- "Adafruit_SSD1306.h" משמשים לתצוגת OLED.
#לִכלוֹל
גודל ה- OLED שלנו הוא 128x64 ולכן אנו מגדירים את רוחב המסך וגובהו כ 128 ו- 64 בהתאמה. אז הגדירו את המשתנים לסיכות OLED המחוברות ל- NodeMCU לתקשורת SPI.
# הגדר SCREEN_WIDTH 128 // רוחב תצוגת OLED, בפיקסלים # הגדר SCREEN_HEIGHT 64 // גובה תצוגת OLED, בפיקסלים // הצהרה לתצוגה SSD1306 המחוברת באמצעות תוכנת SPI (מקרה ברירת מחדל): # הגדר OLED_MOSI D7 # הגדר OLED_CLK D5 # הגדר OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
תצוגת Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
החלף את "your_ssid" ו- "your_password" ב- SSID והסיסמה של ה- Wi-Fi בשורות הקוד שלהלן.
const char * ssid = "your_ssid"; const char * password = "your_password";
הגדר חיבור WI-Fi על ידי מתן SSID וסיסמה לפונקציה WiFi.begin . החיבור של ESP8266 לוקח קצת זמן להתחבר ל- NodeMCU ולכן עלינו לחכות עד שהוא מתחבר.
WiFi.begin (ssid, סיסמה); בעוד (WiFi.status ()! = WL_CONNECTED) { עיכוב (500); Serial.print ("."); }
כדי לבקש תאריך ושעה, אתחל את לקוח הזמן עם כתובת שרתי NTP. לקבלת דיוק טוב יותר בחר את כתובת שרתי NTP הקרובים לאזור הגיאוגרפי שלך. כאן אנו משתמשים ב- " pool.ntp.org " המספק שרתים מרחבי העולם. אם ברצונך לבחור שרתים מאסיה תוכל להשתמש ב " asia.pool.ntp.org ". timeClient לוקח גם קיזוז זמן 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);
SSD1306_SWITCHCAPVCC ניתן להפיק 3.3V פנימי כדי לאתחל את התצוגה. כאשר ה- OLED מתחיל הוא מציג " WELCOME TO CIRCUIT DIGEST " עם גודל טקסט 2 וצבע כחול למשך 3 שניות.
אם (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("הקצאת SSD1306 נכשלה")); ל(;;); // אל תמשיך, לולאה לנצח } display.clearDisplay (); display.setTextSize (2); // צייר תצוגת טקסט בקנה מידה 2.setTextColor (BLUE); display.setCursor (5, 2); display.println ("ברוך הבא"); 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 לפנות בוקר. אם השעה בה אנו משתמשים ב- getHours () גדולה מ- 12, אנו קובעים את הזמן הזה כ- PM אחר שהוא ה- AM שלו.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); אם (חה> 12) { חח = ח -12; display.print (hh); display.print (":"); display.print (מ"מ); display.print (":"); display.print (ss); display.println ("PM"); } אחר { display.print (hh); display.print (":"); display.print (מ"מ); display.print (":"); display.print (ss); display.println ("AM"); } int יום = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () משמש לקבל תאריך בתבנית "yyyy-mm-dd" משרת NTP. פונקציה זו נותנת תאריך ושעה בתבנית "yyyy-mm-dd Thh: 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 באינטרנט: