سلام خیلی خوشحالم که بار دیگه توی این سایت میبینمتون. امروز قراره باهم با چیزایی که بلدیم ساعت دیجیتال بسازیم.
معمولاً ابتدای هر آموزش ابتدا درمورد وسیله موردنظر صحبت میکردیم ولی خوشبختانه حداقل امروز لازم نیست درمورد موضوع صحبت کنیم آخه موضوع امروز را همه بلدیم و نیاز به صحبت نیست.
خب قرار شد که با چیزهایی که بلدیم یه ساعت دیجیتال بسازیم. چیزهایی که ما لازم داریم عبارتست از: برد محبوب آردوینو (که اونقدر درموردش قبلاً مطلب نوشتیم که دیگه لازم به توضیح نیست)، ماژول های RTC و اگه دوست دارید یک ال سی دی اگر هم نه که میتوانید از ترمینال آردوینو برای نمایش خروجی استفاده کنید. ماژول های RTC (Real Time Clock) زمان و تاریخ دقیق را به ما میدهد و در انواع و اقسام مختلف وجود دارد. که یکی از معروف ترین های آن DS3231 است که در ادامه توضیح میدهیم.
تراشه DS3231
در ماژول ساعت این تراشه نقش اساسی را ایفا میکند یعنیتوابع رمانی را مدیریت میکند و از ارتباط i2c استفاده میکند. این تراشه علاوه ساعت و دقیقه و ثانیه تاریخ را هم نشان میدهد و تاریخ را برای ماه های 31 روزه را تنظیم میکند. در این ماژول، ساعت در دو فرمت 12 ساعت و 24 ساعت کار میکند و دارای علامت AM و PM است. به علاوه، امکان دو آلارم قابل برنامهریزی در روز را فراهم میسازد.
البته اگر قبلا با ماژول های ساعت آشنایی داشته باشید با یکی دیگر از این ماژول ها یعنی DS1307 باید آشنا باشید این ماژول هم مشابه ماژول DS3231 است البته با این تفاوت که این ماژول دقت پائین تری است به این صورت که ماژول DS1307 برای نگهداری زمان، دارای یک کریستال 32kHz خارجی است که فرکانس نوسان آن بهراحتی با دمای خارجی تغییر میکند و این باعث میشود که ساعت 5 دقیقه یا بیشتر در ماه عقب بیافتد. اما، ماژول DS3231 در مقایسه با ماژول DS1307 بسیار دقیقتر است، زیرا دارای یک کریستال داخلی با جبرانساز دما (TCXO) است که تغییر دما بر روی آن اثر نمیگذارد و باعث میشود خطای ماژول حداکثر چند دقیقه در سال باشد.
در بخش پایینی برد، یک نگهدارنده باطری برای باطری دکمهای لیتیم 22V – 3V میلیمتری وجود دارد که مناسب باطریهای CR2032 است.
یک باطری CR2032 کاملا شارژ شده با ظرفیت 220mAh با جریان مصرفی 3μA را در نظر بگیرید. این باطری میتواند برای حداقل 8 سال RTC را روشن نگه دارد، بدون اینکه نیاز به تغذیه 5V خارجی داشته باشد.
220mAh/3µA = 73333.34 hours = 3055.56 days = 8.37 years
این ماژول دارای یک حافظه 32 بایتی EEPROM است که میتوان تنظیمات را در آن ذخیره کرد. و از پروتکل ارتباطی i2c پشتیبانی میکند که در پست های بعدی درمورد این پروتکل ارتباطی بیشتر صحبت میکنیم.
راه اندازی با آردوینو
ابتدای امر باید به مانند هر ماژول دیگری کتابخانه موردنظر را در برنامه آردوینو نصب کنیم برای نصب کتابخانه هم کافیست که در قسمت library در نرم افزار آردوینو کلمه RTCLib را سرچ کنید. مطابق شکل زیر عمل کنید.
و در ادامه نحوه نصب کتابخانه را مشاهده می کنید.
برنامه نویسی آردوینو
کدهای زیر درک کلی از نحوه تنظیم و خواندن تاریخ و زمان در ماژول DS3231 به شما میدهد که میتوانید در بسیاری از پروژههای خود از ان استفاده کنید. نمونه ای کوچک از این کد را مشاهده می کنید
void loop () { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println();
}
توضیحات کد
دستورات با فراخوانی کتابخانههای wire.h و RTClib.h برای ارتباط با ماژول شروع میشود. در مرحله بعد، باید یک شئ از کتابخانه RTClib ایجاد کنید و یک آرایه کاراکتری دو بعدی daysOfTheWeek برای ذخیره اطلاعات مربوط به روزها تعریف نمایید.
در بخشهای Setup و Loop دستورات نیز، باید از توابع زیر برای ارتباط با ماژول استفاده کنید:
begin () : کار این تابع این است که از اتصال RTC مطمئن شود.
lostPower(): این تابع رجیسترهای داخلی I2C ماژول DS3231 را میخواند تا مطمئن شود که آیا تراشه، زمان را دنبال میکند یا نه. اگر این تابع مقدار True برگرداند، شما میتوانید تاریخ و زمان را تنظیم کنید.
adjust(): این تابع تاریخ و ساعت را تنظیم میکند و یک تابع overload میباشد. روشهای فراخوانی این تابع به شکل زیر است:
- استفاده از دستور DateTime(F(__DATE__), F(__TIME__)) که تاریخ و زمان کامپایل شدن را تنظیم میکند.
- استفاده از دستور DateTime(YYYY, M, D, H, M, s) برای تنظیم RTC با تاریخ و زمان تفکیک شده. برای مثال برای تنظیم تاریخ 27 ژانویه 2017 در ساعت 12:56 باید به این شکل عمل کنید: ;rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0))
now() : این تابع تاریخ و زمان جاری را برمیگرداند. مقدار بازگشتی معمولا در یک متغیر از نوع داده DateTime ذخیره میشود.
year() : این تابع سال جاری را برمیگرداند.
month(): این تابع ماه جاری را برمیگرداند.
day() : این تابع روز جاری را برمیگرداند.
dayOfTheWeek() : این تابع روز جاری در هفته را برمیگرداند و معمولا به عنوان ایندکس یک آرایه دو بعدی استفاده میشود که اطلاعات روزها را ذخیره میکند. نمونه آن را میتوانید در برنامه بالا ببینید.
hour() : این تابع ساعت جاری را برمیگرداند.
minute() : این تابع دقیقههای جاری را برمیگرداند.
second() : این تابع ثانیههای جاری را برمیگرداند.
خلاصه که این ماژول کلی امکانات دارد و در پروژه هایی که زمان برای ما مهم است میتوان با خیال راحت از آن استفاده کردو در ادامه این آموزش میتوان داده ها را بر روی یک LCD کاراکتری یا یک OLED نمایش داد که در پست های قبلی سایت مفصل راجه به آنها صحبت شده است. از آنجایی که در پروژه های اینترنت اشیاء زمان برای ما اهمیت ویژهای دارد میتوان از این ماژول و این آموزش استفاده کرد.