پروژه دریافت ساعت از اینترنت با برد ESP32 و NTP
![](/wp-content/uploads/2020/08/پروژه-دریافت-ساعت-از-اینترنت-با-برد-ESP32-و-نمایش-در-SSD1306.jpg)
محتویات
در آموزش قبلی ما ساعت RTC را با استفاده از DS3231 و ESP32 راه اندازی کرده ایم. در این پروژه برای به حداقل رساندن الزامات سخت افزاری ، بدون استفاده از ماژول RTC ما یک ساعت اینترنت خواهیم ساخت. این در مقایسه با ساعت RTC دقیق تر است. ESP32 یک ماژول Wi-Fi است و می تواند به راحتی به اینترنت متصل شود ، بنابراین ما از NTP (پروتکل زمان شبکه) و UDP (پروتکل دیتاگرام کاربر) برای دریافت زمان از اینترنت با استفاده از Wi-Fi استفاده خواهیم کرد. این ساعت اینترنتی می تواند در ساخت پروژه های اینترنت اشیا بسیار مفید باشد.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
در صورتی که نیاز به ساعت بدون نیاز به اتصال اینترنت دارید آموزش قبلی ما را مشاهده کنید : پروژه نمایش ساعت و تاریخ با برد ESP32 در نمایشگر OLED
NTP چیست؟
پروتکل زمان شبکه (NTP) یک پروتکل شبکه است که برای همگام سازی زمان بین سیستم ها و شبکه از آن استفاده می شود. چارچوب NTP بستگی به سرورهای اینترنت دارد. NTP دارای الگوریتم هایی برای تنظیم دقیق زمان روز است. سرورهای NTP نرم افزاری دارند که زمان ساعت روز را با استفاده از UDPport 123 به رایانه های هدف ارسال می کنند. بنابراین در اینجا در این پروژه ، ما از سرور NTP با استفاده از ESP32 زمان را می گیریم و آن را در نمایشگر OLED نشان می دهیم.
توضیحات مدار پروژه دریافت ساعت جهانی با ESP32
در اینجا ، ما از ارتباط SPI برای اتصال ماژول نمایشگر OLED SSD1306 به ESP32 استفاده می کنیم. بنابراین ، از 7 پین استفاده خواهیم کرد.
اتصالات SSD1306 با ESP32
- CS Chip select پین از OLED -> پین D5 از ESP32
- DC از OLED -> پین D4 از ESP32
- RES از OLED -> پین D2 از ESP32
- SDA از OLED -> پین D23 MOSI از ESP32
- SCK از OLED -> پین D18 SCK از ESP32
- Vdd از OLED -> Vcc از ESP32
- GND از OLED -> GND از ESP32
توضیحات کد پروژه دریافت زمان از اینترنت
برنامه نویسی این پروژه با کامپایلر آردوینو انجام میشود. بنابراین پیشنهاد میشود آموزش برنامه نویسی ESP32 با آردوینو را بخوانید. ما برای این پروژه به 5 کتابخانه نیاز داریم که آن ها را به همراه کد کامل پروژه در فایل دانلودی انتهای صفحه قرار داده ایم. در اینجا بعضی از قسمت های کد را بررسی میکنیم.
بنابراین ما در ابتدا تمام کتابخانه ها و متغیر ها را درج میکنیم.
#include <WiFi.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <NTPClient.h> #include <WiFiUdp.h> const char* ssid = "*******"; //WiFi نام const char* password = "*********"; // WiFi رمز
در اینجا از کتابخانه NTPClient.h برای ارتباط با سرور ساعت استفاده می شود. کتابخانه Hrere WiFiUdp.h برای ارسال و دریافت پیام های UDP استفاده می شود. UDP پروتكلی است كه پیامهای كوتاهی را از سیستم ما به سرور NTP ارسال و دریافت می كند.
بنابراین برای به دست آوردن زمان از اینترنت ، باید سه متغیر را در برنامه خود برای NTP تعریف کنیم.
NTP_OFFSET
منطقه زمانی کشور است ، یعنی برای ایران که +3:30 است بر حسب ثانیه باید عدد 12600 را وارد کنید.
NTP_INTERVAL
بازه زمانی است که توسط NTP برای به روزرسانی زمان گرفته شده است. 60-64 ثانیه است.
NTP_ADDRESS
سرور NTP کشور شما است. برای ایران می توانید از “3.ir.pool.ntp.org” استفاده کنید.
#define NTP_OFFSET 12600 // بر حسب ثانیه #define NTP_INTERVAL 60 * 1000 // تبدیل به میلی ثانیه #define NTP_ADDRESS "3.ir.pool.ntp.org" WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
در void setup ، تنظیمات Wi-Fi را برای اتصال به اینترنت آغاز میکنیم.
void setup() { display.begin(); Serial.begin(9600); Serial.println(); Serial.println(); 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."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); timeClient.begin();
سپس توابع نمایشگر را برای نمایش زمان در OLED وارد میکنیم.
display.begin(SSD1306_SWITCHCAPVCC);
در تابع loop ، از timeClient.update
استفاده کرده ایم ، این تابع زمان به روز شده را از NTP به صورت رشته می گیرد و آن را در متغیر formattedTime
ذخیره می کند. سپس با استفاده از عملکرد display.println ()
آن را در OLED نمایش میدهیم.
void loop() { timeClient.update(); String formattedTime = timeClient.getFormattedTime(); display.clearDisplay(); display.setTextSize(2); display.setCursor(0, 0); display.println(formattedTime);
به این ترتیب میتوانید برای پروژه های خود یک ساعت اینترنتی را راه اندازی کنید و دیگر نیازی به استفاده از ماژول RTC DS3231 ندارید.
موارد موجود در فایل : سورس کامل ، شماتیک
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام استاد – ساعت من 2 ساعت جلوتره چرا ؟؟؟
سلام عزیز
سرور ایران را وارد کردید؟
این لینک را بررسی کنید:
https://www.ntppool.org/zone/ir
بله استاد ایران رو وارد کردیم ولی باز دوساعت جلوتره
الان تو یک پروژه دیگه باز به همین مشکل برخودم
جوابی که از هوش مصنوعی برای حل این مشکل گرفتم :
بله، این تنظیمات برای هماهنگ کردن ساعت با سرورهای NTP (Network Time Protocol) در ایران مناسب به نظر میرسند. در اینجا به توضیح تنظیمات پرداخته میشود:
NTP_OFFSET 19800: این مقدار به ثانیه داده شده و نشاندهنده اختلاف زمانی منطقه زمانی محلی با UTC (Coordinated Universal Time) است. برای ایران، اختلاف زمانی با UTC برابر با +3:30 ساعت است. با توجه به اینکه 3 ساعت و 30 دقیقه برابر با 12600 ثانیه میشود (3 * 3600 + 30 * 60)، بنابراین برای زمان استاندارد ایران، این مقدار به صورت دقیق 12600 ثانیه است. مقدار 19800 ثانیه اشاره شده احتمالاً برای زمانی که ساعت تابستانی (Daylight Saving Time) اعمال میشود، محاسبه شده است که در حال حاضر در ایران استفاده نمیشود. بنابراین اگر در تنظیمات خود قصد اعمال ساعت تابستانی را ندارید، بهتر است از مقدار 12600 استفاده کنید.
NTP_INTERVAL 60 * 1000: این مقدار نشاندهنده دوره زمانی به میلیثانیه است که بعد از آن ساعت سیستم بهروزرسانی میشود. مقدار 60 * 1000 برابر با 60000 میلیثانیه یا 60 ثانیه (1 دقیقه) است. این مقدار برای بهروزرسانی منظم و دقیق زمان، مناسب و معقول به نظر میرسد.
NTP_ADDRESS “ir.pool.ntp.org”: این آدرس نشاندهنده سرور NTP در ایران است که برای هماهنگ کردن ساعت دستگاه با ساعت جهانی استفاده میشود. استفاده از سرورهای محلی NTP مزیتهایی از جمله کاهش تأخیر و افزایش دقت دارد. آدرس ir.pool.ntp.org برای ایران مناسب است و مشکلی ندارد.
در مجموع، اگر بخواهید زمان استاندارد ایران را بدون در نظر گرفتن ساعت تابستانی تنظیم کنید، باید مقدار NTP_OFFSET را به 12600 تغییر دهید. در غیر این صورت، تنظیمات شما به شکل فعلی برای سناریوی که ساعت تابستانی در نظر گرفته شده، درست است.
مشکل با عوض کردن این خط حل میشه :
#define NTP_OFFSET 12600
سلام جناب مهندس. خداقوت، مطالب بسیار عالی بودن.
شما فرمودین: NTP_ADDRESS سرور NTP کشور ماست. برای هند میتونیم از “3.ir.pool.ntp.org” استفاده کنیم. سوالم اینه: برای کشور ایران باید از چه سروری استفاده کنیم؟؟
سلام عزیز
اشتباه ترجمه بود، اصلاح شد
سلام با oled 1306 چهار پایه هم میشه انجام داد؟
سلام عزیز، باید در کدنویسی تغییر ایجاد بشه
سلام من یک برد nodemcu دارم که داره اطلاعات دوتاسنسور رومیگیره میخوام این اطلاعات رو به آردیونو بدم مثلا توسط سریال وتغییرات روش انجام بدم وبه یک برد nodemcu دیگه بدم این یکی هم سریال باشه بهتره چون i2c بردم درگیره اما نمیتونم ارتباط برقرار کنم لطفا کمک کنید ممنونم حتی اگر میتونید کدش رو برام بنویسید من هزینه رو پرداخت کنم
سلام. ما به صورت سفارشی پروژه ای انجام نمیدیم. شما بهتره مطالب قسمت پروژه های ESP رو بخونید. اکثرا پروژه ها با آردوینو هستند و با بررسی کد هاشون به راحتی برقراری ارتباط بین دو برد رو یاد میگیرید.
یک سوال دیگه چراوقتی LiquidCrystal_I2C رو اجرا میکنم با serial تداخل پیدا میکنه وهیچی توی سریال مانیتورینگ نشون نمیده ؟
چه نیازی به کتابخانه LiquidCrystal_I2C هست در این پروژه؟
دراین پروژه نیست گفتم اینجا بپرسم
آهان. در این مورد به اینصورت نمیتونم نظر بدم باید کد رو بررسی کنید در کل به هم ارتباطی ندارند.
سلام آقا من یک مشکل دارم موقعی که برد nodemcu روپروگرام میکنم وقتی به کامپوتره وبرق رواز کامپیوتر میگیره درست کار میکنه ولی همینکه میارمش بیرون و باباتری میخوام راه اندازی کنم کارنمیکنه میشه راهنمایی کنید ممنونم.(به پایه های vin , g)
سلام. هیچ چیزی نمایش داده نمیشه؟ باتری هاتون به اندازه کافی قدرتمند هستند؟ با منبع تغذیه دیگه ای امتحان کنید.
نه متاسفانه امتحان کردم خیلی برام عجیبه
من نمیدونم متاسفانه.
متاسفانه چون بردها مدار محافظ برای تغذیه معکوس ندارن،با کوچک ترین خطا میسوزن، فکر میکنم مدار تغذیه nodemcu شما سوخته، از یک برد دیگه استفاده کنید.
برای من هم یک بار پیش اومده..