آردوینو برد ESP8266 برد ویموس Wemos نمایشگر Segment

دریافت زمان از سرور NTP با برد ESP8266

نوشته شده توسط آرش کدخدایی

سنجش زمان و ارسال اطلاعات بر اساس زمان محلی، یکی از مهم‌ترین موارد برای پروژه‌های اینترنت اشیا می‌باشد. کلیه تصمیم گیری‌ها و اقدامات نیازمند زمان دقیق از سمت سخت افزارها هستند. برای این منظور چندین روش وجود دارد. یکی استفاده از ماژول ساعت دقیق از جمله DS3231 روش جذاب دیگری وجود دارد که به سخت افزارهای اضافی نیاز نخواهیم داشت. از جمله روش NTP که از سمت سرور اطلاعات زمانی را روی سخت افزار دریافت می‌کنیم. اگر پروژه را بر مبنای تراشه ESP8266 طراحی کرده‌اید، امکان استفاده از پروتکل زمان شبکه وجود دارد. کافیست با پروتکل NTP مقادیر دریافت شده از سمت سرور را بخوانید. در ادامه آموزش دریافت زمان از سرور NTP با برد ESP8266  با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.

 


پروتکل سرور NTP چیست؟


NTP مخفف عبارت Network Time Protocol یا پروتکل زمان شبکه برای همگام سازی ساعت دستگاه با مرجعی از طریق شبکه استفاده می‌شود. این پروتکل برای همگام سازی کلیه دستگاه‌های شبکه به زمان هماهنگ جهانی (UTC) در چند میلی ثانیه استفاده می‌شود. البته ۵۰ میلی ثانیه از طریق اینترنت عمومی و کمتر از ۵ میلی ثانیه در یک محیط LAN زمانبر خواهد بود. برای کار با این پروتکل کافیست یک درخواست از طریق پروتکل UDP به پورت ۱۲۳ سور مورد نظر ارسال کنیم. در پاسخ اطلاعاتی مانند زمانبندی UNIX، دقت، تاخیر و منطقه زمانی را دریافت می‌کنیم. تایم سرورهای فراوانی در سطح اینترنت وجود دارد. معروفترین آن‌ها pool.ntp.org است که ساب دامین‌های asia.pool.ntp.org و ir.pool.ntp.org نیز برای دقت بالاتر در ایران مورد استفاده قرار می‌گیرند. همچنین سرورهای بومی هم وجود دارند که از جمله آن‌ها ntp.day.ir میباشد. برای دریافت زمان میتوانید از این سرور هم استفاده کنید.

 

 

پروتکل سرور NTP یا Network Time Protocol یک پروتکل شبکه است که برای هماهنگ‌سازی زمان در شبکه‌های کامپیوتری استفاده می‌شود. NTP به عنوان یک پروتکل اینترنتی استاندارد برای هماهنگ‌سازی زمان بین سیستم‌های مختلف استفاده می‌شود.هدف اصلی NTP ارائه زمان دقیق و هماهنگ به تمامی دستگاه‌های شبکه است. برای این کار، NTP از یک سلسله سیستم‌های سرور و کلاینت استفاده می‌کند که به عنوان سرورهای زمان (Time Server) و کلاینت‌های زمان (Time Client) شناخته می‌شوند.سرورهای زمان (NTP Servers) دارای منبع زمانی دقیق هستند و اطلاعات زمان را به کلاینت‌های زمان ارسال می‌کنند. کلاینت‌های زمان درخواست زمان را به سرورهای زمان ارسال کرده و با دریافت پاسخ، زمان را در سیستم خود به‌روزرسانی می‌کنند.NTP از الگوریتم‌ها و فرآیندهای پیچیده‌ای برای هماهنگ‌سازی زمان استفاده می‌کند. این پروتکل قادر است به‌صورت خودکار تاخیرهای شبکه را در محاسبه زمان در نظر بگیرد و به همین دلیل می‌تواند زمان دقیق را در سیستم‌هایی که به اینترنت متصل هستند، فراهم کند. NTP از پورت ۱۲۳ برای ارتباط بین سرورها و کلاینت‌ها استفاده می‌کند و به صورت گسترده در شبکه‌های کامپیوتری، از جمله اینترنت و شبکه‌های داخلی سازمانی، استفاده می‌شود.

 


امکانات پروتکل NTP


پروتکل NTP به عنوان یک پروتکل هماهنگ‌سازی زمان، امکانات و ویژگی‌های متنوعی را ارائه می‌دهد. در زیر به برخی از این امکانات اشاره خواهم کرد:

  • هماهنگ‌سازی دقیق زمان: NTP قادر است زمان سیستم‌های مختلف را با دقت بسیار بالا و در حدود میلی‌ثانیه هماهنگ کند. این قابلیت بسیار مهم است زیرا در بسیاری از سیستم‌ها و برنامه‌ها، دقت زمانی بسیار حائز اهمیت است.
  • پشتیبانی از ساعت اتمی: NTP قادر است با استفاده از ساعت‌های اتمی (Atomic Clocks) که دقت بسیار بالایی دارند، زمان را هماهنگ کند. ساعت‌های اتمی بر اساس خواص فیزیکی ثابت‌های طبیعی مانند نوسانات اتمی یا سرعت نور عمل می‌کنند.
  • مدیریت زمان در شبکه‌های بزرگ: NTP قابلیت مدیریت زمان را در شبکه‌های بزرگ فراهم می‌کند. با استفاده از سرورهای زمان مرجع (Reference Time Servers)، می‌توان ساعت‌های مختلف در شبکه را هماهنگ کرده و تنظیمات دقیقی برای همگام‌سازی زمان در سطح شبکه انجام داد.
  • نظارت و اعتبارسنجی: NTP امکان نظارت بر وضعیت سرورهای زمان و اعتبارسنجی اطلاعات زمان را فراهم می‌کند. با استفاده از پیغام‌های اعتبارسنجی و مکانیزم‌های کنترلی مختلف، میزان صحت و قابل اعتماد بودن سرورهای زمان را می‌توان بررسی کرد.
  • امنیت: NTP امکان استفاده از امنیت برای حفاظت از اطلاعات زمان را فراهم می‌کند. می‌توان از مکانیزم‌های رمزنگاری برای ارتباط امن بین سرورها و کلاینت‌ها استفاده کرد تا جلوی هرگونه حمله مخرب به زمان را بگیریم.

در کل، پروتکل سرور NTP با استفاده از سرورها و کلاینت‌های زمان، زمان دقیق و هماهنگ را در شبکه‌های کامپیوتری فراهم می‌کند. این پروتکل در بسیاری از حوزه‌ها از جمله ارتباطات اینترنتی، انتقال داده، سیستم‌های مالی، شبکه‌های اجتماعی و بسیاری دیگر از مهمترین استانداردها استفاده می‌شود.

 


اتصالات نمایشگر به ESP8266


در این پروژه ما زمان را از سرور NTP دریافت کرده و روی سون سگمت نمایش می‌دهیم. مدار ما بسیار ساده است و از برد wemos D1 mini بر پایه ESP8266 و ماژول سگمنت ۷Segment 4 Digit با تراشه TM1637 استفاده می‌کنیم. روش اتصال پایه ها به ترتیب زیر می‌باشد.

 

Wemos <—> TM1637

۵v <—> vcc

g <—> gnd

D4 <—> CLK

D3 <—>DIO

 


کتابخانه NTP آردوینو


در این برنامه از دو کتابخانه NTPClient و arduino-tm1637 استفاده شده است. قبل از کد نویسی باید دانلود، unzip و در پوشه Arduino\libraries که در پوشه داکیومت کامپیوتر وجود دارند قرار داده شوند. یا در برنامه آردوینو از طریق منوی Sketch > Include Library > Add .ZIP Library این فایل ها به کتابخانه اضافه شوند. اگر هم در خصوص این دو روش افزودن کتابخانه به آردوینو سوال دارید، از طریق پست نصب کتابخانه در آردوینو IDE اقدام کنید.

 


کد آردوینو سرور NTP


ابتدا مشخصات وای فای جهت اتصال و اختلاف زمان با گرینویچ را وارد کنید. سپس برنامه را روی برد esp8266 آپلود کنید. همچنین میتوانید از سرور های مختلف ntp در برنامه خود استفاده کنید.

 

//تعریف کتابخانه ها
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "SevenSegmentTM1637.h"
#include "SevenSegmentExtended.h"

//تعریف پین های سون سگمنت
const byte PIN_CLK = D4;
const byte PIN_DIO = D3;
SevenSegmentExtended display(PIN_CLK, PIN_DIO);

//مشخصات اتصال به وای فای
const char *ssid     = "ssid";
const char *password = "password";

//اختلاف با ساعت گرینویچ به ثانیه (در ایران ساعت +۳٫۵ ساعت با گرینویچ اختلاف دارد که در تابستان این عدد به +۴٫۵ ساعت میرسد)
const long utcOffsetInSeconds = 3600 * 4.5;

//تعریف روز های هفته
String daysOfTheWeek[7] = {"یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"};

//تعریف تابع ساعت ntp و سرور ntp
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup() {
  //تعرف ارتباط سریال
  Serial.begin(115200);
  //اتصال به وای فای مورد نظر
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  //شروع به کار ساعت
  timeClient.begin();
  //شروع به کار سون سگمنت
  display.begin();
  display.setBacklight(100);
}

void loop() {
  //دریافت ساعت
  timeClient.update();
  //ارسال ساعت و روز در ارتباط سریال
  Serial.print(daysOfTheWeek[timeClient.getDay()]);
  Serial.print(" ,");
  Serial.println(timeClient.getFormattedTime());
  
  //نمایش ساعت و دقیقه در سون سگمنت
  display.printTime(timeClient.getHours(), timeClient.getMinutes(), true);

  delay(1000);
}

 

همانطور که میبینید زمان کنونی روی ماژول سون سگمنت ما نمایش داده میشود همچنین زمان و روز هفته روی سریال مانیتور ما نیز نمایش داده میشود.

 

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

آرش کدخدایی

یک تازه کار علاقه مند به تکنولوژی :)

تبادل نظر و رفع عیب با ثبت دیدگاه

۳۲ دیدگاه

  • سلام آقای مهندس.ماژول ۷seg و کتابخونه tm1637 مگه با i2c کار نمیکنه؟
    پس چرا به جای استفاده از پایه های d1 و d2 از d3 و d4 استفاده کردین؟

  • سلام و تشکر از سایت خوبتون.
    من هنگام Compile با این خطا روبرو میشم :

    status 1 error compiling for board nodeMCU 1.0 (ESP 12E Module)

    برد من “Witty Cloud با وای فای ESP8266 اورجینال مخصوص اینترنت اشیاء IOT” هست :
    https://daneshjookit.com/board/arduino/esp8266-and-nodemcu/1996-witty-cloud-with-esp8266.html

    مشکل از چی میتونه باشه ؟ تشکر

  • سلام آردوینو آی دی ارور زیر را می دهد به چه معناست وباید چه کنیم
    Error compiling for board LOLIN(WEMOS)D1mini lite

  • ارور آردوینو آی دی به شرح زیر است
    Arduino: 1.8.9 (Windows Store 1.8.21.0) (Windows 10), Board: “LOLIN(WEMOS) D1 mini Lite, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 1MB (FS:64KB OTA:~470KB), v2 Lower Memory, Disabled, None, Only Sketch, 921600”

    WARNING: library arduino-tm1637-master claims to run on (avr) architecture(s) and may be incompatible with your current board which runs on (esp8266) architecture(s).
    In file included from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwipopts.h:60:0,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwip/opt.h:51,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwip/init.h:40,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/IPAddress.h:27,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/Udp.h:39,

    from C:\Users\na\Documents\Arduino\libraries\NTPClient-master/NTPClient.h:5,

    from C:\Users\na\AppData\Local\Temp\arduino_modified_sketch_549981\sketch_dec07a.ino:3:

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/gluedebug.h: In function ‘void setup()’:

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/gluedebug.h:41:8: error: expected unqualified-id before string constant

    extern “C”

    ^

    In file included from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwip/opt.h:51:0,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwip/init.h:40,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/IPAddress.h:27,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\cores\esp8266/Udp.h:39,

    from C:\Users\na\Documents\Arduino\libraries\NTPClient-master/NTPClient.h:5,

    from C:\Users\na\AppData\Local\Temp\arduino_modified_sketch_549981\sketch_dec07a.ino:3:

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2/tools/sdk/lwip2/include/lwipopts.h:3549:8: error: expected unqualified-id before string constant

    extern “C” {

    ^

    In file included from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/WiFiClientSecure.h:41:0,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/WiFiServerSecure.h:20,

    from C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/ESP8266WiFi.h:41,

    from C:\Users\na\AppData\Local\Temp\arduino_modified_sketch_549981\sketch_dec07a.ino:4:

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/WiFiClientSecureBearSSL.h:150:28: error: expected ‘}’ before end of line

    #pragma GCC diagnostic push

    ^

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/WiFiClientSecureBearSSL.h: At global scope:

    C:\Users\na\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.2\libraries\ESP8266WiFi\src/WiFiClientSecureBearSSL.h:150:28: error: expected declaration before end of line

    exit status 1
    Error compiling for board LOLIN(WEMOS) D1 mini Lite.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    • با سلام
      جهت برطرف شدن مشکل لطفا توضیحات کامل ارائه دهید. از کد این آموزش استفاده شده است؟

  • سلام ببخشید دراین خط کد نویسی WIFI.begin(but , Amirmkh)31خط۳۱ ارور
    Arduino: 1.8.9 (Windows Store 1.8.21.0) (Windows 10), Board: “WeMos D1 R1, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 921600”

    C:\Users\na\AppData\Local\Temp\arduino_modified_sketch_328125\sketch_dec11a.ino: In function ‘void setup()’:

    sketch_dec11a:31:14: error: ‘but’ was not declared in this scope

    WiFi.begin(but, Amirkosarmkh);

    ^

    sketch_dec11a:31:19: error: ‘Amirkosarmkh’ was not declared in this scope

    WiFi.begin(but, Amirkosarmkh);

    ^

    exit status 1
    ‘but’ was not declared in this scope

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.
    می دهد معنی آن چیست

    • سلام
      شما در تابع WIFI.begin از دو متغییر استفاده کردید که جایی در برنامه تعریف نشده اند اگه این مشخصات همان مشخصات اتصال به وای فای شما میباشد باید به این صورت تابع را استفاده کنید:
      WIFI.begin(“but” , “Amirmkh”)

    • با سلام
      سپاس از همراهی شما در صورت سوال لطفا شفاف تر اعلام کنید تا بررسی شود.

    • با سلام ازمنم یک ساعت جلو نشون میده. اگر مشکل شما حل شده لطفا مرا هم راهنمایی کنید. ممنونم

  • سلام،
    چطوری میشه مثل گوشی که خودکار ساعت رو تنظیم میکنه، تنظیمش کنیم ؟
    من کد هارو آپلود کردم، کار میکنه مشکلی نداره.
    فقط برای شیش ماه اول و دوم به مشکل خوردم..
    ایا میشه تو D1 از یه فایل txt مقدار رو بخونیم ؟
    من یه API ساختم که همیشه ساعت و تاریخ رو بهم میده.
    http://amiraghajani.com/arduino/time.txt
    میشه تو weMos خوندش؟
    ممنون میشم راهنمایی بفرمایید.

    • سلام
      برای شش ماه اول و دوم مشکل یک ساعت رو به جلو دارید؟ با سرویس NTP و بدون نیاز به API جانبی می توانید ساعت را دریافت کنید.

  • سلام .ک

    آیا میشه برنامه ای طراحی کرد که بتوان بر حسب ساعت مختلف رمز های متفاوت قرار بدهیم ؟؟؟؟
    برای مثال روز سه شنبه ساعت ۱۲ تا ۲ رمز ورود ۲۰۲۰ ، روز سه شنبه از ساعت ۳ تا ۵ رمز ورود ۲۰۳۴ و پنجشبه از ساعت ۹ تا ۱۱ رمز ورود ۳۴۵۶ و . . . .