مشروع قياس الوقت الحقيقي اكتب تعليقُا

 تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

مقدمـــــــــة عن المشروع

يتحدث هذا المشروع حول كيفية أستخدام وحدة الوقت الحقيقي مع الاردوينو .

الوقت من الأشياء الثمينة التي لا يجب التفريض فيها لذلك نجد في المشاريع الذكية كلما أرتبطة بالوقت كانت أكثر نفعا من عدمه لذلك أضافة خاصية الوقت لمشروع بعينه تعني تحكم حقيقي في الوقت المطلوب منه , الاردوينو في حد ذاتها يمكن برمجتها كمؤقت زمني يعرض الوقت والتاريخ ولكن ما لا نجده فيها هي عدم مقدرتها بحفظ الوقت والتاريخ عند أنقطاع مصدر الطاقة عنها , لذلك نلجأ لأستخدام وحدة الوقت DS1307 RTC module وهي تحتوي علي بطارية متصلة معها من الخلف بغرض التغذية  عند أنقطاء مصدر الطاقة الرئيسي وبالتالي نحافظ على الوقت والتاريخ من دون تغيير .

هذه الوحدة نجدها متوفر في أجهزة الكمبيوتر وغيرها من الاشياء المرتبطة بالوقت .

متطلبات المشروع

  • Arduino UNO
  • DS1307 RTC module
  • Jumper wires

طريقة العمل والتوصيل

الصور التالي هي صورة وحدة الوقت الحقيقي DS1307 RTC module .

وحدة قياس الوقت تعتمد على برتكول النقل التسلسلي I2C وبالتالي تتصل مع الاردوينو عبر طرفين فقط محددات سلفا في الاردوينو لهذا الغرض . وطريقة ربط مع الاردوينو موضحة أسف الصورة .

يمكنك تنزيل داتاشيت وحدة قياس الوقت من هنــــــا .

rtc-front-and-back-view
Pin Wiring to Arduino Uno
SCL A5
SDA A4
VCC 5V
GND GND

الصورة التالية توضح كيفية ربط المكونات مع بعضها البعض .

rtc
تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.

الكـــــــــــــو البرمـجـــــــــــي

لتعين الوقت والتاريخ الفعلين يتم ضبطهما من خلال الاسطر البرمجية التالية في الكود البرمجي . وهذه المعطيات داخل الصندوق الاحمر تعني الثواني والدقائق وغيرها من مفردات الوقت .

set-the-time

بعد ضبط الوقت الفعلي لديك يمكنك تحميل الكود البرمجي التالي الي الاردوينو .

لتحميل الكود البرمجي اضغط هنا
// 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
}

بعد رفع الكود الي الاردوينو يمكنك فتح شاشة السيريل مونتر لعرض الوقت والتاريخ الفعليين كما بالتالي .

demonstration

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *