آموزش Espآموزش اینترنت اشیاپروژه های Espپروژه های اینترنت اشیا

پروژه دریافت ساعت از اینترنت با برد ESP32 و NTP

در آموزش قبلی ما ساعت RTC را با استفاده از DS3231 و ESP32 راه اندازی کرده ایم. در این پروژه برای به حداقل رساندن الزامات سخت افزاری ، بدون استفاده از ماژول RTC ما یک ساعت اینترنت خواهیم ساخت. این در مقایسه با ساعت RTC دقیق تر است. ESP32 یک ماژول Wi-Fi است و می تواند به راحتی به اینترنت متصل شود ، بنابراین ما از NTP (پروتکل زمان شبکه) و UDP (پروتکل دیتاگرام کاربر) برای دریافت زمان از اینترنت با استفاده از Wi-Fi استفاده خواهیم کرد. این ساعت اینترنتی می تواند در ساخت پروژه های اینترنت اشیا بسیار مفید باشد.

فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

در صورتی که نیاز به ساعت بدون نیاز به اتصال اینترنت دارید آموزش قبلی ما را مشاهده کنید : پروژه نمایش ساعت و تاریخ با برد ESP32 در نمایشگر OLED

NTP چیست؟

NTP چیست؟

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.

پروتکل زمان شبکه (NTP) یک پروتکل شبکه است که برای همگام سازی زمان بین سیستم ها و شبکه از آن استفاده می شود. چارچوب NTP بستگی به سرورهای اینترنت دارد. NTP دارای الگوریتم هایی برای تنظیم دقیق زمان روز است. سرورهای NTP نرم افزاری دارند که زمان ساعت روز را با استفاده از UDPport 123 به رایانه های هدف ارسال می کنند. بنابراین در اینجا در این پروژه ، ما از سرور NTP با استفاده از ESP32 زمان را می گیریم و آن را در نمایشگر OLED نشان می دهیم.

توضیحات مدار پروژه دریافت ساعت جهانی با ESP32

در اینجا ، ما از ارتباط SPI برای اتصال ماژول نمایشگر OLED SSD1306 به ESP32 استفاده می کنیم. بنابراین ، از 7 پین استفاده خواهیم کرد.

مدار پروژه دریافت ساعت جهانی با ESP32

اتصالات 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 ندارید.

موارد موجود در فایل : سورس کامل ، شماتیک

دانلود فایل های پروژه

برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید.

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.

تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

11 نظر

  1. سلام من یک برد nodemcu دارم که داره اطلاعات دوتاسنسور رومیگیره میخوام این اطلاعات رو به آردیونو بدم مثلا توسط سریال وتغییرات روش انجام بدم وبه یک برد nodemcu دیگه بدم این یکی هم سریال باشه بهتره چون i2c بردم درگیره اما نمیتونم ارتباط برقرار کنم لطفا کمک کنید ممنونم حتی اگر میتونید کدش رو برام بنویسید من هزینه رو پرداخت کنم

    1. سلام. ما به صورت سفارشی پروژه ای انجام نمیدیم. شما بهتره مطالب قسمت پروژه های ESP رو بخونید. اکثرا پروژه ها با آردوینو هستند و با بررسی کد هاشون به راحتی برقراری ارتباط بین دو برد رو یاد میگیرید.

  2. یک سوال دیگه چراوقتی LiquidCrystal_I2C رو اجرا میکنم با serial تداخل پیدا میکنه وهیچی توی سریال مانیتورینگ نشون نمیده ؟

    1. چه نیازی به کتابخانه LiquidCrystal_I2C هست در این پروژه؟

    2. آهان. در این مورد به اینصورت نمیتونم نظر بدم باید کد رو بررسی کنید در کل به هم ارتباطی ندارند.

  3. سلام آقا من یک مشکل دارم موقعی که برد nodemcu روپروگرام میکنم وقتی به کامپوتره وبرق رواز کامپیوتر میگیره درست کار میکنه ولی همینکه میارمش بیرون و باباتری میخوام راه اندازی کنم کارنمیکنه میشه راهنمایی کنید ممنونم.(به پایه های vin , g)

    1. سلام. هیچ چیزی نمایش داده نمیشه؟ باتری هاتون به اندازه کافی قدرتمند هستند؟ با منبع تغذیه دیگه ای امتحان کنید.

    2. نه متاسفانه امتحان کردم خیلی برام عجیبه

    3. متاسفانه چون بردها مدار محافظ برای تغذیه معکوس ندارن،با کوچک ترین خطا میسوزن، فکر میکنم مدار تغذیه nodemcu شما سوخته، از یک برد دیگه استفاده کنید.
      برای من هم یک بار پیش اومده..

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *