تاریخ و زمان پارامتر های مهمی در بسیاری از پروژه های امبدد به شمار می آیند . شمارش زمان به صورت دقیق نیازمند سخت افزار هایی با فرکانس دقیق است . علاوه بر آن باید سخت افزار شما دارای واحد 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 چاپ می شود .

