تاریخ و زمان پارامتر های مهمی در بسیاری از پروژه های امبدد به شمار می آیند . شمارش زمان به صورت دقیق نیازمند سخت افزار هایی با فرکانس دقیق است . علاوه بر آن باید سخت افزار شما دارای واحد RTC باشد . در پروژه هایی که اتصال به شبکه ندارند به طور کلی از RTC ها برای شمارش زمان استفاده می شود . در سخت افزار هایی که قابلیت اتصال به شبکه را دارند ( پشتیبانی از استاندارد های IEEE802.11 و IEEE802.3 ) می توان از NTP استفاده کرد .
NTP مخفف پروتکل زمان شبکه ، پروتکلی در جهت هماهنگ سازی زمان و تاریخ در بین سیستم های حساس به زمان در شبکه است . در شبکه های مبتنی بر TCP/IP هر Client در خواست های مبتنی بر درخواست زمان را به صورت NTP به سرور ارسال خواهد کرد . با استفاده از NTP به راحتی می توانید زمان و تاریخ دقیق را بدون استفاده از RTC ، در ماژول های ESP8266 داشته باشید .
به طور کلی برای گره هایی که خود متصل به اینترنت هستند ، PDC به عنوان تایم سرور عمل خواهد کرد و سایر گره ها بر اساس آن زمان خود را تنظیم خواهند کرد . با اتصال ماژول ESP8266 به مودم در صورتی که مودم به اینترنت متصل باشد می توانید زمان دقیق را از طریق NTP دریافت کنید ، در غیر این صورت زمان مودم به ESP8266 ازسال خواهد شد .
برای استفاده از NTP در ماژول های ESP8266 نیاز به هیچ کتابخانه جدایی ندارید و تنها از کتابخانه time برای ذخیره و نمایش متغییر های زمان استفاده می شود .
کد های زیر را در بر روی برد خود آپلود کنید :
#include <WiFi.h> #include "time.h" const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 0; const int daylightOffset_sec = 3600; void setup(){ Serial.begin(115200); // Connect to Wi-Fi Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); // Init and get the time configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(); //disconnect WiFi as it's no longer needed WiFi.disconnect(true); WiFi.mode(WIFI_OFF); } void loop(){ delay(1000); printLocalTime(); } void printLocalTime(){ struct tm timeinfo; if(!getLocalTime(&timeinfo)){ Serial.println("Failed to obtain time"); return; } Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); Serial.print("Day of week: "); Serial.println(&timeinfo, "%A"); Serial.print("Month: "); Serial.println(&timeinfo, "%B"); Serial.print("Day of Month: "); Serial.println(&timeinfo, "%d"); Serial.print("Year: "); Serial.println(&timeinfo, "%Y"); Serial.print("Hour: "); Serial.println(&timeinfo, "%H"); Serial.print("Hour (12 hour format): "); Serial.println(&timeinfo, "%I"); Serial.print("Minute: "); Serial.println(&timeinfo, "%M"); Serial.print("Second: "); Serial.println(&timeinfo, "%S"); Serial.println("Time variables"); char timeHour[3]; strftime(timeHour,3, "%H", &timeinfo); Serial.println(timeHour); char timeWeekDay[10]; strftime(timeWeekDay,10, "%A", &timeinfo); Serial.println(timeWeekDay); Serial.println(); }
در کد های فوق لازم است که اسم و رمز وایفای خود را وارد کنید و سپس برنامه را بر روی ماژول خود پروگرامن کنید . مقدار زمان و تاریخ در Serial monitor چاپ می شود .