RTC oder Real Time Clock ist das am häufigsten verwendete Modul in der Elektronik und in eingebetteten Geräten, um die Zeit zu verfolgen. Das Problem mit RTC ist jedoch, dass die Mikrochips in Computern nicht so genau sind und nur die Zeit des lokalen Geräts liefern können. Auf der anderen Seite ist die Verwendung des Internets zum Abrufen der Zeit von NTP-Servern eine bessere Lösung, um Zeit zu erhalten, da diese genauer ist und die Zeit eines beliebigen geografischen Gebiets auf der Welt liefern kann. Wir brauchen nur ein Wi-Fi-Modul und Zugang zum Internet, um mithilfe von NTP-Servern Zeit für jeden Ort auf der Welt zu erhalten. In diesem Tutorial verwenden wir ESP8266 NodeMCU, um die aktuelle Uhrzeit und das aktuelle Datum von NTP-Servern abzurufen und auf dem OLED-Display anzuzeigen.
Network Time Protocol (NTP)
NTP ist eines der ältesten IP-Netzwerke (Networking Internet Protocol) zum Synchronisieren von Uhren zwischen Computernetzwerken. Es wurde 1981 von David L. Mills von der University of Delaware entworfen. Mit diesem Protokoll können viele Netzwerke innerhalb weniger Millisekunden mit der koordinierten Weltzeit (UTC) synchronisiert werden. UTC ist der primäre Zeitstandard, nach dem die Welt Uhr und Zeit regelt. UTC ändert sich nicht und variiert für verschiedene geografische Standorte. NTP verwendet UTC als Zeitreferenz und bietet genaue und synchronisierte Zeit über das Internet.
NTP arbeitet mit einem hierarchischen Client-Server-Modell. Das Topmodell verfügt über Referenzuhren, die als „stratum0“ bezeichnet werden, wie Atomuhren, Radiowellen, GPS und GSM, die Zeit vom Satelliten empfangen. Die Server, die Zeit von stratum0 erhalten, werden als "stratum1" bezeichnet, und Server, die Zeit von stratum1 empfangen, werden als "stratum2" usw. bezeichnet. Dies geht weiter und die Genauigkeit der Zeit nimmt nach jeder Stufe weiter ab. NTP wählt automatisch die beste aus mehreren verfügbaren Zeitquellen für die Synchronisierung aus, wodurch das Protokoll fehlertolerant wird.
Hier in diesem Projekt erhalten wir Zeit vom NTP-Server mit ESP8266 NodeMCU und zeigen sie auf dem OLED-Display an. Dieselbe Art von Internetuhr wurde mithilfe von ESP32 im vorherigen Lernprogramm erstellt.
ESP8266 kann über das Internet auf NTP-Server zugreifen, um eine genaue Zeit zu erhalten. Hier arbeitet NTP im Client-Server- Modus, ESP8266 fungiert als Client-Gerät und stellt über UDP (User Datagram Protocol) eine Verbindung zu NTP-Servern her. Der Client sendet ein Anforderungspaket an NTP-Server und sendet im Gegenzug ein Zeitstempelpaket, das Informationen wie Genauigkeit, Zeitzone, UNIX-Zeitstempel usw. enthält. Anschließend trennt der Client die Datums- und Zeitdetails, die in Anwendungen je nach Anforderung weiter verwendet werden können.
Erforderliche Komponenten
- Monochromes 7-poliges SSD1306 0,96-Zoll-OLED-Display
- ESP8266 NodeMCU
- Micro-USB-Kabel
- Steckbrett
- Überbrückungsdrähte von Stecker zu Stecker
Schaltplan und Anschlüsse
Dieses 7-polige OLED-Display kommuniziert mit dem ESP8266-Modul über das SPI-Protokoll. Nachfolgend finden Sie den Schaltplan und die Verbindungstabelle zum Verbinden der OLED-SPI-Pins mit NodeMCU zur Anzeige der Internetzeit.
Nein. |
OLED-Anzeige |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) oder SDA (I2C) |
D7 |
5 |
RESET |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Folgen Sie dem Link, um mehr über dieses monochrome 7-polige OLED-Display und seine Schnittstelle zur ESP8266 NodeMCU zu erfahren.
Code Erklärung
Zuerst müssen wir die NTP-Bibliothek herunterladen und in ESP8266 installieren. Für den NTP-Client stehen viele Bibliotheken zur Verfügung. Sie können jeden von ihnen von Arduino IDE installieren. In diesem Tutorial habe ich die NTPClient-Bibliothek von Taranais installiert, da sie einfach zu verwenden ist und Funktionen zum Abrufen von Datum und Uhrzeit von NTP-Servern bietet. ESP8266 NodeMCU kann einfach mit Arduino IDE programmiert werden.
Um die NTP-Bibliothek zu installieren, laden Sie zuerst die Bibliothek über den obigen Link herunter und installieren Sie sie dann mit der Arduino IDE. Um es zu installieren, gehen Sie zu Skizze> Bibliothek einschließen> ZIP-Bibliothek hinzufügen , öffnen Sie den Zip-Ordner, indem Sie zu dem Speicherort gehen, an den Sie den Zip-Ordner heruntergeladen haben, und starten Sie die Arduino IDE neu.
Die NTPClient-Bibliothek enthält Beispiele. Öffnen Sie Arduino IDE und gehen Sie zu Beispiele> NTPClient> Erweitert . Der in dieser Skizze angegebene Code zeigt die Zeit vom NTP-Server auf dem seriellen Monitor an. Wir werden diese Skizze verwenden, um die aktuelle Uhrzeit und das aktuelle Datum auf dem OLED-Display anzuzeigen.
Der vollständige Code ist am Ende dieses Tutorials verfügbar. Hier habe ich einige wichtige Teile des Codes erläutert.
Die ESP8266WiFi-Bibliothek bietet ESP8266-spezifische Wi-Fi-Routinen für die Verbindung zum Netzwerk. WiFiUDP.h übernimmt das Senden und Empfangen von UDP-Paketen. Da wir das SPI-Protokoll verwenden, um OLED mit NodeMCU zu verbinden, werden wir die Bibliothek "SPI.h" importieren. Für die OLED-Anzeige werden "Adafruit_GFX.h" und "Adafruit_SSD1306.h" verwendet.
#einschließen
Unsere OLED-Größe beträgt 128 x 64, daher stellen wir die Bildschirmbreite und -höhe auf 128 bzw. 64 ein. Definieren Sie daher die Variablen für OLED-Pins, die für die SPI-Kommunikation mit NodeMCU verbunden sind.
#define SCREEN_WIDTH 128 // OLED-Anzeigebreite in Pixel #define SCREEN_HEIGHT 64 // OLED-Anzeigehöhe in Pixel // Deklaration für SSD1306-Anzeige, die mit Software-SPI verbunden ist (Standardfall): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306-Anzeige (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Ersetzen Sie "your_ssid" und "your_password" durch Ihre Wi-Fi-SSID und Ihr Kennwort in den folgenden Codezeilen.
const char * ssid = "your_ssid"; const char * password = "Ihr_Kennwort";
Richten Sie eine WI-Fi-Verbindung ein, indem Sie der Funktion WiFi.begin eine SSID und ein Kennwort geben . Die Verbindung des ESP8266 dauert einige Zeit, bis die Verbindung zur NodeMCU hergestellt ist. Daher müssen wir warten, bis die Verbindung hergestellt ist.
WiFi.begin (ssid, Passwort); while (WiFi.status ()! = WL_CONNECTED) { delay (500); Serial.print ("."); }}
Um Datum und Uhrzeit anzufordern, initialisieren Sie den Zeitclient mit der Adresse der NTP-Server. Wählen Sie für eine bessere Genauigkeit die Adresse der NTP-Server, die sich in der Nähe Ihres geografischen Gebiets befinden. Hier verwenden wir " pool.ntp.org ", das Server aus der ganzen Welt zur Verfügung stellt. Wenn Sie Server aus Asien auswählen möchten, können Sie " asia.pool.ntp.org " verwenden. timeClient nimmt auch den UTC-Zeitversatz in Millisekunden Ihrer Zeitzone. Beispielsweise beträgt der UTC-Versatz für Indien +5: 30, sodass wir diesen Versatz in Millisekunden umrechnen, was 5 * 60 * 60 + 30 * 60 = 19800 entspricht.
Bereich |
UTC-Zeitversatz (Stunden und Minuten) |
UTC-Zeitversatz (Sekunden) |
INDIEN |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800.60000);
SSD1306_SWITCHCAPVCC generiert intern 3,3 V, um die Anzeige zu initialisieren. Wenn die OLED gestartet wird, wird 3 Sekunden lang „ WILLKOMMEN BEI CIRCUIT DIGEST “ mit Textgröße 2 und Farbe BLAU angezeigt .
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306-Zuordnung fehlgeschlagen")); zum(;;); // Nicht fortfahren, Schleife für immer } display.clearDisplay (); display.setTextSize (2); // Text im 2X-Maßstab zeichnen display.setTextColor (BLUE); display.setCursor (5, 2); display.println ("WILLKOMMEN BEI"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); Verzögerung (3000);
Der NTP-Client wird mit der Funktion begin () initialisiert, um Datum und Uhrzeit von NTP-Servern festzulegen.
timeClient.begin ();
Die Funktion Update () wird verwendet, um Datum und Uhrzeit zu erhalten, wenn wir eine Anfrage an NTP-Server stellen.
timeClient.update ();
Die Baudrate von 115200 wird eingestellt, um die Zeit auf dem seriellen Monitor zu drucken.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay sind die Bibliotheksfunktion und geben die aktuellen Stunden, Minuten, Sekunden und Tage vom NTP-Server an. Der folgende Code wird verwendet, um die Zeit zwischen AM und PM zu unterscheiden. Wenn die Stunde, die wir mit getHours () erhalten, größer als 12 ist, setzen wir diese Zeit als PM, sonst ist es AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); wenn (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 () wird verwendet, um das Datum im Format "JJJJ-MM-TT" vom NTP-Server abzurufen . Diese Funktion gibt Datum und Uhrzeit im Format „JJJJ-MM-TT T hh: MM: SS“ an . Da wir jedoch nur das Datum benötigen, müssen wir diese Zeichenfolge, die im Format date_time gespeichert ist, bis zu „T“ aufteilen, was durch die Funktion substring () erfolgt , und dann das Datum in der Variablen „date“ speichern.
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (Datum); display.println (Datum); display.display ();
So sieht die OLED Internet Time Clock endlich aus: