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

Tags:
About Author: USER_4