RTC eller Real Time Clock är den vanligaste modulen i elektronik och inbäddade enheter för att hålla koll på tiden. Men problemet med RTC är att mikrochipsen i datorer inte är så exakta och de kan bara ge tiden för lokal enhet. Å andra sidan är att använda internet för att hämta tiden från NTP-servrar bättre lösning för att få tid eftersom det är mer exakt och kan ge tiden för vilket geografiskt område som helst i världen. Vi behöver bara en Wi-Fi-modul och tillgång till internet för att få tid på vilken plats som helst i världen genom att använda NTP-servrar. I denna handledning använder vi ESP8266 NodeMCU för att få aktuell tid och datum från NTP-servrar och visa det på OLED-skärm.
Network Time Protocol (NTP)
NTP är ett av de äldsta nätverksinternetprotokoll (IP) för att synkronisera klockor mellan datanätverk. Den designades av David L. Mills vid University of Delaware 1981. Detta protokoll kan användas för att synkronisera många nätverk till Coordinated Universal Time (UTC) inom några millisekunder. UTC är den primära tidsstandarden enligt vilken världen reglerar klocka och tid. UTC ändras inte och varierar för olika geografiska platser. NTP använder UTC som tidsreferens och ger korrekt och synkroniserad tid över Internet.
NTP fungerar på en hierarkisk klientservermodell. Toppmodellen har referensklockor som kallas "stratum0" som atomur, radiovågor, GPS, GSM som tar emot tid från satelliten. Servrarna som tar emot tid från stratum0 kallas "stratum1" och servrar som får tid från stratum1 kallas "stratum2" och så vidare. Detta fortsätter och noggrannheten i tiden fortsätter att minska efter varje steg. NTP väljer automatiskt det bästa av flera tillgängliga tidskällor att synkronisera vilket gör det till ett feltolerant kapabelt protokoll.
Så här i det här projektet får vi tid från NTP-servern med hjälp av ESP8266 NodeMCU och visar den på OLED-skärmen. Samma typ av internetklocka är byggd med hjälp av ESP32 i föregående handledning.
ESP8266 kan komma åt NTP-servrar med internet för att få exakt tid. Här NTP fungerar i client-server -läge, fungerar ESP8266 som klientenhet och ansluter till NTP-servrar som använder UDP (User Datagram Protocol). Klienten överför ett begäranpaket till NTP-servrar och i gengäld skickar NTP ett tidsstämpelpaket som består av information som noggrannhet, tidszon, UNIX-tidsstämpel etc. Sedan separerar klienten datum- och tidsinformation som kan användas vidare i applikationer enligt krav.
Komponenter krävs
- Monokrom 7-stifts SSD1306 0,96 ”OLED-skärm
- ESP8266 NodeMCU
- Micro USB-kabel
- Bakbord
- Manliga till manliga bygeltrådar
Kretsschema och anslutningar
Denna 7-stifts OLED-skärm kommunicerar med ESP8266-modulen med SPI-protokoll, nedan är kretsschemat och anslutningstabellen för att ansluta OLED SPI-stift med NodeMCU för att visa Internet-tid.
Nej. |
OLED-skärm |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) eller SDA (I2C) |
D7 |
5 |
ÅTERSTÄLLA |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
För att lära dig mer denna monokroma 7-stifts OLED-skärm och dess gränssnitt med ESP8266 NodeMCU, följ länken.
Kodförklaring
Först måste vi ladda ner och installera NTP-bibliotek i ESP8266. Det finns många bibliotek tillgängliga för NTP-klienten. Du kan installera någon av dem från Arduino IDE. I denna handledning har jag installerat NTPClient-biblioteket av Taranais eftersom det är enkelt att använda och har funktioner för att få datum och tid från NTP-servrar. ESP8266 NodeMCU kan enkelt programmeras med Arduino IDE.
För att installera NTP-biblioteket, ladda ner först biblioteket med länken ovan och installera det sedan med Arduino IDE. För att installera det, gå till Skiss> Inkludera bibliotek> Lägg till.ZIP-bibliotek , öppna sedan Zip-mappen genom att gå till platsen där du har laddat ner zip-mappen och starta om Arduino IDE.
NTPClient-biblioteket kommer med exempel. Öppna Arduino IDE och Goto-exempel> NTPClient> Advanced . Koden i denna skiss visar tiden från NTP-servern på den seriella bildskärmen. Vi använder denna skiss för att visa aktuell tid och datum på OLED-skärmen.
Komplett kod finns i slutet av denna handledning, här har jag förklarat några viktiga delar av koden.
ESP8266WiFi-biblioteket tillhandahåller ESP8266-specifika Wi-Fi-rutiner för att ansluta till nätverket. WiFiUDP.h hanterar skicka och ta emot UDP-paket. Eftersom vi använder SPI-protokoll för att gränssnitt OLED med NodeMCU kommer vi därför att importera "SPI.h" -biblioteket. Och “Adafruit_GFX.h” och “Adafruit_SSD1306.h” används för OLED Display.
#omfatta
Vår OLED-storlek är 128x64 så vi ställer in skärmbredd och höjd på 128 respektive 64. Så definiera variablerna för OLED-stift anslutna till NodeMCU för SPI-kommunikation.
#define SCREEN_WIDTH 128 // OLED-skärmbredd, i pixlar #define SCREEN_HEIGHT 64 // OLED-skärmhöjd, i pixlar // Deklaration för SSD1306-skärm ansluten med SPI-programvara (standardfall): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306 skärm (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Byt ut “your_ssid” och “your_password” med ditt Wi-Fi SSID och lösenord i nedanstående kodrader.
const char * ssid = "din_ssid"; const char * password = "ditt_lösenord";
Ställ in WI-Fi-anslutning genom att ge SSID och lösenord till WiFi.begin- funktionen. Anslutningen av ESP8266 tar lite tid att ansluta till NodeMCU så vi måste vänta tills den blir ansluten.
WiFi.begin (ssid, lösenord); medan (WiFi.status ()! = WL_CONNECTED) { fördröjning (500); Serial.print ("."); }
För att begära datum och tid, initiera tidsklienten med adressen till NTP-servrar. För bättre precision väljer du adressen till NTP-servrar som ligger nära ditt geografiska område. Här använder vi ” pool.ntp.org ” som ger servrar från hela världen. Om du vill välja servrar från Asien kan du använda “ asia.pool.ntp.org ”. timeClient tar också UTC-tidsförskjutning i millisekunder av din tidszon. Till exempel är UTC-offset för Indien +5: 30 så vi konverterar denna offset i millisekunder vilket är lika med 5 * 60 * 60 + 30 * 60 = 19800.
Område |
UTC-tidsförskjutning (timmar och minuter) |
UTC-tidsförskjutning (sekunder) |
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 ges för att generera 3,3 V internt för att initialisera skärmen. När OLED startar visas “ VÄLKOMMEN TILL KRETSDIGEST ” med textstorlek 2 och färg BLÅ i 3 sekunder.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306-allokering misslyckades")); för(;;); // Fortsätt inte, loop för alltid } display.clearDisplay (); display.setTextSize (2); // Rita 2X-skala text display.setTextColor (BLÅ); display.setCursor (5, 2); display.println ("VÄLKOMMEN TILL"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); fördröjning (3000);
NTP-klienten initialiseras med funktionen start () för att ställa in datum och tid från NTP-servrar.
timeClient.begin ();
Uppdateringsfunktionen () används för att ta emot datum och tid när vi begär NTP-servrar.
timeClient.update ();
Överföringshastighet 115200 är inställd för att skriva ut tiden på seriell bildskärm.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay är biblioteksfunktionen och ger aktuell timme, minuter, sekunder och dag från NTP-servern. Koden nedan används för att skilja tiden mellan AM och PM. Om timmen vi får getHours () är större än 12 ställer vi in den tiden som PM annars är AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int dag = timeClient.getDay (); om (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } annat { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int dag = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () används get date i “yyyy-mm-dd” -format från NTP-servern. Denna funktion ger datum och tid i “åååå-mm-dd Thh: mm: ss- format. Men vi behöver bara datum så vi måste dela upp den här strängen som lagras i formatet date_time till "T" vilket görs med substring () -funktionen och sedan lagra datumet i "datum" -variabeln.
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Strängdatum = date_time.substring (0, index_date); Serial.println (datum); display.println (datum); display.display ();
Så här kommer OLED Internet-tidsklockan att se ut äntligen: