- Πρωτόκολλο ώρας δικτύου (NTP)
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις
- Επεξήγηση κώδικα
Το RTC ή το Ρολόι πραγματικού χρόνου είναι η πιο συχνά χρησιμοποιούμενη μονάδα σε Ηλεκτρονικά και ενσωματωμένες συσκευές για παρακολούθηση του χρόνου. Αλλά το πρόβλημα με το RTC είναι ότι τα μικροτσίπ στους υπολογιστές δεν είναι τόσο ακριβή και μπορούν να παρέχουν μόνο την ώρα της τοπικής συσκευής. Από την άλλη πλευρά, η χρήση του Διαδικτύου για ανάκτηση χρόνου από διακομιστές NTP είναι καλύτερη λύση για την απόκτηση χρόνου, καθώς είναι πιο ακριβής και μπορεί να παρέχει τον χρόνο οποιασδήποτε γεωγραφικής περιοχής στον κόσμο. Χρειαζόμαστε απλώς μια μονάδα Wi-Fi και πρόσβαση στο Διαδίκτυο για να πάρουμε χρόνο από οποιαδήποτε τοποθεσία στον κόσμο χρησιμοποιώντας διακομιστές NTP. Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε το ESP8266 NodeMCU για να λάβουμε την τρέχουσα ώρα και ημερομηνία από διακομιστές NTP και να το εμφανίσουμε στην οθόνη OLED.
Πρωτόκολλο ώρας δικτύου (NTP)
Το NTP είναι ένα από τα παλαιότερα πρωτόκολλα διαδικτύου δικτύωσης (IP) για συγχρονισμό ρολογιών μεταξύ δικτύων υπολογιστών. Σχεδιάστηκε από τον David L. Mills του Πανεπιστημίου του Ντελαγουέρ το 1981. Αυτό το πρωτόκολλο μπορεί να χρησιμοποιηθεί για τον συγχρονισμό πολλών δικτύων με τη Συντονισμένη Καθολική Ώρα (UTC) μέσα σε λίγα χιλιοστά του δευτερολέπτου. Το UTC είναι το πρωταρχικό πρότυπο χρόνου με το οποίο ο κόσμος ρυθμίζει το ρολόι και την ώρα. Το UTC δεν αλλάζει και διαφέρει για διαφορετικές γεωγραφικές τοποθεσίες. Το NTP χρησιμοποιεί το UTC ως αναφορά ώρας και παρέχει ακριβή και συγχρονισμένο χρόνο στο Διαδίκτυο.
Το NTP λειτουργεί σε ένα ιεραρχικό μοντέλο πελάτη-διακομιστή. Το κορυφαίο μοντέλο έχει ρολόγια αναφοράς γνωστά ως "stratum0" όπως ατομικά ρολόγια, ραδιοκύματα, GPS, GSM που λαμβάνει χρόνο από τον δορυφόρο. Οι διακομιστές που λαμβάνουν χρόνο από το stratum0 ονομάζονται «stratum1» και οι διακομιστές που λαμβάνουν χρόνο από το stratum1 ονομάζονται «stratum2» και ούτω καθεξής. Αυτό συνεχίζεται και η ακρίβεια του χρόνου μειώνεται μετά από κάθε στάδιο. Το 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
- Καλώδιο Micro USB
- Ψωμί
- Καλώδια από αρσενικό σε αρσενικό
Διάγραμμα κυκλώματος και συνδέσεις
Αυτή η οθόνη 7 ακίδων OLED επικοινωνεί με τη μονάδα ESP8266 χρησιμοποιώντας το πρωτόκολλο SPI, παρακάτω είναι το διάγραμμα κυκλώματος και ο πίνακας συνδέσεων για τη σύνδεση των καρφιτσών OLED SPI με το NodeMCU για την εμφάνιση ώρας στο Διαδίκτυο.
Οχι. |
Οθόνη OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
Δ5 |
4 |
MOSI (SPI) ή SDA (I2C) |
Δ7 |
5 |
ΕΠΑΝΑΦΟΡΑ |
Δ3 |
6 |
DC |
Δ2 |
7 |
CS |
Δ8 |
Για να μάθετε περισσότερα, αυτή η μονόχρωμη οθόνη OLED 7 ακίδων και η διασύνδεσή της με το ESP8266 NodeMCU, ακολουθήστε τον σύνδεσμο.
Επεξήγηση κώδικα
Πρώτα πρέπει να κατεβάσουμε και να εγκαταστήσουμε τη βιβλιοθήκη NTP στο ESP8266. Υπάρχουν πολλές βιβλιοθήκες διαθέσιμες για το NTP Client. Μπορείτε να εγκαταστήσετε οποιοδήποτε από αυτά από το Arduino IDE. Σε αυτό το σεμινάριο έχω εγκαταστήσει τη βιβλιοθήκη NTPClient από τον Taranais επειδή είναι εύκολο στη χρήση και έχει λειτουργίες για να λαμβάνω ημερομηνία και ώρα από διακομιστές NTP. Το ESP8266 NodeMCU μπορεί να προγραμματιστεί εύκολα χρησιμοποιώντας το Arduino IDE.
Για να εγκαταστήσετε τη βιβλιοθήκη NTP, κατεβάστε πρώτα τη βιβλιοθήκη χρησιμοποιώντας τον παραπάνω σύνδεσμο και μετά εγκαταστήστε τη χρησιμοποιώντας το Arduino IDE. Για να το εγκαταστήσετε μεταβείτε στο Σκίτσο> Συμπερίληψη βιβλιοθήκης> Προσθήκη βιβλιοθήκης.ZIP και , στη συνέχεια, ανοίξτε το φάκελο Zip μεταβαίνοντας στη θέση όπου έχετε κατεβάσει το φάκελο zip και επανεκκινήστε το Arduino IDE.
Η βιβλιοθήκη NTPClient συνοδεύεται από παραδείγματα. Ανοίξτε Arduino IDE και Goto Παραδείγματα> NTPClient> Advanced . Ο κωδικός που δίνεται σε αυτό το σκίτσο εμφανίζει την ώρα από το διακομιστή NTP στη σειριακή οθόνη. Θα χρησιμοποιήσουμε αυτό το σκίτσο για να εμφανίσουμε την τρέχουσα ώρα και ημερομηνία στην οθόνη OLED.
Ο πλήρης κώδικας είναι διαθέσιμος στο τέλος αυτού του σεμιναρίου, εδώ εξήγησα λίγο σημαντικό μέρος του κώδικα.
Η βιβλιοθήκη ESP8266 Wi-Fi παρέχει συγκεκριμένες ρουτίνες Wi-Fi ESP8266 για σύνδεση στο δίκτυο. Το WiFiUDP.h χειρίζεται την αποστολή και τη λήψη πακέτων UDP. Δεδομένου ότι χρησιμοποιούμε πρωτόκολλο SPI για διασύνδεση OLED με NodeMCU, επομένως θα εισαγάγουμε βιβλιοθήκη "SPI.h". Και τα "Adafruit_GFX.h" και "Adafruit_SSD1306.h" χρησιμοποιούνται για OLED Display.
#περιλαμβάνω
Το μέγεθος OLED μας είναι 128x64, οπότε ορίζουμε πλάτος και ύψος οθόνης ως 128 και 64 αντίστοιχα. Ορίστε λοιπόν τις μεταβλητές για καρφίτσες OLED συνδεδεμένες στο NodeMCU για επικοινωνία SPI.
#define SCREEN_WIDTH 128 // OLED πλάτος οθόνης, σε pixel #define SCREEN_HEIGHT 64 // OLED ύψος οθόνης, σε pixel // Δήλωση για οθόνη 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" με το SSID Wi-Fi και τον κωδικό πρόσβασής σας στις παρακάτω γραμμές κώδικα.
const char * ssid = "your_ssid"; const char * password = "your_password";
Ρυθμίστε τη σύνδεση WI-Fi δίνοντας SSID και κωδικό πρόσβασης στη λειτουργία WiFi.begin . Η σύνδεση του ESP8266 χρειάζεται λίγο χρόνο για να συνδεθείτε στο NodeMCU, οπότε πρέπει να περιμένουμε μέχρι να συνδεθεί.
WiFi.begin (SSD, κωδικός πρόσβασης); ενώ (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, εμφανίζεται η ένδειξη " ΚΑΛΩΣ ΗΡΘΑΤΕ ΣΤΟ ΚΥΚΛΩΜΑ " DIGEST "με μέγεθος κειμένου 2 και χρώμα ΜΠΛΕ για 3 δευτερόλεπτα.
εάν (! 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 ("ΚΥΚΛΩΜΑ"); display.println ("DIGEST"); display.display (); καθυστέρηση (3000)
Ο πελάτης NTP αρχικοποιείται χρησιμοποιώντας τη λειτουργία begin () για να ορίσετε ημερομηνία και ώρα από διακομιστές NTP.
timeClient.begin ();
Η συνάρτηση ενημέρωσης () χρησιμοποιείται για τη λήψη της ημερομηνίας και της ώρας όποτε ζητάμε στους διακομιστές NTP.
timeClient.update ();
Ο ρυθμός Baud 115200 έχει ρυθμιστεί ώστε να εκτυπώνει το χρόνο στη σειριακή οθόνη.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay είναι η λειτουργία βιβλιοθήκης και δίνει την τρέχουσα ώρα, λεπτά, δευτερόλεπτα και ημέρα από τον διακομιστή NTP. Ο παρακάτω κωδικός χρησιμοποιείται για τη διαφοροποίηση του χρόνου μεταξύ ΠΜ και ΜΜ. Εάν η ώρα που χρησιμοποιούμε το getHours () είναι μεγαλύτερη από 12 τότε ορίζουμε εκείνη την ώρα ως PM αλλιώς AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); εάν (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("ΜΜ"); } αλλιώς { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("ΠΜ"); } int day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () χρησιμοποιείται ημερομηνία λήψης σε μορφή "yyyy-mm-dd" από το διακομιστή NTP. Αυτή η συνάρτηση δίνει ημερομηνία και ώρα σε μορφή «yyyy-mm-dd T hh: mm: ss . Αλλά χρειαζόμαστε μόνο ημερομηνία, οπότε πρέπει να διαχωρίσουμε αυτήν τη συμβολοσειρά που είναι αποθηκευμένη σε μορφή ημερομηνίας_ ώρας έως το «T» που γίνεται με τη λειτουργία substring () και στη συνέχεια αποθηκεύουμε την ημερομηνία στη μεταβλητή «ημερομηνία» .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (ημερομηνία); display.println (ημερομηνία); display.display ();
Έτσι θα φαίνεται τελικά το ρολόι ώρας στο Διαδίκτυο OLED: