سنجش زمان و ارسال اطلاعات بر اساس زمان محلی، یکی از مهمترین موارد برای پروژههای اینترنت اشیا میباشد. کلیه تصمیم گیریها و اقدامات نیازمند زمان دقیق از سمت سخت افزارها هستند. برای این منظور چندین روش وجود دارد. یکی استفاده از ماژول ساعت دقیق از جمله 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
مشکل از چی میتونه باشه ؟ تشکر
سلام و سپاس از شما
آیا شما فریمور nodemcu را روی بورد خود نصب کرده اید؟
در غیر این صورت طبق این آموزش این کار را انجام دهید و مجددا تست کنید:
https://github.com/nodemcu/nodemcu-flasher
با تشکر از راهنمای تون ، مشکل همچنان پابرجاست و حل نشد.
در قسمت boards بورد wemos d1 به عنوان بورد هدف انتخاب کنید
لطفا برای آپلود بورد wemos d1 را انتخاب کنید و مجددا تست کنید
در این قسمت باید چه قرر گیردssid = “ssid”
نام وای فای
به عنوان مثال
ssid = "Arash"
سلام آیا باید این قسمت های فارسی را ذر برنامه ی آردیونو ای دی بنویسم
سلام
این قسمت ها کامنت های برنامه هستند و نیازی به آنها نیست
این قسمت های فارسی را باید در کد نویسی بنویسیم
با سلام
قسمت های فارسی کامنت هایی هستند که برای فهم بهتر شما از کد در آن قرار داده شده است
سلام آردوینو آی دی ارور زیر را می دهد به چه معناست وباید چه کنیم
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.
با سلام
جهت برطرف شدن مشکل لطفا توضیحات کامل ارائه دهید. از کد این آموزش استفاده شده است؟
بله از کد های آموزش زیر استفاده شده است وتمام کتابخانه ی مربوط به این آموزش هست
آیا بورد شما WEMOS D1 mini Lite هستش؟
بله
سلام ببخشید دراین خط کد نویسی 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”)
مشکلات حل شد
فقط الان سون سگمنت فعال نمی شود
آیا پین های سون سگمنت به درستی متصل شده اند؟
ایا تاریخ شمسی یا قمری را هم میتوان با همین کتابخانه بدست اورد؟
سلام
با اینکار شما تاریخ میلادی را میتوانید دریافت کنید
برای تبدیل از کتابخانه https://github.com/reza5628/IRDate استفاده کنید
سلام مال من اوکی بود فقط یک ساعت جلو نشون می داد
با سلام
سپاس از همراهی شما در صورت سوال لطفا شفاف تر اعلام کنید تا بررسی شود.
با سلام ازمنم یک ساعت جلو نشون میده. اگر مشکل شما حل شده لطفا مرا هم راهنمایی کنید. ممنونم
سلام،
چطوری میشه مثل گوشی که خودکار ساعت رو تنظیم میکنه، تنظیمش کنیم ؟
من کد هارو آپلود کردم، کار میکنه مشکلی نداره.
فقط برای شیش ماه اول و دوم به مشکل خوردم..
ایا میشه تو D1 از یه فایل txt مقدار رو بخونیم ؟
من یه API ساختم که همیشه ساعت و تاریخ رو بهم میده.
http://amiraghajani.com/arduino/time.txt
میشه تو weMos خوندش؟
ممنون میشم راهنمایی بفرمایید.
سلام
برای شش ماه اول و دوم مشکل یک ساعت رو به جلو دارید؟ با سرویس NTP و بدون نیاز به API جانبی می توانید ساعت را دریافت کنید.
سلام .ک
آیا میشه برنامه ای طراحی کرد که بتوان بر حسب ساعت مختلف رمز های متفاوت قرار بدهیم ؟؟؟؟
برای مثال روز سه شنبه ساعت ۱۲ تا ۲ رمز ورود ۲۰۲۰ ، روز سه شنبه از ساعت ۳ تا ۵ رمز ورود ۲۰۳۴ و پنجشبه از ساعت ۹ تا ۱۱ رمز ورود ۳۴۵۶ و . . . .
با سلام
بله امکان پذیر است.