مقدمه
در چند جلسه قبل کمی از ربات NK-100 فاصله گرفتیم و به آموزش کار با آردوینو روی میکروکنترلر مگا٨ و همچنین برنامهریزی برای ماژول وایفای ESP8266 پرداختیم. در این جلسه مجدداً به برد آردوینو و ربات NK-100 برمیگردیم و این بار به نحوه اتصال ماژول ساعت DS3231 یا DS1307 به آردوینو میپردازیم.
ماژولهای ساعت ذکر شده هر دو از پروتکل I2C استفاده میکنند و تفاوت آنها در دقت و برخی ویژگیهای سخت افزاری مثل آلارم و… میباشد. ما در این جلسه با ماژول ساعت DS3231 کار میکنیم، چرا که این ماژول از DS1307 بسیار دقیقتر است. اما به طور کلی برنامههای این دو ماژول معمولاً با یکدیگر سازگار میباشد.
سخت افزار:
قبل از هر چیزی ابتدا مقاومت ٢٢٠ اهم روی ماژول را جدا کنید (کنار دیود شیشهای) و یک باتری CR2032 داخل ماژول قرار دهید. مقاومت برای شارژ کردن باتریهای شارژی در نظر گرفته شده و در صورت استفاده از باتری معمولی باعث منفجر شدن یا خراب شدن باتری خواهد شد.
برای سخت افزار این جلسه یک ماژول ساعت DS3231 را مطابق شکل زیر به آردوینو نانو متصل میکنیم. توجه داشته باشید که پایههای SCL و SDA ی سخت افزاری معمولا در آردوینو نانو چاپ نشدهاند و SDA همان A4 و SCL همان A5 میباشد. البته کتابخانه مورد استفاده در این جلسه به هر کدام از پایههای آردوینو قابل اتصال است.
کدنویسی:
قبل از آغاز کد نویسی کتابخانه DS3231.zip را از این لینک (DS3231) دانلود و از طریق Library manager نصب کنید.
سپس کدهای زیر را داخل کامپایلر Arduino وارد نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <DS3231.h> DS3231 rtc(SDA, SCL); Time ds; void setup() { rtc.begin(); Serial.begin(9600); // The following lines can be uncommented to set the date and time //rtc.setDOW(1); // Set Day-of-Week to MONDAY (1-7) //rtc.setTime(17, 10, 00); // Set the time to 17:10:00 (24hr format) //rtc.setDate(25, 9, 2021); // Set the date to September(9) 25st, 2021 } void loop() { //get string Serial.println(rtc.getDOWStr()); Serial.println(rtc.getDateStr()); Serial.println(rtc.getTimeStr()); Serial.println("------------------"); //get value ds = rtc.getTime(); Serial.println(ds.dow); Serial.print(ds.year); Serial.print("/"); Serial.print(ds.mon); Serial.print("/"); Serial.println(ds.date); Serial.print(ds.hour); Serial.print(":"); Serial.print(ds.min); Serial.print(":"); Serial.println(ds.sec); Serial.println("====================================="); delay(5000); } |
در این پروژه ابتدا با دستور include<DS3231.h>کتابخانه ماژول اضافه شده و در خط بعدی یک شی به نام rtc از کلاس DS3231 ایجاد شده است. این کلاس دو آرگومان برای سازنده تابع خود دریافت میکند که شماره پایههای متصل به SDA و SCL ماژول هستند. با توجه به اینکه ما از SDA و SCL سخت افزاری استفاده کردهایم همین نامها را در داخل سازنده تابع قرار میدهیم. اما در صورت اتصال پایههای دیتا و کلاک ماژول به هر پایه دیگری از آردوینو میتوان آنها را در داخل سازنده ذکر کرد.
در خط بعدی با دستور Time ds یک شی به نام ds از کلاس Time ایجاد کردهایم. کلاس Time یک نوع کلاس خاص میباشد که مختص کتابخانه DS3231 است و در داخل آن کتابخانه تعریف شده است. این کلاس در واقع شبیه نوع داده ساختار است و در داخل آن هفت متغیر تعریف شده است که ساعت، دقیقه، ثانیه، سال، ماه، روز و ایام هفته را شامل میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Time { public: uint8_t hour; uint8_t min; uint8_t sec; uint8_t date; uint8_t mon; uint16_t year; uint8_t dow; Time(); }; |
در تابع setup با دستور rtc.begin تابع begin را فراخوانی میکنیم که باعث شروع به کار ماژول میشود. در بخش بعدی سه دستور قرار دارد که آنها را کامنت کردهایم. این دستورات برای تنظیم اولیه زمان و تاریخ و ایام هفته مورد استفاده قرار میگیرد و پس از یک بار اجرای برنامه روی برد، کامنت میشود تا با هر بار روشن شدن ماژول زمان و تاریخ و ایام هفته تنظیم نشود.
اولین تابع rtc.setDOW میباشد. DOW مخفف Day Of Week به معنای روز هفته است. در این کتابخانه برای هر کدام از روزهای هفته یک نام و یک عدد در نظر گرفته شده است که میتوانید از هر کدام در داخل آرگومان این تابع استفاده کنید. همچنین می توانید ترتیب اعداد را مطابق میل خود از هدرفایل تغییر دهید. هدرفایلِ کتابخانههایی که برای آردوینو نصب میکنید در Documents و در پوشه Arduino و زیر پوشه Libraries قرار گرفته است و نام پوشه این کتابخانه DS3231 و نام هدرفایل DS3231.h میباشد.
1 2 3 4 5 6 7 |
#define MONDAY 1 #define TUESDAY 2 #define WEDNESDAY 3 #define THURSDAY 4 #define FRIDAY 5 #define SATURDAY 6 #define SUNDAY 7 |
تابع بعدی rtc.setTime نام دارد. این تابع سه آرگومان میگیرد که به ترتیب از چپ به راست ساعت، دقیقه و ثانیه را شامل میشود. ساعت به فرمت نظامی و ٢٤ ساعته است.
تابع بعدی rtc.setDate است. این تابع نیز سه متغیر میگیرد که به ترتیب از چپ به راست روز، ماه و سال می باشد. نکته مهم در این توابع اینست که فقط سال از نوع uint16_t بوده و بقیه آرگومانها از نوع uinit8_t میباشند. Uint یک نوع داده است که مخفف unsigned int میباشد یعنی عدد صحیح بدون علامت و عدد بعد از آندرلاین نیز تعداد بیت آن را مشخص میکند.
در تابع loop نوبت به بازخوانی مقادیر زمان موجود در ماژول میرسد. برای خواندن ساعت، تاریخ و ایام هفته سه تابع وجود دارد که در ابتدای حلقه نوشته شده است: تابع rtc.getDOWStr برای خواندن ایام هفته، تابع rtc.getTimeStr برای دریافت زمان و در نهایت تابع rtc.getDateStr برای دریافت تاریخ و هر سه خروجی رشته میدهند.
اما این پایان ماجرا نیست چرا که ما همیشه به رشته احتیاج نداریم. بیشتر مواقع در پروژه خود به یک عدد نیاز داریم تا مثلا بدانیم که ساعت الان چند است یا امروز کدام روز هفته میباشد.
خوشبختانه کتابخانه DS3231 یک تابع به نام rtc.getTime در اختیار ما قرار داده است که خروجی آن یک کلاس از نوع Time است.همانطوریکه به خاطر دارید ما یک شی به نام ds از نوع Time ایجاد کردیم، در اینجا از این شی استفاده کرده و خروجی تابع را در این شی ذخیره مینماییم. شی ds چیزی جز تعدادی متغیر عمومی نیست که براحتی میتوانیم به آنها دسترسی داشته باشیم. مثلا با دستور ds.hour میتوانیم مقدار ساعت را در اختیار داشته باشیم. سایر متغیرها در شکل زیر مشخص است:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Time { public: uint8_t hour; uint8_t min; uint8_t sec; uint8_t date; uint8_t mon; uint16_t year; uint8_t dow; Time(); }; |
بدین ترتیب براحتی میتوانیم به ساعت زمان واقعی یا همان RTC که مخفف Real Time Clock است در دستگاه خود دسترسی داشته باشیم و برای ساخت پروژههای بیشماری از قبیل تایمر آبیاری، هوشمندسازی، سیستم غذادهی خودکار حیوانات، ساخت طلوع و غروب مصنویی برای پرندگان و… از آن استفاده کنیم.
در این جلسه با ماژول ساعت دقیق DS3231 و نحوه راه اندازی با آردوینو آن برای ربات NK-100 آشنا شدیم. در جلسات بعد انشاءالله با مطالب بیشتری درخصوص آردوینو کار خواهیم کرد.
بازدیدها: 464