آردوینو آردوینو Arduino Uno آموزش آردوینو

تنظیم ماژول ساعت DS3231 و نگهداری زمان محاسبه شده در حافظه

set-up-ds3231-clock-module-with-arduino-digispark
نوشته شده توسط پریسا پوربلورچیان

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

 


ماژول ساعت دقیق DS1302


ماژول ساعت DS3231 یک ماژول ساعت دقیق با باتری داخلی است که می‌تواند زمان دقیق را با دقت بسیار بالا نگه داری کند. این ماژول با استفاده از تکنولوژی RTC (Real Time Clock) کار می‌کند و از طریق یک رابط I2C با میکروکنترلر شما ارتباط برقرار می‌کند.DS3231 دارای دو پایه VCC و GND است و برای ارتباط با میکروکنترلر از پایه‌های SDA و SCL استفاده می‌شود. همچنین این ماژول دارای یک باتری داخلی است که به صورت خودکار در صورت قطع برق زمان را به خود نگه می‌دارد.

 مزیت این ماژول نسبت به ساعت‌های دیگر، دقت بسیار بالای آن است که به طور معمول حدود ۱ دقیقه در سال خطا دارد. همچنین DS3231 قابلیت تنظیم زمان از طریق سیستم ۱۲ ساعتی و ۲۴ ساعتی را دارد و تاریخ شمسی را نیز پشتیبانی می‌کند.با استفاده از ماژول DS3231 می‌توانید در پروژه‌های خود از ساعت دقیق استفاده کنید و به راحتی زمان را تنظیم و خواند.

 


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


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

 DS3231 قابلیت تنظیم زمان را با استفاده از سیستم ۱۲ ساعتی و ۲۴ ساعتی دارد. DS3231 می‌تواند تاریخ شمسی را نیز پشتیبانی کند. DS3231 دارای وضعیت تعلیق است که در آن مصرف باتری را به حداقل می‌رساند و در صورت لزوم ساعت را به سرعت راه اندازی می‌کند. DS3231 با دمای کاری از -۴۰ درجه سانتیگراد تا ۸۵ درجه سانتیگراد عملکرد خود را حفظ می‌کند.


کتابخانه RTClib


کتابخانه پرطرفدار RTC جهت تست و راه اندازی ساعت Realtime طراحی و توسعه یافته است. با استفاده از کتابخانه RTC ماژول هایی مانند DS1307, PCF8523, DS3231 راه اندازی می‌شود. در این آموزش با ماژول ساعت DS3231 ساعت و تاریخ را محاسبه خواهیم کرد. RTC قابلیت ذخیره زمان را در خود دارد و به همین دلیل در پروژه ها بسیار کاربردی است. حتما این سوال برای شما هم پیش می‌آید که با قطع برق چه اتفاقی برای ماژول می‌افتد. جواب بسیار ساده است. RTC زمان را در خود نگه داشته و پس از اتصال دوباره برق به مدار، ساعت از لحظه جدید زمان را محاسبه می‌کند.

اما سوال بعدی این است که اکثر میکروکنترلرها مانند Arduino،  به تنهایی قابلیت ذخیره زمان را دارند، پس چرا باید از ماژول RTC استفاده کنیم؟ تابع milis در واقع زمان شروع برنامه را محاسبه کرده و به عبارتی مدت زمات شروع برنامه را بر حسب میکروثانیه برمی‌گرداند و این عدد تقریبا پس از ۵۰ روز به بازه ۰ بر میگردد. حال اگر زمان را از طریق Arduino ذخیره کنید با هر بار قطع شدن برق مدار، از زمان ۰ ( زمان اولیه ) شروع به محاسبه آن خواهد کرد و یک ضعف بزرگ به شمار می‌آید.

 


ماژول ساعت DS3231


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

  • شمارش ساعت، دقیقه و ثانیه
  • روز هفته، روز و ماه و سال
  • دارای ولتاژ کاری بین ۳٫۳ تا ۵ ولت
  • دارای پروتکل ارتباطی I2C
  • اتصال ماژول ساعت به آردوینو

  • پایه SDA ماژول ساعت DS3231 را به پایه A4 آردوینو اتصال دهید.
  • پایه SCL ماژول ساعت DS3231 را به پایه A5 آردوینو اتصال دهید.
  • پایه VCC ماژول ساعت DS3231 را به پایه ۳٫۳ ولت آردوینو اتصال دهید.
  • پایه GND ماژول ساعت DS3231 را به پایه GND آردوینو اتصال دهید.

 


نصب کتابخانه Library ds3231


جهت تست ماژول ساعت به دو کتابخانه ساعت و Wire نیاز داریم. جهت دسترسی به کتابخانه DS3231 تنها بایستی کتابخانه RTClib نصب گردد. همچنین از کتابخانه wire جهت برقراری ارتباط استفاده خواهیم کرد. لینک دانلود کتابخانه در صفحه محصول کالا در قسمت دانلود قرار گرفته شده است، آن را دانلود و فراخوانی کنید. همچنین کتابخانه Wire به صورت پیشفرض در لیست کتابخانه های آردوینو قرار گرفته شده است. آن را فراخوانی کنید.

  • RTClib
  • wire

 


تنظیم ساعت RTC


جهت نمایش زمان و ساعت بایستی دستور آن در کد برنامه اضافه گردد. از دستور زیر استفاده خواهیم کرد:

if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   
   
    
  }

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

RTC_DS3231 rtc;

 

خواندن زمان

در این مرحله پس از تنظیم ساعت، زمان محاسبه شده خوانده و نمایش داده می‌شود. از دستور زیر استفاده خواهیم کرد.

DateTime now = rtc.now();

  sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d",  now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());  
  
  Serial.print(F("Date/Time: "));
  Serial.println(t);

 


کد آردوینو ماژول DS3231


کدهای زیر نمونه راه اندازی با ماژول ساعت DS3231 و برد آردوینو هستند. برای استفاده کافیست آن‌ها را در IDE آردوینو روی سیستم خودتان، کپی کنید. سپس روی برد آردوینو با رعایت اتصالات آپلود کنید.

 

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

 

دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندس‌های دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید.

 


رفع عیب شمارش ساعت


کابران زیادی در راه اندازی و نمایش دقیق ساعت پس از قطع شدن ارتباط ماژول به مشکل برخورده اند. دو روش جهت تست ماژول ساعت و شمارش ساعت پس از قطع مدار وجود دارد.

  • در روش اول در دستور زیر ساعت و تاریخ دقیق سیستم خود را وارد کرده و برنامه را آپلود نمایید. ساعت را خوانده و پس از گذشت چند دقیقه ارتباط برق را قطع کنید. مجدد ارتباط را برقرار کرده و بدون آپلود کردن برنامه سریال مانیتور را باز کنید. ساعت از زمان حال شروع به شمارش خواهد کرد.
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  • دو روش دوم ابتدا ساعت و تاریخ را در دستور وارد کرده و سپس برنامه را آپلود نمایید. سپس دستور را کامنت کرده و مجدد برنامه را آپلود نمایید. ساعت در هر لحظه با ساعت سیستم هماهنگ خواهد بود.
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //

 

 


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


آردوینو Arduino UNO

ماژول ساعت DS3231

کابل فلت نری به مادگی

 

 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

 

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

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

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

۴۱ دیدگاه

  • متوجه نشدم مهندس یکم واضح تر توضیح میدید ببینید الان من با دستور

    float t = dht.redTemperature();

    دارم دما رو دریافت میکنم میخوام این متغیر رو بفرستم داخل ربات چطور این کار رو انجام بدم؟

    به این شکل مینویسم خطا میده

    bot.sendMessage (chat_id,t);

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

  • سلام
    کتابخانه RTC رو از قسمت محصولات گرفتم ولی رو خط RTC_DS3231 rtc; خطا میده
    ضمنا این پیغام خطا رو میده
    Arduino: 1.8.10 (Windows 8.1), Board: “Arduino/Genuino Uno”

    ARDUINO-saaat:4:1: error: ‘RTC_DS3231’ does not name a type; did you mean ‘DS3231’?

    RTC_DS3231 rtc;

    ^~~~~~~~~~

    DS3231

    D:\ARDUINO-saaat\ARDUINO-saaat.ino: In function ‘void setup()’:

    ARDUINO-saaat:14:4: error: ‘rtc’ was not declared in this scope

    rtc.begin();

    ^~~

    D:\ARDUINO-saaat\ARDUINO-saaat.ino:14:4: note: suggested alternative: ‘getc’

    rtc.begin();

    ^~~

    getc

    D:\ARDUINO-saaat\ARDUINO-saaat.ino: In function ‘void loop()’:

    ARDUINO-saaat:32:18: error: ‘rtc’ was not declared in this scope

    DateTime now = rtc.now();

    ^~~

    D:\ARDUINO-saaat\ARDUINO-saaat.ino:32:18: note: suggested alternative: ‘getc’

    DateTime now = rtc.now();

    ^~~

    getc

    Multiple libraries were found for “Wire.h”
    Used: C:\Program
    Multiple libraries were found for “RTClib.h”
    Used: C:\Users\User\Documents\Arduino\libraries\libraries\RTCLib_by_NeiroN
    exit status 1
    ‘RTC_DS3231’ does not name a type; did you mean ‘DS3231’?

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.
    که فکر کنم مشکل نصب کتابخانه داره
    لطفا راهنمایی کنید
    متشکرم

  • سلام مشکل کتابخانه دارم نصب نمیشه
    رو این خط خطا میده
    RTC_DS3231 rtc;
    ممنون میشم راهنمایی کنید

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

    • با سلام
      در این خصوص بایستی در کدنویسی ها زمان تاخیر تعریف کنید که این مورد مرتبط با این پست نمی‌باشد.

    • با سلام
      توسط دستور زیر در برنامه نویسی میتوانید دیتای دما را دریافت کنید.
      temperature = DS3231_get_treg(); //Get temperature

  • سلام
    ممنون از اطلاعات خوبی که توی سایتتون گذاشتین
    من دارم سعی میکنم ماژول ds3231 را روی ESP32 نصب کنم ولی هر کاری میکنم نتیجه نمیگیرم
    روی مثال های RTCLiB یه سری برنامه آماده هست ولی هر وقت من اونارو استفاده میکنم همه چی رو ۱۶۵ نشون میده و تغییری نمیکنه
    برای مثال
    RTC DateTime: 165/25/165 45:85:85 DOW: 165 – Temp: 0
    RTC DateTime: 165/25/165 45:85:85 DOW: 165 – Temp: 0
    من سعی کردم دستور ها را مونجوری که تو سایت گفتین تو یه فایل جدید ک\ی کنم ولی خطا میده همش
    میشه کل فایل ی که باید اجرا بشه رو بزارین
    ممنون

    • با سلام
      تفاوتی در نوع برد ندارد. با اجرای دستورات کتابخانه ساعت فعال می‌شود. ارور دریافتی را ضمیمه کنید تا بررسی شود.

      • با سلام مجدد و ممنون از پاسختون
        برنامه ها به طور کامل کامپایل میشن ولی خروجی که روی مانیتور آردینو نشون میده همش با اعداد ۱۶۵ و ۴۵ و ۸۵ پر شده و بعضی اوقات اعداد اشتباهی دیگه نشون میده
        این یه نمونه از خروجی که از مانیتور میگیرم.
        ۴۵:۱۶۵:۸۵ ۱۶۵/۱۶۵/۱۶۵ Day of week: 15:37:85 12/20/20 Day of week: 45:165:85 165/12/22 Day of week: 18:14:03 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 7:15:27 12/20/20 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/15/22 Day of week: 20:20:12 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:20:12 165/165/165 Day of week: 45:165:85 165/165/165 Day of week: 45:165:85 15/22/12 Day of week: 45:20:20 165/165/165 Day of week: 3:22:12 58/0/165 Day of week: 45:165:85 165/165/165 Day of week: 27:165:85 7/26/12 Day of week:
        ۴۵:۲۰:۲۰
        Day of week
        من حتی سعی کردم زمان رو دستی وارد کنم و کارایی که گفتین رو هم انجام دادم ولی خروجی مانیتور تغییری نمیکنه
        کلا ماژول خود مختاریه
        در ضمن از اتصال درست سیم ها اطمینان دارم چون یه برنامه دیگه هست واسه خوندون I2C Address که وقتی اجراش میکنم خروجی مانیتور درسته!!

        • با سلام
          تا به حال با این مورد مواجه نشده ام. به نظر میرسد مشکل نرم افزاری باشد. در صورتیکه ماژول ایرادی داشته باشد، دیتایی ارسال نخواهد شد.
          در حال بررسی هستم.

      • با سلام مجدد منDS3231 را با Arduino UNO هم امتحان کردم واسه کامپایل هیچ خطایی نشون نمیده و اینم خروجی مانیتور
        ۱۴:۰۸:۳۷٫۴۶۰ -> Couldn’t find RTC
        ۱۴:۰۹:۰۵٫۵۱۴ -> Couldn’t find RTC
        آیا واقعا DS3231 خرابه؟
        راه پیشنهادی شما چیه؟
        ممنونم

      • سلام مجدد
        ببخشید پشت سر هم مزاحم میشم
        الان یه ویدیو توی یوتیوب پیدا کردم و قدم به قدم حتی با همون ورژن کتابخونه و با استفاده از Arduino UNO سنسور ds3231 رو برنامه ریزی کردم خروجی زیر رو داد
        ۱۹:۱۶:۰۶٫۳۴۵ -> DateTime::TIMESTAMP_FULL: ۲۱۶۵-۱۶۵-۱۶۵T165:165
        ۱۹:۱۶:۰۶٫۳۴۵ -> DateTime::TIMESTAMP_DATE: ۲۱۶۵-۱۶۵-۱۶۵
        ۱۹:۱۶:۰۶٫۳۴۵ -> DateTime::TIMESTAMP_TIME: ۱۶۵:۱۶۵:۸۵
        ۱۹:۱۶:۰۶٫۳۴۵ ->
        ۱۹:۱۶:۰۶٫۳۴۵ ->
        ۱۹:۱۶:۱۰٫۸۹۸ -> RTC is NOT running!
        ۱۹:۱۶:۱۰٫۸۹۸ -> DateTime::TIMESTAMP_FULL: ۲۱۶۵-۱۶۵-۱۶۵T165:165
        ۱۹:۱۶:۱۰٫۸۹۸ -> DateTime::TIMESTAMP_DATE: ۲۱۶۵-۱۶۵-۱۶۵
        ۱۹:۱۶:۱۰٫۸۹۸ -> DateTime::TIMESTAMP_TIME: ۱۶۵:۱۶۵:۸۵
        ۱۹:۱۶:۱۰٫۸۹۸ ->
        ۱۹:۱۶:۱۰٫۸۹۸ ->
        ۱۹:۱۶:۱۵٫۹۰۵ -> DateTime::TIMESTAMP_FULL: ۲۱۶۵-۱۶۵-۱۶۵T165:165
        ۱۹:۱۶:۱۵٫۹۰۵ -> DateTime::TIMESTAMP_DATE: ۲۱۶۵-۱۶۵-۱۶۵
        ۱۹:۱۶:۱۵٫۹۰۵ -> DateTime::TIMESTAMP_TIME: ۱۶۵:۱۶۵:۸۵

        یه جا نوشته rtc is not Runing
        آیا ممکنه که ds3231 کلا خراب باشه؟
        در ضمن باتری کلا نو استفاده کردم

        • با سلام
          در هر لحظه وضعیت ماژول تغییر می‌کند و به نظر میرسد در اتصالات مشکلی باشد. با این وجود احتمال خراب بودن ماژول بسیار کم است و فقط بایستی اتصالات را بررسی کنید.

        • با سلام
          همانطور که اعلام شد با نمایش پیغام عدم شناسایی در اتصالات خطایی وجود دارد و نمیتوان از این طریق بررسی کرد.
          لطفا مجدد تمامی پارامترهای مهم را بررسی و نتیجه را اعلام کنید.

          • با سلام و ممنون از پاسخ هاتون
            من تمامی اتصالات را دوباره چک کردم و دوباره نتایج مشابه گرفتم.

            کد I2C رو هم اجرا کردم درست کار میکنه.
            اینم خروجیش :

            ۱۷:۰۰:۴۱٫۷۰۱ -> Scanning…
            ۱۷:۰۰:۴۱٫۷۰۱ -> I2C device found at address 0x57
            ۱۷:۰۰:۴۱٫۷۰۱ -> done
            ۱۷:۰۰:۴۱٫۷۰۱ ->
            ۱۷:۰۰:۴۶٫۷۱۶ -> Scanning…
            ۱۷:۰۰:۴۶٫۷۱۶ -> I2C device found at address 0x57
            ۱۷:۰۰:۴۶٫۷۱۶ -> done
            ۱۷:۰۰:۴۶٫۷۱۶ ->
            من یه جایی خوندم که اسیلاتور داخل ماژول هم میتونه خراب باشه
            من حس میکنم ۳۲ بیت حافظه داخلی سنسور پر هست و اطلاعانش تغییر نمیکنه
            یه سنسور جدید سفارش دادم که تا ۲ روز دیگه به دستم میرسه
            این دفعه یه DS1307 سفارش دادم
            بررسی میکنم و نتایج را خدمتتون عرض میکنم
            به هر حال ممنون از پیگیری هاتون

          • با سلام ماژول ds1307 را دیروز دریافت و امتحان کردم
            کار می کند و خروجی صحیح می دهد.
            به نظر خود ds3231 ایراد داشته
            با تشکر

  • سلام خانم مهندس؛ من با یک مشکل _ فکر میکنم عجیب_ روبرو شده ام. یک برنامه را برروی یک لپ تاپ نوشتم, رن شد, وبرروی برد اردواینو بدون مشکل کار میدهد. برروی یک لپ تاپ دیگر _ دقیقا با همان سیستم عامل , همان ورژن اردواینو و دقیقا همان کتابخانه ها _ ارور میدهد. ارور ها برروی جملاتی از برنامه ظاهر میشود . رنگ لغت هایی که در این جملات هست غیر عادی ومتفاوت از ان چیزی است که باید باشد ودر لپ تاپ دیگر است. برای مثال درجمله DS3231 clock هردو کلمه به رنگ قرمز است. لطفا راه حلی ارائه بدین.
    با سپاس از شما

  • سلام
    من با ماژول ds1307 این پروژه رو اجرا کردم ولی با وجود اینکه باتری بکاپ داره زمانی که آردوینو خاموش میشه بعد چند ساعت ساعت از تنظیم خارج میشه اگه ماژول رو با ۳۲۱۳ تعویض کنم به نظرتون بهتر هست یا مشکل از جای دیگست؟

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

    • با سلام
      در متن آموزش به همین مورد اشاره شده است. بررسی کنید. همچنین از باتری بک آپ استفاده کنید.