مقدمـــــــــة عن المشروع
يتحدث هذا المشروع حول كيفية أستخدام وحدة الوقت الحقيقي مع الاردوينو .
الوقت من الأشياء الثمينة التي لا يجب التفريض فيها لذلك نجد في المشاريع الذكية كلما أرتبطة بالوقت كانت أكثر نفعا من عدمه لذلك أضافة خاصية الوقت لمشروع بعينه تعني تحكم حقيقي في الوقت المطلوب منه , الاردوينو في حد ذاتها يمكن برمجتها كمؤقت زمني يعرض الوقت والتاريخ ولكن ما لا نجده فيها هي عدم مقدرتها بحفظ الوقت والتاريخ عند أنقطاع مصدر الطاقة عنها , لذلك نلجأ لأستخدام وحدة الوقت DS1307 RTC module وهي تحتوي علي بطارية متصلة معها من الخلف بغرض التغذية عند أنقطاء مصدر الطاقة الرئيسي وبالتالي نحافظ على الوقت والتاريخ من دون تغيير .
هذه الوحدة نجدها متوفر في أجهزة الكمبيوتر وغيرها من الاشياء المرتبطة بالوقت .
متطلبات المشروع
- Arduino UNO
- DS1307 RTC module
- Jumper wires
-
-
-
-
اردوينو, جميع المنتجات
وحدة ساعة الوقت الحقيقي DS1307 RTC بدون بطارية Real Time Clock
لمحة سريعة
- جهد التشغيل: 5 فولت
- اثنين من واجهة الأسلاك I2C
- الساعة: الدقائق: الثواني ص / م
- تعويض السنة الكبيسة
- تقويم دقيق حتى عام 2100
- يستهلك أقل من 500nA
- بدون بطارية
للاطلاع على فكرة مشروع تناسبك على برمجة واستخدام هذا المنتج
SKU: NA318
طريقة العمل والتوصيل
الصور التالي هي صورة وحدة الوقت الحقيقي DS1307 RTC module .
وحدة قياس الوقت تعتمد على برتكول النقل التسلسلي I2C وبالتالي تتصل مع الاردوينو عبر طرفين فقط محددات سلفا في الاردوينو لهذا الغرض . وطريقة ربط مع الاردوينو موضحة أسف الصورة .
يمكنك تنزيل داتاشيت وحدة قياس الوقت من هنــــــا .
Pin | Wiring to Arduino Uno |
SCL | A5 |
SDA | A4 |
VCC | 5V |
GND | GND |
الصورة التالية توضح كيفية ربط المكونات مع بعضها البعض .
الكـــــــــــــو البرمـجـــــــــــي
لتعين الوقت والتاريخ الفعلين يتم ضبطهما من خلال الاسطر البرمجية التالية في الكود البرمجي . وهذه المعطيات داخل الصندوق الاحمر تعني الثواني والدقائق وغيرها من مفردات الوقت .
بعد ضبط الوقت الفعلي لديك يمكنك تحميل الكود البرمجي التالي الي الاردوينو .
لتحميل الكود البرمجي اضغط هنا
// Written by John Boxall from https://tronixstuff.com #include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val){ return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val){ return( (val/16*10) + (val%16) ); } void setup(){ Wire.begin(); Serial.begin(9600); // set the initial time here: // DS3231 seconds, minutes, hours, day, date, month, year setDS3231time(30,42,16,5,13,10,16); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) Wire.write(decToBcd(month)); // set month Wire.write(decToBcd(year)); // set year (0 to 99) Wire.endTransmission(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void displayTime(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10){ Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10){ Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } } void loop(){ displayTime(); // display the real-time clock data on the Serial Monitor, delay(1000); // every second }
بعد رفع الكود الي الاردوينو يمكنك فتح شاشة السيريل مونتر لعرض الوقت والتاريخ الفعليين كما بالتالي .