Toggle Nav

آموزش راه‌اندازی ماژول ساعت دقیق DS1307 با آردوینو

فهرست مطالب

ویژگی های ماژول ساعت دقیق DS1307

ماژول ساعت دقیق DS1307 ، دقیق و مناسب برای نگهداری تاریخ در پروژه­‌های متفاوت است. با این ماژول می­‌توان اطلاعات ثانیه، دقیقه، ساعت، روز، روز هفته، ماه و سال را نگهداری کرد. تاریخ در انتهای هر ماه بر اساس 29، 30 یا 31 روزه بودن ماه نیز به طور اتوماتیک تنظیم می­‌شود. همچنین این ماژول در تنظیم تاریخ در پایان هر سال، کبیسه بودن یا نبودن سال را هم در نظر می­‌گیرد. همچنین این ماژول ساعت به کمک پروتکل ارتباطی I2C با انواع میکروکنترلرها ارتباط برقرار می‌کند.

ماژول ساعت DS1307 در دو ورژن در بازار موجود است.

نکته

در تصویر بالا که انواع مدل‌های ماژول ساعت DS1307 را نشان می‌دهد، مدل سمت چپ، دارای یک حافظه داخلی 24C32 EEPROM نیز است. از این حافظه داخلی می‌توان برای ذخیره برخی تنظیمات استفاده کرد. حافظه داخلی این ماژول نیز دارای پروتکل ارتباطی I2C است.

همچنین بر روی این ماژول قسمتی برای لحیم کردن سنسور دمای DS18B20 نیز تعبیه شده است، که در صورت نیاز می‌توان از آن هم استفاده کرد. محل آن در شکل زیر با کادر قرمز مشخص شده است:

نکته

در تصویر انواع مدل‌های ماژول ساعت دقیق DS1307، مدل سمت راست، یک خروجی موج مربعی قابل تنظیم نیز دارد.

معرفی پایه ها (Pinout) ماژول ساعت دقیق DS1307

یکی از دو نوع مدل ماژول ساعت DS1307 دارای 12 پایه به شرح زیر است:

5 پایه در یک سمت برای ارتباط با قطعه DS1307:

  • DS: خروجی سنسور دمای DS18B20
  • SCL: پایه Serial Clock Input برای پروتکل I2C
  • SDA: پایه Serial Data Input/Output برای پروتکل I2C
  • VCC: تغذیه ماژول – 5 ولت
  • GND: زمین

7 پایه دیگر در سمت دیگر برای ارتباط با قطعه 24C32 EEPROM:

  • SQ: موج مربعی خروجی
  • DS: خروجی سنسور دمای DS18B20
  • SCL: پایه Serial Clock Input برای پروتکل I2C
  • SDA: پایه Serial Data Input/Output برای پروتکل I2C
  • VCC: تغذیه ماژول –5 ولت
  • GND: زمین
  • BAT: باتری پشتیبان
نکته

هر دو جفت پایه های I2C و تغذیه که در دو سمت ماژول وجود دارند، یکسان بوده و نیازی نیست برای ارتباط با حافظه و ساعت هر دو طرف به برد آردوینو متصل باشند. یعنی در واقع با اتصال یک طرف به برد آردوینو، می‌توان با هر دو قطعه ی DS1307 و 24C32 EEPROM ارتباط گرفت. همچنین پایه DS در دو طرف ماژول نیز به هم متصل بوده و یکی‌اند.

پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.

نوع دیگر ماژول ساعت دقیق DS1307 تنها دارای 5 پایه به شرح زیر است:

  • GND: زمین
  • VCC: تغذیه ماژول –5 ولت
  • SDA: پایه Serial Data Input/Output برای پروتکل I2C
  • SCL: پایه Serial Clock Input برای  پروتکل I2C
  • SQW: موج مربعی خروجی

پین اوت (Pinout) این ماژول را نیز می توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول ساعت DS1307 دارای ارتباط I2C × 1
ماژول ساعت دقیق DS1307 تولید YwRobot × 1
سیم جامپر × 1

نرم افزارهای مورد نیاز

آردوینو IDE

راه اندازی ماژول ساعت دقیق DS1307 تولید YwRobot

گام اول: سیم بندی

مطابق یکی از دو مدار زیر، ماژول را به آردوینو وصل کنید.

گام دوم: نصب کتابخانه

از این قسمت به بعد، مراحل برای هر دو نوع ماژول یکسان است. به Library manager رفته و کتابخانه DS1307RTC را نصب کنید.

توجه

اگر برای نصب کتابخانه نیاز به راهنمایی بیشتر دارید، به اینجا مراجعه کنید.

گام سوم: کد

کد زیر را روی برد آردوینو آپلود کنید. پس از آپلود کد، پنجره ی Serial Monitor را باز کنید.

   /* 
Modified on Nov 24, 2020
Modified by MehranMaleki from Arduino Examples
https://electropeak.com/learn/
*/



#include <Wire.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() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);


  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;
    }
  }

  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() {
  
  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);
}


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;
}

در کد بالا ابتدا زمان کنونی­ از سیستم گرفته شده و به عنوان مبدا زمان به ماژول داده می‌­شود. سپس ماژول شروع به کار کرده و هر یک ثانیه زمان جدید را بر روی Serial Monitor نمایش می‌­دهد.

خروجی کد به شکل زیر است.

از این مطلب خوشتان آمد؟

آخرین مطالب و جدیدترین آموزش ها را در ایمیل خود دریافت کنید

آموزش های مشابه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *