آردوینو اینترنت اشیا IOT برد Esp32 خانه هوشمند نمایشگر OLED

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

نوشته شده توسط CiferTech

از گذشته تا امروز با پیشرفت تکنولوژی همواره در دیوایس های مختلف اندازه گیری زمان به روش های مختلفی صورت گرفته است، در این آموزش قصد داریم مدرن ترین این ترفند ها برای بدست آوردن زمان را یعنی ساعت دیجیتال آنلاین NTP به شما آموزش دهیم. بدون نگرانی برای این موضوع که با خاموش شدن مدار و خارج شدن از تغذیه، زمان را از دست خواهید داد، هر زمان قادر خواهید بود با اتصال به اینترنت تاریخ و ساعت دقیق را بدست آورید. در گذشته هر زمان که صحبت از بدست آوردن و محاسبه زمان میشد، اولین چیزی که به ذهن شما خطور می کرد استفاده از تراشه RTC (Real Time Clock) است. اما این تراشه ها کاملاً دقیق نیستند، بنابراین باید تنظیمات دستی را بارها و بارها انجام دهید تا همزمان شوند. راه حل اینجا استفاده از پروتکل زمان شبکه (NTP) است. اگر پروژه ESP32 شما به اینترنت دسترسی دارد، می توانید تاریخ و زمان را (با دقت چند میلی ثانیه از ساعت UTC) به صورت رایگان دریافت کنید. و البته شما به هیچ سخت افزار دیگری احتیاج ندارید. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

پروژه NTP ساعت از سرور با ماژول ESP32 - دیجی اسپارک

 


ساعت دیجیتال آنلاین NTP


NTP مخفف Network Time Protocol است. که یک پروتکل اینترنت استاندارد (Internet Protocol) برای همگام سازی ساعتهای رایانه با برخی از مراجع از طریق شبکه است. از این پروتکل می توان برای همگام سازی تمام دستگاه های شبکه با زمان جهانی هماهنگ (UTC) طی چند میلی ثانیه استفاده کرد که این زمان ۵۰ میلی ثانیه از طریق اینترنت عمومی و زیر ۵ میلی ثانیه در یک محیط LAN است. زمان جهانی هماهنگ (UTC) یک استاندارد جهانی در سراسر جهان است، که ارتباط نزدیکی با GMT یا زمان گرینویچ دارد. NTP ساعتهای رایانه را روی UTC تنظیم می کند، NTP دارای ساختار سلسله مراتبی است، در سطح اول زمان دقیق از ابزارهای بسیار دقیق مانند GMT یا ساعتهای اتمی دریافت می شود، سطح دوم، زمان دریافت شده از سطح اول را در اینترنت به عنوان رابط قرار می دهند، و سطح سوم level دستگاه درخواست کننده ای است که از سطح دوم زمان و تاریخ می خواهد. NTP می تواند به چندین روش کار کند. رایج ترین پیکربندی کار در حالت سرویس گیرنده-کلاینت است. اصل اساسی کار به این شکل است، دستگاه سرویس گیرنده مانند ESP32 با استفاده از User Datagram Protocol (UDP) در پورت ۱۲۳ به سرور متصل می شود. سپس مشتری یک درخواست را به یک سرور NTP منتقل می کند. در پاسخ به این درخواست، سرور NTP یک پکت stamp زمان ارسال می کند. یک بپکت stamp زمانی شامل اطلاعات متعددی مانند تایم یونیکس، دقت، تأخیر یا منطقه زمانی است. سپسما می توانیم مقادیر فعلی تاریخ و زمان را تجزیه کنیم.

 

 


برد ESP32


ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوت‌های آن بلوتوث داخلی‌اش می‌باشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC می‌باشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی می‌باشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیق‌تر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته می‌شود.

 


ماژول نمایشگر Oled SSD1306


معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد. صفحه نمایش دیود ساطع کننده نور (OLED) که ما در این آموزش استفاده خواهیم کرد مدل SSD1306 است، یک صفحه نمایش تک رنگ، ۰٫۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل همانطور که در شکل زیر نشان داده شده است. نمایشگر OLED نیازی به نور پس زمینه ندارد، که نتیجه آن ایجاد تضاد بسیار خوب در محیط های تاریک است. همچنین پیکسل های آن فقط هنگام روشن بودن انرژی مصرف می کنند، بنابراین صفحه نمایش OLED در مقایسه با سایر نمایشگرها، مصرف برق کمتری دارد.

 


روش کار پروژه ساعت دیجیتال


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

ساعت دیجیتال با NTP سرور ESP32 - دیجی اسپارک

 


وسایل موردنیاز


برد ESP32

نمایشگر Oled

 


شماتیک و اتصالات ساعت دیجیتال NTP


در این پروژه تنها از دو قطعه استفاده شده، برد nodemcu با تراشه ESP32 و یک نمایشگر Oled با تراشه ssd1306، برای راه‌اندازی نمایشگر Oled باید از ارتباط i2c در تراشه ESP32 استفاده کنیم که پین های مربوط به این مورد یا همان SDA , SCK به پین های D21 , D22 در برد nodemcu متصل خواهند شد. اتصالات را مطابق جدول و شماتیم زیر برقرار کنید.

اتصالات ماژول OLED به برد ESP32 با رابط I2C - دیجی اسپارک

 

  • شماتیک اتصالات پروژه ساعت NTP با استفاده از برد ESP320

 


کد و راه‌اندازی مدار


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

const char* ssid = "C1F3R";     // نام وای فای مورد نظر 
const char* password = "314159265";    // پسوورد وای فای

 

ما باید جابجایی UTC را برای منطقه زمانی خود در میلی ثانیه تنظیم کنیم. که برای اطلاعات دقیق میتوانید به لیست زمان UTC مراجعه کنید. همچنین در ادامه روز های هفته را به کد معرفی می کنیم که شما با توجه به نیاز خود میتوانید آن را تغییر دهید.
const long utcOffsetInSeconds = 12600;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // تعریف روز های هفته

 

در ادامه باید آدرس سرور NTP مورد نظر خود را مشخص کنیم. pool.ntp.org یک سرور NTP باز است که برای مواردی از این دست مناسب است. pool.ntp.org به طور خودکار سرورهای زمانی را که از نظر جغرافیایی برای شما نزدیک هستند انتخاب می کند. اما اگر می خواهید به صراحت انتخاب کنید ، از یکی از مناطق فرعی pool.ntp.org استفاده کنید.

NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

منطقه

نام هاست مورد نظر

بین‌المللی pool.ntp.org
آسیا asia.pool.ntp.org
اروپا europe.pool.ntp.org
شمال آمریکا north-america.pool.ntp.org
اقیانوسیه oceania.pool.ntp.org
جنوب آمریکا south-america.pool.ntp.org

کد کامل پروژه ساعت NTP با استفاده از برد ESP32

                                       // فراخوانی کتابخانه برای نمایشگر
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
                                  // فراخوانی کتابخانه برای دریافت زمان
#include <NTPClient.h>
#include <WiFi.h>
#include <WiFiUdp.h> 

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);  // مشخص کردن ابعاد و نوع درایور نمایشگر

const char* ssid = "C1F3R";     // نام وای فای مورد نظر 
const char* password = "314159265";    // پسوورد وای فای

const long utcOffsetInSeconds = 12600;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // تعریف روز های هفته 
// تعریف کلاین ntp
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup(){
  Serial.begin(115200);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // شروع کار نمایشگر
  
  display.display();
  delay(1000);
  // پاک کردن بافر 
  display.clearDisplay();
  display.display();

  WiFi.begin(ssid, password); // اتصال به شبکه با  یوزر و پسور مشخص

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();  // فراخوانی تابع برای دریافت زمان از سرور
}

void loop() {
  timeClient.update();
                      // پرینت کردن مقادیر تاریخ و ساعت در سریال مانیتور
  Serial.print(daysOfTheWeek[timeClient.getDay()]);
  Serial.print(", ");
  Serial.print(timeClient.getHours());
  Serial.print(":");
  Serial.print(timeClient.getMinutes());
  Serial.print(":");
  Serial.println(timeClient.getSeconds());

                             // پرینت مقادیر در نمایشگر شامل روز و ساعت
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(45,0);
  display.print(daysOfTheWeek[timeClient.getDay()]);

  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20,15);
  display.print(timeClient.getHours());
  display.print(":");
  display.print(timeClient.getMinutes());
  display.print(":");
  display.print(timeClient.getSeconds());

  display.display(); 
  display.clearDisplay();

  delay(100);
}

 


جمع بندی


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

پروژه ساعت دیجیتال NTP با ESP32 و OLED - دیجی اسپارک

 

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

 

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

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

CiferTech

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

۶ دیدگاه

  • سلام . اگه بخواهیم بالای ساعت به غیر از مقادیر روزهای هفته ، تاریخ هم به ترتیب روز و ماه وسال ، حالا به میلادی و یا شمسی هم درج بشه چکار باید کرد؟

    • سلام، منطقه زمانی که برای این کد مشخص کردم با توجه به کانکشن شما ریجن شما رو تشخیص میده و مقادیر با توجه به این مورد نمایش داده میشه. برای نمایش تاریخ باید مثل روز های هفته مقادیر را تعریف کنید. یا از کتابخانه های آماده استفاده کنید.

      • سلام مهندس و ممنون از توضیحتون . البته من هر کار کردم نشد و مظلب دیگه اینکه این برنامه اول خوب کار میکرد . ولی گاهی مواقع و حتی الان که چند روزی هم میشه . ساعت رو از صفر یا یک شروع میکنه. علتش چیه . بعد این سایت هم چیه که نمیشه بهش متصل شد .pool.ntp.org

        • سلام، خواهش می‌کنم. بله کد یک ناپایدار هست در مواقعی که سرعت اینترنت تغییر داشته باشه، البته وابستگی به سرور های مربوط هم دارد.
          اون آدرس سرور ntp که بهش متصل شدیم هست.