ویژگی های ماژول ساعت دقیق DS1302
ماژول ساعت دقیق DS1302 یک ماژول ارزان قیمت با دقت مناسب است که میتوان از آن در پروژههای گوناگون استفاده کرد. با استفاده از این ماژول میتوان اطلاعات ثانیه، دقیقه، ساعت، روز، روز هفته، ماه، تاریخ ماه و سال را نگهداری کرد. تاریخ در انتهای هر ماه بر اساس 29، 30 یا 31 روزه بودن ماه نیز به طور اتوماتیک تنظیم میشود. همچنین این ماژول در تنظیم تاریخ در پایان هر سال، کبیسه بودن یا نبودن سال را هم در نظر میگیرد که این عمل تا قبل از سال 2100 معتبر است.
نکته
دقت شود که پروتکل ارتباطی ماژول ساعت دقیق DS1302، پروتکل I2C نمیباشد. ارتباط این ماژول با میکروکنترلر از طریق ارتباط سه سیمه سریالی سنکرون انجام میشود.
معرفی پایه ها (Pinout) ماژول ساعت دقیق DS1302
ماژول ساعت دقیق DS1302 دارای 5 پایه به شرح زیر است:
- VCC: تغذیه ماژول – 5 ولت
- GND: زمین
- CLK: پایه کلاک
- DAT: پایه دیتا
- RST: ریست (برای فعال بودن ماژول باید 1 باشد، اصطلاحا Actice High است.)
پین اوت (Pinout) این ماژول را میتوانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی ماژول ساعت دقیق DS1302
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: نصب کتابخانه
به Library manager رفته و کتابخانه Rtc by Makuna را نصب کنید.
گام سوم: کد
کد زیر را روی برد آردوینو آپلود کنید. پس از آپلود کد، پنجره ی Serial Monitor را باز کنید.
/*
Modified on Nov 25, 2020
Modified by MehranMaleki from Arduino Examples
Home
*/
// CONNECTIONS:
// DS1302 CLK/SCLK --> 5
// DS1302 DAT/IO --> 4
// DS1302 RST/CE --> 2
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND
#include <ThreeWire.h>
#include <RtcDS1302.h>
ThreeWire myWire(4,5,2); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);
void setup ()
{
Serial.begin(9600);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) first time you ran and the device wasn't running yet
// 2) the battery on the device is low or even missing
Serial.println("RTC lost confidence in the DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC was write protected, enabling writing now");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
}
void loop ()
{
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
Serial.println();
if (!now.IsValid())
{
// Common Causes:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println("RTC lost confidence in the DateTime!");
}
delay(5000); // five seconds
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
void printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
در کد بالا ابتدا اطلاعات زمان کنونی به عنوان مبدا زمان به ماژول داده شده و بر روی سپس ماژول شروع به کار کرده و هر 5 ثانیه زمان جدید را بر روی Serial Monitor نمایش میدهد.
خروجی کد به شکل زیر است.