پروژه دریافت ساعت از اینترنت با برد ESP32 و NTP
در آموزش قبلی ما ساعت 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 ندارید.
موارد موجود در فایل : سورس کامل ، شماتیک
سلام من یک برد nodemcu دارم که داره اطلاعات دوتاسنسور رومیگیره میخوام این اطلاعات رو به آردیونو بدم مثلا توسط سریال وتغییرات روش انجام بدم وبه یک برد nodemcu دیگه بدم این یکی هم سریال باشه بهتره چون i2c بردم درگیره اما نمیتونم ارتباط برقرار کنم لطفا کمک کنید ممنونم حتی اگر میتونید کدش رو برام بنویسید من هزینه رو پرداخت کنم
سلام. ما به صورت سفارشی پروژه ای انجام نمیدیم. شما بهتره مطالب قسمت پروژه های ESP رو بخونید. اکثرا پروژه ها با آردوینو هستند و با بررسی کد هاشون به راحتی برقراری ارتباط بین دو برد رو یاد میگیرید.
یک سوال دیگه چراوقتی LiquidCrystal_I2C رو اجرا میکنم با serial تداخل پیدا میکنه وهیچی توی سریال مانیتورینگ نشون نمیده ؟
چه نیازی به کتابخانه LiquidCrystal_I2C هست در این پروژه؟
دراین پروژه نیست گفتم اینجا بپرسم
آهان. در این مورد به اینصورت نمیتونم نظر بدم باید کد رو بررسی کنید در کل به هم ارتباطی ندارند.
سلام آقا من یک مشکل دارم موقعی که برد nodemcu روپروگرام میکنم وقتی به کامپوتره وبرق رواز کامپیوتر میگیره درست کار میکنه ولی همینکه میارمش بیرون و باباتری میخوام راه اندازی کنم کارنمیکنه میشه راهنمایی کنید ممنونم.(به پایه های vin , g)
سلام. هیچ چیزی نمایش داده نمیشه؟ باتری هاتون به اندازه کافی قدرتمند هستند؟ با منبع تغذیه دیگه ای امتحان کنید.
نه متاسفانه امتحان کردم خیلی برام عجیبه
من نمیدونم متاسفانه.