آیا تا به حال به این موضوع فکر کردهاید که چه چیزی ساعت کامپیوتر یا تلفن همراه شما را همیشه تنظیم و دقیق نگهمیدارد؟ آیا قطعه خاصی وظیفه تنظیم دقیق ساعت را به عهده دارد؟
در پاسخ به این سوال باید بگوییم بله، قطعهای به نام ماژول RTC این وظیفه را به عهده دارد، این ماژول انواع و اقسام مختلفی دارد و یکی از آنها ماژول ساعت DS3231 است که در این بلاگ قصد داریم مفصل درباره راه اندازی ماژول ساعت DS3231 صحبت کنیم.
پس اگر میخواهید با نحوه راهاندازی این ماژول و قطعات آن آشنا شوید تا انتهای این بلاگ با ما باشید.
ماژول ساعت فوق دقیق DS3231
ماژول RTC انواع و اقسام مختلفی دارد که ماژول ساعت DS3231 یکی از پرکاربرترین آنهاست، ماژولی بسیار دقیق با توان مصرفی پایین است که برای تنظیم ساعت از آن استفاده میشود. این ماژول قادر است تا اطلاعات مربوط به روز، ساعت، دقیقه، ثانیه و حتی ماه و سال را نگهداری کند و بر اساس سال کبیسه بودن یا نبودن تنظیم میشود.
سخت افزار
ماژول ساعت DS3231بسیار قوی است و دارای یک رابط دو سیمه C12 است که به راحتی میتواند با هر میکروکنترلری ارتباط برقرار کند و در پروژههای دیگر برای اندازهگیری دقیق زمان از آن استفاده میشود. این ماژول برای ایجاد زمان از کریستال خارجی ۳۲٫۷۶۸ Khz استفاده میکند که امروزه به دلیل نامرغوب بودن این کریستالها فرکانس آنها همیشه کمی متفاوت است. این تغییر کوچک گاهی اوقات باعث اختلاف در اندازهگیری زمان واقعی میشود .
این ماژول دارای دو فرمت ساعت 12 ساعته و 24 ساعته است که بر اساس منطقه مورد نظر تنظیم خواهد شد.
برای تهیه و خرید انواع ماژول کلیک با بهترین قیمت کلیک کنید.
DS3231 RTC Chip
یک chip یا تراشه بسیار دقیقی در مرکز ماژول وجود دارد که یکی از مهمترین قطعات برای راه اندازی ماژول ساعت DS3231 است. این تراشه میتواند همه توابع زمانی را مدیریت کند و به وسیله رابط دو سیم c12 به راحتی به هر میکروکنترلری وصل میشود، chipتوسط شرکت maxin ساخته شده است.
یکی دیگر از مهمترین ویژگیهای این تراشه نگهداری ثانیه، دقیقه، ساعت، روز، ماه و سال بوده و دارای قالب 12 ساعته و 24 ساعته است. از ویژگیهای جالب این تراشه میتوان به پایه SQW آن اشاره کرد، این پایه خروجی مربعی شکلی دارد و فرکانسهای مختلفی را پشتیبانی میکند. از این پایه میتوان برای وقفه ناشی از آلارم در کاربردهای مبتنی بر زمان استفاده کرد.
TCXO
در بیشتر ماژولهای RTC یک کریستال 32 هرتز برای محاسبه زمان وجود دارد که دمای خارجی میتواند بر فرکانس و نوسان آن تاثیر بگذارد. این تغییر فرکانس شاید در ابتدا کم به نظر برسد اما مجموعهای از این خطاها دیگر کم و ناچیز نخواهد بود.
برای جلوگیری از چنین خطاهایی در راه اندازی ماژول ساعت DS3231از یک اسیلاتور کریستال 32 کیلوهرتز و TCXO استفاده میکنند، تا نسبت به تغییرات دمای بیرون در امان باشد.
TCXO داخل تراشه RTC قرار میگیرد و حجم آن را افزایش میدهد.
Onboard 24C32 EEPROM
ماژول ساعت DS3231دارای حافظه 32 بایتی(24C32 EEPROM) است که توسط شرکت Atmel ساخته شده و توانایی خواندن و نوشتن نامحدودی دارد. از این حافظه میتوان برای ذخیره کردن تنظیمات و هر اطلاعات دیگری استفاده کرد.
این حافظه برای تبادل اطلاعات از واسط c12 استفاده میکند و باس این حافظه همان باس راه اندازی ماژول ساعت DS3231است. برای تغییر آدرس واسط c12 در حافظه این ماژول باید3 جامپر لحیم شده A0,A1,A2 در پشت برد استفاده کنید، هر یک از پدهای پشت برد حافظه برای تغییر آدرس استفاده میشوند و با استفاده از لحیم پایه کوتاه میتوان آنها را ثابت کرد.
این سه بیت در انتهای آدرس c12 و در 7 بیت آخر قرار میگیرند، هر یک از این سه ورودی دو حالت میگیرد و به راحتی میتوانید برای 8 آدرس مختلف از آن استفاده کنید.
بکاپ باتری
ماژول ساعت DS3231 دارای یک ورودی باطری است و زمانی که تغذیه اصلی مدار قطع شود میتواند ساعت را دقیق نگهدارد. مداری در تغذیه داخلی وجود دارد که وضعیت vcc را دائما بررسی میکند و زمانی که تغذیه اصلی به هر دلیلی قطع شود به طور اتوماتیک تغذیه پشتیبان را وارد مدار میکند و مانع عقب ماندن ساعت میشود، به همین دلیل نیازی نیست نگران قطعی برق باشید.
در قسمت پایین برد یک نگهدارنده باطری وجود دارد که دارای باطری دکمهای لیتیم 22V – 3V میلیمتری بوده و برای باطریهای CR2032 بسیار مناسب است.
پایهها
هر ماژول ساعت DS3231 دارای 6 پایه است:
- پایه SCL که پایه کلاک سریال برای ارتباط c12 است.
- پایه VCC که به عنوان تغذیه ماژول شناخته میشود و دارای ولتاژ 3.3 ولت تا 5.5 ولت است.
- پایه GND که با عنوان پایه زمین مدار شناخته میشود.
- پایه SDA که با نام پایه سریال برای ارتباط C12 است.
- پایه SQW که با عنوان پایه موج مربعی شناخته میشود و قابلیت برنامهریزی دارد و دارای فرکانسهای 1، 4، 8 و 32 هرتز است.
- پایه 33K یک خروجی مرجع، دقیق و پایدار است.
راه اندازی ماژول DS3231 با آردوینو
برای راه اندازی ماژول ساعت DS3231 با آردوینو ابتدا باید قطعات مورد نیاز را بشناسید:
قطعههای مورد نیاز
- ماژول ساعت DS3231
- ماژول ساعت DS1307
- ماژول آردوینو UNO
- کابل USB نری نوع A به نری نوع B
- مینی برد بورد 400 سوراخ
- سیم جامپر نری به نری
شما میتوانید تمام قطعات ذکرشده را از فروشگاه جم ترونیک خریداری کنید.
اتصال پایهها
برای راه اندازی ماژول ساعت DS3231با آردوینو باید پایه VCC را به خروجیV5 آردوینو وصل کنید و پایه GND را به زمین متصل کنید. هر برد آردوینو پایههای I2C متفاوتی دارد و در زمان نصب و راه اندازی آن باید به این پایهها دقت کنید. چرا که یک اشتباه کوچک میتواند خسارت بسیاری به همراه داشته باشد.
روی بردهای آردوینو پایههای SDA و SCL ماژول ساعت DS3231درست روی پین هدر نزدیک پایه AREF قرار گرفته است. البته این پایهها مربوط به آردوینو R3 است و برای برد آردوینو Mega این پایهها کمی متفاوت است، در این آردوینو باید از پایههای دیجیتال SDA20 و SCL 21 استفاده میکنند.
کدنویسی
کدهای زیر نشان دهنده نحوه تنظیم و خواندن ساعت و تاریخ توسط این ماژول است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
#include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; void setup () { Serial.begin(9600); delay(3000); // wait for console opening if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); // Comment out below lines once you set the date & time. // Following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Following line sets the RTC with an explicit date & time // for example to set January 27 2017 at 12:56 you would call: // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0)); } } void loop () { DateTime now = rtc.now(); Serial.println("Current Date & Time: "); 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(); Serial.println("Unix Time: "); Serial.print("elapsed "); Serial.print(now.unixtime()); Serial.print(" seconds/"); Serial.print(now.unixtime() / 86400L); Serial.println(" days since 1/1/1970"); // calculate a date which is 7 days & 30 seconds into the future DateTime future (now + TimeSpan(7,0,0,30)); Serial.println("Future Date & Time (Now + 7days & 30s): "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(1000); } |
توضیح کد
توابعی که در ادامه به معرفی آنها میپردازیم در بخشهای Setup و Loop برای ارتباط با ماژول استفاده میشوند:
begin : وظیفه اطمینان از اتصال RTC به عهده این تابع است.
LostPower: این تابع وظیفه خواندن رجیسترهای داخلی I2C ماژول را به عهده دارد و باید از این موضوع مطمئن شود که آیا تراشه، زمان را دنبال میکند یا خیر؟
Adjust: تنظیم ساعت و تاریخ به عهده تابع Adjust است، روشهای فراخوانی این تابع به شکل زیر است:
Now: این تابع توانایی آن را دارد تا تاریخ و زمان جاری را برمیگرداند.
Year: این تابع سال جاری را برمیگرداند.
Month: این تابع ماه جاری را برمیگرداند.
Day: این تابع روز جاری را برمیگرداند.
DayOfTheWeek: این تابع روز جاری در هفته را برمیگرداند و اطلاعات روزها را ذخیره میکند.
Hour: این تابع ساعت جاری را برمیگرداند.
Minute: این تابع دقیقههای جاری را برمیگرداند.
Second: این تابع ثانیههای جاری را برمیگرداند.
TimeSpan: از این تابع برای اضافه کردن زمان به زمان جاری یا کم کردن زمان از زمان جاری استفاده میشود.
استفاده از OLED برای نمایش زمان با ماژول ساعت DS3231
ماژول ساعت DS3231 بسیار پیشرفتهتر از DS1307 است، این ماژول علاوه بر امکانات پیشرفتهای که دارد دارای دقت بالاتری است. برای استفاده از این ماژول باید ابتدا با توابع آن آشنا شوید:
توابع مورد نیاز برای نمایش زمان
توابع مورد نیاز برای نمایش زمان در ماژول ساعت DS3231عبارتنداز:
- RTCDateTime: از این تابع برای دسترسی به مقادیر داخل ساعت استفاده میکنیم.
- clock.begin: این تابع فقط به وسیلهی تابع فوق ماژول ساعتds3231 فعال میشود.
- clock.setDateTime (__DATE__, __TIME__): با کمک این تابع ساعت و تاریخ ماژول را تنظیم میشود و برنامه را طوری تنظیم میکند که روی آردوینو به طور خودکار ساعت ماژول با ساعت کامپیوتر تنظیم خواهد شد و دیگر نیازی به تنظیم دستی نیست.
- clock.getDateTime: زمان و تاریخ را به کمک این تابع از ماژول دریافت میکنند.
- clock.readTemperature: مقدار دمای اندازهگیری شده توسط ماژول با این تابع نمایش داده میشود.
کدنویسی
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
#include <Wire.h> #include <DS3231.h> #include <U8glib.h> #include <Bounce2.h> //ایجاد یک آبجکت از کتابخانه U8Glib U8GLIB_SH1106_128X64 u8g (U8G_I2C_OPT_NONE); //ایجاد میکنیمBounceیک آبجکت از کتابخانه Bounce debouncer = Bounce (); //ds3231ایجاد یک آبجکت از کلاس DS3231 clock; //ds3231موجود در کتابخانه Structایجاد یک آبجکت از RTCDateTime dt; #define BUTTON_PIN 2 char date[36]; char time[15]; char readtemp[10]; char temp[20]; int i = 0; void setup () { u8g.setFont (u8g_font_timB10); u8g.setColorIndex (1); Serial.begin (9600); // Initialize DS3231 Serial.println ("Initialize DS3231");; clock.begin (); // تنظیم ماژول ساعت با ساعت کامپیوتر clock.setDateTime (__DATE__, __TIME__); // تنظیم پین متصل به کلید به عنوان پول آپ خارجی pinMode (BUTTON_PIN, INPUT_PULLUP); // After setting up the button, setup the Bounce instance : debouncer.attach (BUTTON_PIN); debouncer.interval (100); } void loop () { // dt = clock.getDateTime (); debouncer.update (); if ( debouncer.fell () ) { i++; } if ( i == 4 ) { i = 0; } if ( i == 0 ) { drawAll (); } else if ( i == 1 ) { drawTime (); } else if ( i == 2 ) { drawDate (); } else if ( i == 3 ) { drawTemperature (); } Serial.print ("Raw data: "); Serial.print (dt.year); Serial.print ("-"); Serial.print (dt.month); Serial.print ("-"); Serial.print (dt.day); Serial.print (" "); Serial.print (dt.hour); Serial.print (":"); Serial.print (dt.minute); Serial.print (":"); Serial.print (dt.second); Serial.println (""); } تاابع نمایش تمام مقادیر ساعت تاریخ و دما void drawAll () { u8g.firstPage (); do { u8g.setFont (u8g_font_7x14); sprintf (date, "%d / %d / %d ", dt.year, dt.month, dt.day, dt.hour, dt.month, dt.second); u8g.setPrintPos (5, 22); u8g.print (date); sprintf (time, "%d : %d : %d", dt.hour, dt.minute, dt.second); u8g.setPrintPos (5, 40); u8g.print (time); u8g.setPrintPos (5, 62); dtostrf (clock.readTemperature (), 4, 2, readtemp); sprintf (temp, "Temperature:%s", readtemp); Serial.println (temp); u8g.print (temp); } while ( u8g.nextPage () ); } تابع نمایش زمان به صورت تکی بر روی صفحه نمایش void drawTime () { u8g.firstPage (); do { u8g.setFont (u8g_font_fur20r); sprintf (time, "%d:%d:%d", dt.hour, dt.minute, dt.second); u8g.drawStr (25, 20, "Time"); u8g.setPrintPos (10, 50); u8g.print (time); } while ( u8g.nextPage () ); } //تابع نمایش تاریخ به صورت تکی بر روی صفحه نمایش void drawDate () { u8g.firstPage (); do { u8g.setFont (u8g_font_fur20r); u8g.drawStr (25, 20, "Date"); u8g.setFont (u8g_font_courR10r); sprintf (date, "%d/%d/%d ", dt.year, dt.month, dt.day); u8g.setPrintPos (15, 50); u8g.print (date); } while ( u8g.nextPage () ); } //تابع نمایش دما به صورت تکی بر روی صفحه نمایش void drawTemperature () { u8g.firstPage (); do { u8g.setFont (u8g_font_10x20); u8g.drawStr (2, 20, " Temperature"); u8g.setFont (u8g_font_courB18r); u8g.setPrintPos (28, 60); dtostrf (clock.readTemperature (), 4, 2, readtemp); sprintf (temp, "%s", readtemp); Serial.println (temp); u8g.print (temp); } while ( u8g.nextPage () ); } |
جمعبندی
زمان یکی از مهمترین مواردی در دنیای دیجیتال و الکترونیک است. برای اجرای درست پروژههای الکترونیک زمان بسیار مهم است و باید به درستی تنظیم شود، معمولا تنظیم ساعت در کامپیوتر و گوشی به عهده ماژول است که با توجه به عملکرد و ویژگیهایشان، انواع مختلفی دارند. در این بلاگ به این موضوع پرداختیم که راه اندازی ماژول ساعت DS3231 چگونه است و برای انجام این کار به چه قطعاتی نیاز دارید. ما همواره سعی میکنیم کاملترین و بهترین آموزشها را برایتان فراهم کنید. پیشنهاد میکنیم برای مطالعه مقالههای بیشتر به مجله جم ترونیک سر بزنید. همچنین برای تهیه و خرید قطعات الکترونیکی کلیک کنید.