از گذشته تا امروز با پیشرفت تکنولوژی همواره در دیوایس های مختلف اندازه گیری زمان به روش های مختلفی صورت گرفته است، در این آموزش قصد داریم مدرن ترین این ترفند ها برای بدست آوردن زمان را یعنی ساعت دیجیتال آنلاین NTP به شما آموزش دهیم. بدون نگرانی برای این موضوع که با خاموش شدن مدار و خارج شدن از تغذیه، زمان را از دست خواهید داد، هر زمان قادر خواهید بود با اتصال به اینترنت تاریخ و ساعت دقیق را بدست آورید. در گذشته هر زمان که صحبت از بدست آوردن و محاسبه زمان میشد، اولین چیزی که به ذهن شما خطور می کرد استفاده از تراشه RTC (Real Time Clock) است. اما این تراشه ها کاملاً دقیق نیستند، بنابراین باید تنظیمات دستی را بارها و بارها انجام دهید تا همزمان شوند. راه حل اینجا استفاده از پروتکل زمان شبکه (NTP) است. اگر پروژه ESP32 شما به اینترنت دسترسی دارد، می توانید تاریخ و زمان را (با دقت چند میلی ثانیه از ساعت UTC) به صورت رایگان دریافت کنید. و البته شما به هیچ سخت افزار دیگری احتیاج ندارید. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
ساعت دیجیتال آنلاین NTP
برد 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
در این پروژه تنها از دو قطعه استفاده شده، برد nodemcu با تراشه ESP32 و یک نمایشگر Oled با تراشه ssd1306، برای راهاندازی نمایشگر Oled باید از ارتباط i2c در تراشه ESP32 استفاده کنیم که پین های مربوط به این مورد یا همان SDA , SCK به پین های D21 , D22 در برد nodemcu متصل خواهند شد. اتصالات را مطابق جدول و شماتیم زیر برقرار کنید.
-
شماتیک اتصالات پروژه ساعت NTP با استفاده از برد ESP320
کد و راهاندازی مدار
خب بیایید نگاهی سریع به کد بیندازیم تا ببینیم چگونه کار می کند. ابتدا کتابخانه های مورد نیاز این پروژه را فراخوانی خواهیم کرد. کتابخانه های این پروژه برای راهاندازی وای فای تراشه ESP32، دریافت زمان از سرور های NTP و در آخر برای راهاندازی نمایشگر Oled بکار گرفته میشوند. قبل از بارگذاری کد، باید تغییراتی ایجاد کنید تا برای شما مناسب باشد. پس از فراخوانی کتابخانه ها باید از بخش زیر تغییراتی اعمال کنیم که در واقع مربوط به شبکه وای فای مورد استفاده برای دریافت دیتا می باشد. شما باید دو متغیر زیر را با اطلاعات کاربری شبکه خود اصلاح کنید تا ESP32 بتواند با شبکه موجود ارتباط برقرار کند.
const char* ssid = "C1F3R"; // نام وای فای مورد نظر const char* password = "314159265"; // پسوورد وای فای
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 است که معمولا دقیق نیستند، که برای موردی مانند محاسبه زمان که دقت برای کاربر بسیار مهم است، پس از یک راه حال جدید استفاده کردیم یعنی دریافت زمان و تاریخ از یک سرور مرکزی از طریق اینترنت که در ادامه این مقادیر را در نمایشگر مد نظر نیز نمایش دادیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام . اگه بخواهیم بالای ساعت به غیر از مقادیر روزهای هفته ، تاریخ هم به ترتیب روز و ماه وسال ، حالا به میلادی و یا شمسی هم درج بشه چکار باید کرد؟
سلام، منطقه زمانی که برای این کد مشخص کردم با توجه به کانکشن شما ریجن شما رو تشخیص میده و مقادیر با توجه به این مورد نمایش داده میشه. برای نمایش تاریخ باید مثل روز های هفته مقادیر را تعریف کنید. یا از کتابخانه های آماده استفاده کنید.
سلام مهندس و ممنون از توضیحتون . البته من هر کار کردم نشد و مظلب دیگه اینکه این برنامه اول خوب کار میکرد . ولی گاهی مواقع و حتی الان که چند روزی هم میشه . ساعت رو از صفر یا یک شروع میکنه. علتش چیه . بعد این سایت هم چیه که نمیشه بهش متصل شد .pool.ntp.org
سلام، خواهش میکنم. بله کد یک ناپایدار هست در مواقعی که سرعت اینترنت تغییر داشته باشه، البته وابستگی به سرور های مربوط هم دارد.
اون آدرس سرور ntp که بهش متصل شدیم هست.
سلام تاریخ رو چجوری بدست بیارم
با سلام
توسط تابع “Current date and time: ” میتوانید اقدام کنید.