جدول المحتويات:

استخدام وحدات ساعة الوقت الحقيقي DS1307 و DS3231 مع Arduino: 3 خطوات
استخدام وحدات ساعة الوقت الحقيقي DS1307 و DS3231 مع Arduino: 3 خطوات

فيديو: استخدام وحدات ساعة الوقت الحقيقي DS1307 و DS3231 مع Arduino: 3 خطوات

فيديو: استخدام وحدات ساعة الوقت الحقيقي DS1307 و DS3231 مع Arduino: 3 خطوات
فيديو: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, شهر نوفمبر
Anonim
استخدام وحدات الساعة في الوقت الحقيقي DS1307 و DS3231 مع Arduino
استخدام وحدات الساعة في الوقت الحقيقي DS1307 و DS3231 مع Arduino
استخدام وحدات الساعة في الوقت الحقيقي DS1307 و DS3231 مع Arduino
استخدام وحدات الساعة في الوقت الحقيقي DS1307 و DS3231 مع Arduino

نستمر في تلقي طلبات حول كيفية استخدام وحدات الساعة في الوقت الفعلي DS1307 و DS3231 مع Arduino من مصادر مختلفة - لذلك هذا هو الجزء الأول من برنامج تعليمي مكون من جزأين حول كيفية استخدامها. في هذا البرنامج التعليمي من Arduino ، لدينا وحدتان للساعة في الوقت الفعلي لاستخدامهما ، واحدة تستند إلى Maxim DS1307 (الوحدة النمطية المربعة) و DS3231 (الوحدة المستطيلة).

هناك اختلافان رئيسيان بين الدوائر المتكاملة على وحدات ساعة الوقت الحقيقي ، وهما دقة حفظ الوقت. يعمل DS1307 المستخدم في الوحدة الأولى بشكل جيد جدًا ، ومع ذلك يمكن أن تؤثر درجة الحرارة الخارجية على تردد دائرة المذبذب التي تدفع العداد الداخلي لـ DS1307.

قد يبدو هذا وكأنه مشكلة ، ولكن عادة ما ينتج عن ذلك مع إيقاف تشغيل الساعة بحوالي خمس دقائق أو نحو ذلك في الشهر. يعتبر DS3231 أكثر دقة ، حيث يحتوي على مذبذب داخلي لا يتأثر بالعوامل الخارجية - وبالتالي فهو دقيق حتى بضع دقائق كل عام على الأكثر. إذا كانت لديك وحدة DS1307 - فلا تشعر بالسوء ، فهي لا تزال لوحة ذات قيمة رائعة وستخدمك جيدًا. مع كل من الوحدتين ، يلزم وجود بطارية احتياطية.

إنها لفكرة جيدة أن تشتري بطارية CR2032 جديدة وتناسبها مع الوحدة. إلى جانب تتبع الوقت والتاريخ ، تحتوي هذه الوحدات أيضًا على EEPROM صغير ، ووظيفة إنذار (DS3231 فقط) والقدرة على إنشاء موجة مربعة من الترددات المختلفة - وكلها ستكون موضوع درس تعليمي ثان.

الخطوة 1: توصيل الوحدة النمطية الخاصة بك بـ Arduino

تستخدم كلتا الوحدتين ناقل I2C ، مما يجعل الاتصال سهلاً للغاية.

ستحتاج أولاً إلى تحديد المسامير الموجودة على Arduino أو اللوحات المتوافقة المستخدمة في ناقل I2C - وستعرف باسم SDA (أو البيانات) و SCL (أو الساعة). في Arduino Uno أو اللوحات المتوافقة ، تكون هذه المسامير A4 و A5 للبيانات والساعة ؛ في Arduino Mega ، تكون المسامير D20 و D21 للبيانات والساعة ؛ وإذا كنت تستخدم Pro Mini متوافقًا ، فإن الدبابيس هي A4 و A5 للبيانات والساعة الموازية للدبابيس الرئيسية.

وحدة DS1307

إذا كانت لديك وحدة DS1307 ، فستحتاج إلى لحام الأسلاك باللوحة ، أو لحام بعض دبابيس الرأس المضمنة حتى تتمكن من استخدام أسلاك التوصيل. ثم قم بتوصيل دبابيس SCL و SDA بـ Arduino الخاص بك ، ودبوس Vcc إلى دبوس 5V و GND بـ GND.

وحدة DS3231

يعد توصيل هذه الوحدة أمرًا سهلاً حيث يتم تثبيت دبابيس الرأس على اللوحة في المصنع. يمكنك ببساطة تشغيل أسلاك التوصيل مرة أخرى من SCL و SDA إلى Arduino ومرة أخرى من دبابيس Vcc و GND للوحدة إلى 5V أو 3.3. V و GND باللوحة. ومع ذلك يتم تكرارها على الجانب الآخر من أجل لحام الأسلاك الخاصة بك. تحتوي كلتا الوحدتين على مقاومات السحب المطلوبة ، لذلك لا تحتاج إلى إضافة مقاوماتك الخاصة. مثل جميع الأجهزة المتصلة بحافلة I2C ، حاول الحفاظ على طول أسلاك SDA و SCL عند الحد الأدنى.

الخطوة 2: قراءة وكتابة الوقت من وحدة RTC النمطية الخاصة بك

بمجرد الانتهاء من توصيل وحدة RTC الخاصة بك. أدخل وتحميل الرسم التالي. على الرغم من أن الملاحظات والوظائف في المخطط تشير فقط إلى DS3231 ، فإن الكود يعمل أيضًا مع DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // تحويل الأرقام العشرية العادية إلى ثنائي بايت decToBcd (بايت val) {return ((val / 10 * 16) + (val٪ 10)) ؛ } // تحويل ثنائي عشري مشفر إلى بايت bcdToDec (قيمة بايت) {return ((val / 16 * 10) + (val٪ 16))؛ } void setup () {Wire.begin ()؛ Serial.begin (9600) ؛ // اضبط الوقت الأولي هنا: // DS3231 ثانية ، دقائق ، ساعات ، يوم ، تاريخ ، شهر ، سنة // setDS3231time (30 ، 42 ، 21 ، 4 ، 26 ، 11 ، 14) ؛ } مجموعة فارغة DS3231time (بايت ثانية ، بايت دقيقة ، بايت ساعة ، بايت يوم أسبوع ، بايت يوم أو شهر ، بايت شهر ، بايت سنة) {// يعين بيانات الوقت والتاريخ إلى DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) ؛ Wire.write (0) ؛ // قم بتعيين الإدخال التالي للبدء في تسجيل الثواني Wire.write (decToBcd (الثاني)) ؛ // ضبط الثواني Wire.write (decToBcd (دقيقة)) ؛ // ضبط دقائق Wire.write (decToBcd (ساعة)) ؛ // ضبط ساعات Wire.write (decToBcd (dayOfWeek)) ؛ // تعيين يوم من الأسبوع (1 = الأحد ، 7 = السبت) Wire.write (decToBcd (dayOfMonth)) ؛ // تعيين التاريخ (من 1 إلى 31) Wire.write (decToBcd (شهر)) ؛ // تعيين الشهر Wire.write (decToBcd (السنة)) ؛ // تعيين السنة (من 0 إلى 99) Wire.endTransmission () ؛ } قراءة DS3231 باطلة (بايت * ثانية ، بايت * دقيقة ، بايت * ساعة ، بايت * يوم من الأسبوع ، بايت * يوم شهر ، بايت * شهر ، بايت * سنة) {Wire.beginTransmission (DS3231_I2C_ADDRESS) ؛ Wire.write (0) ؛ // قم بتعيين مؤشر التسجيل DS3231 على 00h Wire.endTransmission () ؛ Wire.request From (DS3231_I2C_ADDRESS، 7) ؛ // طلب سبعة بايت من البيانات من DS3231 بدءًا من السجل 00h * second = bcdToDec (Wire.read () & 0x7f) ؛ * دقيقة = bcdToDec (Wire.read ()) ؛ * ساعة = bcdToDec (Wire.read () & 0x3f) ؛ * dayOfWeek = bcdToDec (Wire.read ()) ؛ * dayOfMonth = bcdToDec (Wire.read ()) ؛ * الشهر = bcdToDec (Wire.read ()) ؛ * السنة = bcdToDec (Wire.read ()) ؛ } void displayTime () {بايت ثانية ، دقيقة ، ساعة ، dayOfWeek ، dayOfMonth ، شهر ، سنة ؛ // استرداد البيانات من DS3231 readDS3231time (& second ، & minutes ، & hour ، & dayOfWeek ، & dayOfMonth ، & month ، & year) ؛ // أرسلها إلى الشاشة التسلسلية Serial.print (ساعة ، DEC) ؛ // تحويل متغير البايت إلى رقم عشري عند عرضه Serial.print (":") ؛ إذا (دقيقة <10) {Serial.print ("0") ؛ } Serial.print (minutes، DEC)؛ Serial.print (":") ؛ إذا (الثانية <10) {Serial.print ("0") ؛ } Serial.print (ثانيًا ، ديسمبر) ؛ Serial.print ("") ؛ Serial.print (dayOfMonth ، ديسمبر) ؛ Serial.print ("/") ؛ Serial.print (الشهر ، ديسمبر) ؛ Serial.print ("/") ؛ Serial.print (السنة ، ديسمبر) ؛ Serial.print ("يوم من الأسبوع:") ؛ switch (dayOfWeek) {الحالة 1: Serial.println ("الأحد") ؛ استراحة؛ الحالة 2: Serial.println ("الاثنين") ؛ استراحة؛ الحالة 3: Serial.println ("الثلاثاء") ؛ استراحة؛ الحالة 4: Serial.println ("الأربعاء") ؛ استراحة؛ الحالة 5: Serial.println ("الخميس") ؛ استراحة؛ الحالة 6: Serial.println ("Friday") ؛ استراحة؛ الحالة 7: Serial.println ("Saturday") ؛ استراحة؛ }} void loop () {displayTime ()؛ // عرض بيانات ساعة الوقت الفعلي على جهاز العرض التسلسلي ، تأخير (1000) ؛ // كل ثانية }

قد يكون هناك الكثير من التعليمات البرمجية ، ولكنها تتفكك جيدًا إلى أجزاء يمكن التحكم فيها.

يتضمن أولاً مكتبة Wire ، التي تُستخدم لاتصالات ناقل I2C ، متبوعًا بتحديد عنوان الناقل لـ RTC كـ 0x68. ويتبع ذلك وظيفتان تقومان بتحويل الأرقام العشرية إلى BCD (نظام عشري ثنائي الترميز) والعكس صحيح. هذه ضرورية لأن ICs RTC تعمل في BCD وليس عشريًا.

يتم استخدام وظيفة الضبط DS3231time () لضبط الساعة. استخدامه سهل للغاية ، أدخل القيم من سنة إلى ثانية ، وسيبدأ RTC من ذلك الوقت. على سبيل المثال ، إذا كنت تريد تعيين التاريخ والوقت التاليين - الأربعاء 26 نوفمبر 2014 و 9:42 مساءً و 30 ثانية - فستستخدم:

setDS3231time (30 ، 42 ، 21 ، 4 ، 26 ، 11 ، 14) ؛

الخطوه 3:

لاحظ أنه تم ضبط الوقت باستخدام التوقيت بتنسيق 24 ساعة ، والمُحدِّد الرابع هو "يوم الأسبوع". يقع هذا بين 1 و 7 من الأحد إلى السبت على التوالي. هذه المعلمات هي قيم بايت إذا كنت تقوم بإدخال المتغيرات الخاصة بك.

بمجرد تشغيل الوظيفة بمجرد أن يكون من الحكمة أن تسبقها بـ // وتحميل الرمز الخاص بك مرة أخرى ، لذلك لن يتم إعادة تعيين الوقت بمجرد تدوير الطاقة أو إعادة تعيين وحدة التحكم الدقيقة. قراءة الوقت من نموذج RTC الخاص بك هي بنفس البساطة ، في الواقع يمكن اتباع العملية بدقة داخل وظيفة displayTime (). ستحتاج إلى تحديد سبعة متغيرات بايت لتخزين البيانات من RTC ، ثم يتم إدراجها في الوظيفة readDS3231time (). على سبيل المثال ، إذا كانت المتغيرات الخاصة بك هي:

ثانية بايت ، دقيقة ، ساعة ، يوم أسبوع ، يوم شهر ، شهر ، سنة ؛

… يمكنك تحديثها بالبيانات الحالية من RTC باستخدام:

readDS3232time (& second ، & minutes ، & hour ، & dayOfWeek ، & dayOfMonth ، & month ، & year) ؛

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

فقط للتحقق من أن كل شيء يعمل ، أدخل الوقت والتاريخ المناسبين في مخطط العرض التوضيحي ، وقم بتحميله ، وقم بالتعليق على وظيفة setDS3231time () وقم بتحميلها مرة أخرى. ثم افتح الشاشة التسلسلية ، ويجب أن يتم تزويدك بعرض جاري للوقت والتاريخ الحاليين.

من هذه النقطة ، لديك الآن أدوات البرنامج لتعيين البيانات إليها واستردادها من وحدة الساعة في الوقت الفعلي ، ونأمل أن يكون لديك فهم لكيفية استخدام هذه الوحدات غير المكلفة.

يمكنك معرفة المزيد حول الدوائر المتكاملة على مدار الساعة في الوقت الفعلي من موقع الشركة المصنعة على الويب - DS1307 و DS3231.

هذا المنشور يقدمه لك pmdway.com - كل شيء للصانعين وعشاق الإلكترونيات ، مع التوصيل المجاني في جميع أنحاء العالم.

موصى به: