تحلیل کتابخانه

تحلیل و بررسی کتابخانه DS1307RTC.h

نوشته شده توسط علی زاهدی

زمان مسئله ای است که از قرن ها است که مورد توجه بشر قرار گرفته است. در عصر امروزه سنجش زمان و حتی نمایش ساعت صنعتی بسیار بزرگ است. روش های مختلفی برای نمایش زمان وجود دارد. از روش های مکانیکی که با استفاده از موتور و چرخدنده این عمل انجام می‌شود. و همچنین روش های جدید که با استفاده از یک چیپ ماننده DS1307 زمان محاسبه شده و با روش های مختلفی میتوان آن را نمایش داد. در این آموزش، همانند سلسله آموزش های تحلیل کتابخانه، به تشریح و تحلیل توابع کتابخانه DS1307RTC.h می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


نصب کتابخانه


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

  • ابتدا وارد این لینک شده و کتابخانه را مطابق مراpل داخل تصویر زیر دانلود کنید.

Github Library Download

 

  • سپس بایستی کتابخانه ای که دانلود نموده اید را به نرم افزار آردوینو اضافه کنید. برای این کار ابتدا بایستی وارد نرم افزار آردوینو شده و از منو Sketch بر روی گزینه Include Library کلیک کرده و سپس روی گزینه Add .Zip Library کلیک کنید.

Add Lib to Arduino

 

  • در ادامه صفحه ای باز می شود که بایستی در آن فایل دانلود شده کتابخانه DS1307RTC را انتخاب کنید.

Add .Zip File

 

  • پس از انجام مراحل بالا داخل نرم افزار در قسمت نوار پایین نرم افزار عبارت Library Added to your Libraris نمایش داده می شود. در غیر این صورت در طول انجام مراحل بالا خطایی رخ داده است.

 


نکات فنی کتابخانه DS1307RTC.h


ایسی DS1307 هم به صورت ماژول و هم به صورت تک چیپ داخل بازار موجود است. شما میتوانید برای پروژه های خود از ماژول این آیسی استفاده کنید. اما در صورتی که نیاز می‌توانید مدار راه اندازی این ماژول را خودتان طراحی کنید. در این صورت می‌توانید از شماتیک زیر استفاده کنید.

DS1307 Circuit

 

توجه داشته باشید برای این که زمان پس از قطع شدن برق میکروکنترلر بهم نخورد و زمان به طور دقیق محاسبه شود. بایستی از باتری بکاپ استفاده کنید. برای آیسی Ds1307 عموما از باتری های سکه ای ۲۰۳۲ استفاده می شود.

2032 Battery

 


توابع کلیدی کتابخانه DS1307RTC.h


در این بخش توابع مهم و کلیدی کتابخانه را مورد بررسی قرار می‌دهیم. این کتابخانه دارای توابع مختلفی است که هر یک از این توابع عملیات خاصی را انجام می دهند. در این کتابخانه ۲ تابع کاربردی وجود دارد که با استفاده از آن می‌توانید ساعت و تاریخ را از ماژول دریافت کرده و یا ساعت و تاریخ ماژول رو تانظیم کنید. این دو تابع در زیر آورده شده است که در ادامه با کاربرد هر یک از این توابع آشنا خواهیم شد.

static bool set(time_t t);
static bool read(tmElements_t &tm);
  • static bool set(time_t t)

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

  • static bool read(tmElements_t &tm)

این تابع برای دریافت ساعت از ماژول Ds1307 استفاده می شود. این تابع نیز همانند تابع قبلی دارای یک استراکچر در ورودی و یک عدد Boolean در خروجی است. بایستی به این نکته توجه داشته باشید که نیاز نیست برای این تابع استراکچر جداگانه ای تعریف کنید. و همان استراکچری که برای تابع set تعریف شده است. در این تابع نیز کاربرد خواهد داشت. در ادامه مثال هایی برای تنظیم و همچنین خواندن ساعت از ماژول Ds1307 قرار داده شده است.

 


نحوه اجرای نمونه برنامه


کد زیر مربوط به دریافت ساعت و تاریخ از ماژول Ds1307 است. در صورتی که کد زیر را بر روی برد آردوینو پروگرام کنید و اتصالات را به طور صحیح انجام دهید. ساعت و تاریخ ذخیره شده بر روی ماژول توسط برد آردوینو دریافت شده و داخل سریال مانیتور نمایش داده خواهد شد.

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

 

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

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

 


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


 


جمع بندی


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

 

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

 

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

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

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