مهندسی برق

اختراع برق باعث دگرگونی صنعت در ابعاد مختلف شد. برق یعنی زندگی

مهندسی برق

اختراع برق باعث دگرگونی صنعت در ابعاد مختلف شد. برق یعنی زندگی

مهندسی برق

با سلام

محمد حسین متانت دانش‌ آموخته رشته مهندسی برق هستم .در این وبلاگ اطلاعات مربوط به،مقالات،جزوات و کتاب ها و مطالب علمی مربوط به رشته برق ارائه می گردد.

هرگاه در پی چیزى هستى، بلند همت باش و آن‏گاه که چیره شدى، در پیروزى کریم باش.
حضرت علی (علیه السلام)

همراهان عزیز جهت خبر دار شدن از جدید ترین مطالب سایت،سایت را به دنبال داشته باشید.👇🏻

پیوندها

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

دوشنبه, ۱۹ ارديبهشت ۱۴۰۱، ۱۲:۰۰ ب.ظ

فهرست مطالب

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

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

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

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

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

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

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

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

    3. گام سوم: کد

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

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

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

DS1307-1

نکته

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

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

نکته

معرفی پایه ها (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 در دو طرف ماژول نیز به هم متصل بوده و یکی‌اند.

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

پین اوت (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
Home<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="&#8220;Home&#8221; &#8212; Electropeak" src="https://electropeak.com/learn/embed/#?secret=RswzJqvsHo" data-secret="RswzJqvsHo" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
*/

#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 نمایش می‌­دهد.

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

موافقین ۰ مخالفین ۰ ۰۱/۰۲/۱۹
Mohammad hossein Metanat

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی