- Network Time Protocol (NTP)
- Kinakailangan ang Mga Bahagi
- Circuit Diagram at Mga Koneksyon
- Paliwanag sa Code
Ang RTC o Real Time Clock ay ang pinaka-karaniwang ginagamit na module sa Electronics at naka-embed na mga aparato upang subaybayan ang oras. Ngunit ang problema sa RTC ay ang mga microchip sa mga computer ay hindi gaanong tumpak at maaari lamang nilang ibigay ang oras ng lokal na aparato. Sa kabilang banda, ang paggamit ng internet upang makuha ang oras mula sa mga NTP server ay mas mahusay na solusyon para sa pagkuha ng oras dahil ito ay mas tumpak at maaaring magbigay ng oras ng anumang lugar na pangheograpiya sa mundo. Kailangan lang namin ng isang module na Wi-Fi at pag-access sa internet upang makakuha ng oras ng anumang lokasyon sa mundo sa pamamagitan ng paggamit ng mga NTP server. Sa tutorial na ito, gagamitin namin ang ESP8266 NodeMCU upang makakuha ng kasalukuyang oras at petsa mula sa mga server ng NTP at ipakita ito sa pagpapakita ng OLED.
Network Time Protocol (NTP)
Ang NTP ay isa sa pinakalumang networking Internet Protocol (IP) para sa pag-syncing ng mga orasan sa pagitan ng mga network ng computer. Dinisenyo ito ni David L. Mills ng Unibersidad ng Delaware noong 1981. Ang protokol na ito ay maaaring magamit upang maiugnay ang maraming mga network sa Coordinated Universal Time (UTC) sa loob ng ilang milliseconds. Ang UTC ay ang pangunahing pamantayan sa oras kung saan kinokontrol ng mundo ang orasan at oras. Ang UTC ay hindi nagbabago at nag-iiba para sa iba't ibang mga lokasyon ng heograpiya. Gumagamit ang NTP ng UTC bilang sanggunian ng oras at nagbibigay ng tumpak at nasabay na oras sa buong Internet.
Gumagana ang NTP sa isang hierarchical na modelo ng client-server. Ang nangungunang modelo ay may mga sanggunian na orasan na kilala bilang "stratum0" tulad ng mga atomic na orasan, radio wave, GPS, GSM na tumatanggap ng oras mula sa satellite. Ang mga server na tumatanggap ng oras mula sa stratum0 ay tinawag bilang "stratum1" at ang mga server na tumatanggap ng oras mula sa stratum1 ay tinawag na "stratum2" at iba pa. Nagpapatuloy ito at ang kawastuhan ng oras ay patuloy na bumababa pagkatapos ng bawat yugto. Awtomatikong pipiliin ng NTP ang pinakamahusay sa maraming magagamit na mga mapagkukunan ng oras upang mai-synchronize na kung saan ay ginagawang mapagparaya sa kasalanan ang isang protokol.
Kaya dito sa proyektong ito, nakakakuha kami ng oras mula sa NTP server na gumagamit ng ESP8266 NodeMCU at ipinapakita ito sa OLED display. Ang parehong uri ng orasan sa Internet ay binuo sa pamamagitan ng paggamit ng ESP32 sa nakaraang tutorial.
Maaaring ma-access ng ESP8266 ang mga NTP server gamit ang internet upang makakuha ng tumpak na oras. Dito gumagana ang NTP sa client-server mode, gumagana ang ESP8266 bilang client device at kumokonekta sa mga NTP server na gumagamit ng UDP (User Datagram Protocol). Nagpapadala ang kliyente ng isang packet ng kahilingan sa mga server ng NTP at bilang gantimpala ay nagpapadala ang NTP ng isang timestamp packet na binubuo ng impormasyon tulad ng kawastuhan, timezone, UNIX timestamp atbp Pagkatapos ay pinaghihiwalay ng client ang mga detalye ng petsa at oras na maaaring karagdagang magamit sa mga aplikasyon alinsunod sa kinakailangan.
Kinakailangan ang Mga Bahagi
- Monochrome 7-pin SSD1306 0.96 ”OLED display
- ESP8266 NodeMCU
- Micro USB cable
- Breadboard
- Mga wires ng Lalaki hanggang Lalaki na Jumper
Circuit Diagram at Mga Koneksyon
Ang 7-pin na OLED display na ito ay nakikipag-usap sa module na ESP8266 gamit ang SPI protocol, sa ibaba ay ang diagram ng circuit at talahanayan ng mga koneksyon upang ikonekta ang mga pin ng OLED SPI sa NodeMCU upang ipakita ang oras ng Internet.
Hindi. |
OLED Display |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) o SDA (I2C) |
D7 |
5 |
I-reset |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Upang matuto nang higit pa sa display na ito ng Monochrome 7-pin OLED at ang paghihimasok nito sa ESP8266 NodeMCU, sundin ang link.
Paliwanag sa Code
Una kailangan naming mag-download at mag-install ng NTP library sa ESP8266. Maraming mga silid-aklatan na magagamit para sa NTP Client. Maaari mong mai-install ang anuman sa kanila mula sa Arduino IDE. Sa tutorial na ito na-install ko ang NTPClient library ng Taranais sapagkat madaling gamitin ito at may mga pagpapaandar upang makakuha ng petsa at oras mula sa mga NTP server. Ang ESP8266 NodeMCU ay madaling mai-program gamit ang Arduino IDE.
Upang mai-install ang NTP library, i-download muna ang library gamit ang link sa itaas at pagkatapos ay i-install ito gamit ang Arduino IDE. Upang mai-install ito pumunta sa Sketch> Isama ang Library> Magdagdag ng.ZIP Library , pagkatapos buksan ang Zip folder sa pamamagitan ng pagpunta sa lokasyon kung saan mo na-download ang zip folder at muling simulan ang Arduino IDE.
Ang library ng NTPClient ay mayroong mga halimbawa. Buksan ang Arduino IDE at Mga Halimbawa ng Goto> NTPClient> Advanced . Ang code na ibinigay sa sketch na ito ay nagpapakita ng oras mula sa NTP server sa serial monitor. Gagamitin namin ang sketch na ito upang maipakita ang kasalukuyang oras at petsa sa pagpapakita ng OLED.
Ang kumpletong code ay magagamit sa pagtatapos ng tutorial na ito, narito naipaliwanag ko ang ilang mahahalagang bahagi ng code.
Nagbibigay ang library ng ESP8266WiFi ng tukoy na mga gawain sa Wi-Fi ng ESP8266 upang kumonekta sa network. Humahawak ang WiFiUDP.h sa pagpapadala at pagtanggap ng mga package ng UDP. Dahil gumagamit kami ng SPI protocol upang mai-interface ang OLED sa NodeMCU samakatuwid ay mai-import namin ang "SPI.h" library. At ang "Adafruit_GFX.h" at "Adafruit_SSD1306.h" ay ginagamit para sa OLED Display.
# isama
Ang aming laki ng OLED ay 128x64 kaya't nagtatakda kami ng lapad at taas ng screen bilang 128 at 64 ayon sa pagkakabanggit. Kaya tukuyin ang mga variable para sa mga pin ng OLED na konektado sa NodeMCU para sa komunikasyon ng SPI.
#define SCREEN_WIDTH 128 // OLED display width, in pixel #define SCREEN_HEIGHT 64 // OLED display taas, sa mga pixel // Ang deklarasyon para sa display na SSD1306 na konektado gamit ang software SPI (default case): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 # tukuyin ang OLED_CS D8 # tukuyin ang OLED_RESET D3
Display ng Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Palitan ang "your_ssid" at "your_password" ng iyong Wi-Fi SSID at password sa mga linya sa ibaba ng code.
const char * ssid = "your_ssid"; const char * password = "your_password";
I-set up ang koneksyon sa WI-Fi sa pamamagitan ng pagbibigay ng SSID at password sa pagpapaandar ng WiFi.begin . Ang koneksyon ng ESP8266 ay tumatagal ng ilang oras upang makakonekta sa NodeMCU kaya't maghintay kami hanggang sa makakonekta ito.
WiFi.begin (ssid, password); habang (WiFi.status ()! = WL_CONNected) { pagkaantala (500); Serial.print ("."); }
Upang humiling ng petsa at oras, simulan ang client ng oras sa address ng mga NTP server. Para sa mas mahusay na kawastuhan piliin ang address ng mga NTP server na malapit sa iyong lugar na pangheograpiya. Dito ginagamit namin ang " pool.ntp.org " na nagbibigay sa mga server mula sa buong mundo. Kung nais mong pumili ng mga server mula sa Asya maaari mong gamitin ang " asia.pool.ntp.org ". Ang TimeClient ay tumatagal din ng offset ng oras sa UTC sa milliseconds ng iyong timezone. Halimbawa, ang offset ng UTC para sa India ay +5: 30 kaya't kino-convert namin ang offset na ito sa milliseconds na katumbas ng 5 * 60 * 60 + 30 * 60 = 19800.
Lugar |
Oras ng offset ng oras (oras at minuto) |
Oras ng offset ng oras (segundo) |
INDIA |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
BAGONG YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
Ang SSD1306_SWITCHCAPVCC ay ibinibigay upang makabuo ng panloob na 3.3V upang simulan ang pagpapakita. Kapag nagsimula ang OLED ipinapakita nito ang " WELCOME TO CIRCUIT DIGEST " na may laki ng teksto 2 at kulay BLUE sa loob ng 3 segundo.
kung (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F (Nabigo ang paglalaan ng "SSD1306")); para sa (;;); // Huwag magpatuloy, loop magpakailanman } display.clearDisplay (); display.setTextSize (2); // Gumuhit ng display ng teksto na 2X- scale.setTextColor (BLUE); display.setCursor (5, 2); display.println ("WELCOME TO"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); pagkaantala (3000);
Ang NTP client ay isinisimulan gamit ang pagsisimula () na pagpapaandar upang itakda ang petsa at oras mula sa mga NTP server.
timeClient.begin ();
Ginagamit ang pagpapaandar sa pag- update () upang matanggap ang petsa at oras tuwing humiling kami sa mga NTP server.
timeClient.update ();
Ang rate ng baud na 115200 ay nakatakda upang mai-print ang oras sa serial monitor.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay ang pagpapaandar ng library at binibigyan ang kasalukuyang oras, minuto, segundo at araw mula sa NTP server. Ginagamit ang code sa ibaba upang maiiba ang oras sa pagitan ng AM at PM. Kung ang oras na nakakakuha kami ng paggamit ng getHours () ay mas malaki sa 12 pagkatapos ay itinakda namin ang oras na iyon bilang PM na iba pa ang AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); kung (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } iba pa { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int day = timeClient.getDay (); display.println ("'" + arr_day + "'");
Ang getFormattedDate () ay ginagamit ng get date sa format na "yyyy-mm-dd" mula sa NTP server. Ang pagpapaandar na ito ay nagbibigay ng petsa at oras sa format na "yyyy-mm-dd T hh: mm: ss . Ngunit kailangan lang namin ng petsa kaya kailangan nating hatiin ang string na ito na nakaimbak sa format na date_time hanggang sa "T" na ginagawa ng pag- andar ng substring () at pagkatapos ay itabi ang petsa sa variable na "petsa" .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Petsa ng string = date_time.substring (0, index_date); Serial.println (petsa); display.println (petsa); display.display ();
Ganito ang hitsura ng OLED Internet time Clock: