ساعة اردوينو الرقمية باستخدام وحدة RTC

جرب أداة القضاء على المشاكل





في هذا المنشور ، سنقوم ببناء ساعة رقمية باستخدام وحدة RTC أو Real Time Clock. سوف نفهم ماهية وحدة 'RTC' ، وكيفية التفاعل مع Arduino وماذا تفعل.

بواسطة:



وحدة RTC عبارة عن دائرة تتعقب الوقت الحالي بدقة. يقوم بوظيفتين ، فهو يتواصل مع المتحكمات الدقيقة والمعالجات الدقيقة لإعطاء الوقت الحالي والعمل كدائرة احتياطية للحفاظ على الوقت في حالة انقطاع التيار الكهربائي ، لأنه يحتوي على نظام بطارية احتياطي مدمج.

يمكننا العثور على RTC في أي أجهزة إلكترونية حيث يعد الوقت وظيفة مهمة للأداة الذكية.



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

نوع مماثل من الدوائر التي سنستخدمها في هذا المشروع.

وحدة RTC عبارة عن جهاز غير مكلف يمكن العثور عليه في أي مواقع للتجارة الإلكترونية وفي متاجر المشاريع الإلكترونية المحلية.

رسم توضيحي لوحدة نموذجية RTC DS1307:

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

أنت الآن تعرف شيئًا عن RTCs. الآن دعنا ننتقل إلى تصميم الساعة الرقمية. قبل متابعة هذا المشروع ، تحتاج إلى تنزيل المكتبة من الروابط التالية وتثبيتها على IDE الخاص بك:

• DS1307RTC.h

الرابط: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

الرابط: github.com/PaulStoffregen/Time

تم تثبيت مكتبتين أخريين مسبقًا على Arduino IDE ، إذا كنت تستخدم أحدث إصدار.

• LiquidCrystal.h

• سلك

الدائرة:

اتصال الدائرة بين اردوينو وشاشة LCD هو المعيار ، والذي يمكننا أن نجد اتصالًا مشابهًا في مشاريع LCD الأخرى. المكون الإضافي الوحيد هو RTC.

لتقليل ازدحام الأسلاك أثناء النموذج الأولي ، يمكن إدخال RTC في المسامير التناظرية مباشرة في اردوينو. قم بلحام SCl و SDA و Vcc و GND باستخدام دبابيس رأس ذكر وأدخلها من A2 إلى A5 كما هو موضح في النموذج الأولي.

النموذج الأولي للمؤلف:

كيفية إدخال RTC بشكل صحيح على Arduino:

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

كيفية ضبط الوقت:

بمجرد برمجة وحدة RTC ، فإنها تحافظ على الوقت حتى تتم إزالتها من اردوينو. يجب أن تدوم البطارية لمدة عامين على الأقل.

لا يوجد زر لضبط الوقت الذي سيحدد فيه البرنامج التالي الوقت في RTC. تتم مزامنة الوقت تلقائيًا مع وقت جهاز الكمبيوتر الخاص بك ، أثناء تجميع الشفرة ، لذا تأكد من ضبط الكمبيوتر على الوقت الصحيح قبل تحميل البرامج.
قم بتحميل رمز 'SetTime' هذا لتعيين الوقت مع توصيل RTC:

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

بمجرد تحميل هذا الرمز ، افتح الشاشة التسلسلية وستظهر رسالة نجاح تفيد بأن الوقت قد تم ضبطه.

يشير هذا إلى أن اتصالك بين RTC و arduino صحيح وأنه تم ضبط الوقت.

الآن قم بتحميل الكود التالي لعرض الوقت على شاشة LCD.

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

بمجرد الانتهاء من ذلك ، يجب أن ترى الوقت والتاريخ معروضين على شاشة LCD وقيد التشغيل.

ملحوظة: تم تعديل رمز 'SetTime' من رمز المثال DS1307RTC لتحسين الاتصالات السلكية لوحدة RTC ، ولن يؤدي تحميل الكود الأصلي إلى ضبط الوقت.

المنبه الرقمي باستخدام اردوينو

في هذا أعلاه تعلمنا كيفية بناء ساعة Arduino الأساسية باستخدام وحدة RTC ، في القسم التالي ، نتحرى كيف يمكن ترقية ذلك إلى دائرة منبه رقمية باستخدام Arduino.

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

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

لقد صممنا هذا المنبه بدون زر كسول (زر غفوة) ولن يتم إيقاف المنبه حتى يضغط المستخدم على الزر.

يمكن أن تعرض هذه الساعة الوقت بتنسيق 12 ساعة والتاريخ بتنسيق DD / MM / YYYY.

سيتم عرض الوقت والتاريخ على شاشة LCD مقاس 16 × 2. ستهتم وحدة وقت ساعة الوقت الحقيقي أو RTC بتتبع الوقت ويمكنها الاحتفاظ بالوقت الصحيح حتى بعد انقطاع التيار الكهربائي لفترة طويلة.

هناك 5 أزرار بشرح وظيفتها قريباً. يمكن لعقل مشروع Arduino أن يقوم بأي نموذج من اختيارك ، نوصي باستخدام Arduino pro mini أو Arduino nano نظرًا لحجمه الصغير.

الآن دعونا نتعمق في المخططات.

ما ورد أعلاه هو التخطيطي لاردوينو لعرض الاتصال ، وضبط تباين العرض عن طريق تدوير مقياس الجهد 10K.

ما يلي هو بقية الدائرة:

يمكن تشغيل الدائرة الكهربائية 9V 500mA محول الجدار.

وظائف 5 أزرار:

S1 - يستخدم هذا لإيقاف الإنذار (وهو أيضًا زر إعادة الضبط).
S2 - يستخدم لضبط المنبه. بالضغط لفترة طويلة على S2 ، ستصل إلى قائمة إعداد التنبيه.
S3 - يتم استخدامه لزيادة الساعات.
S4 - يتم استخدامه لزيادة الدقائق.
S5 - يستخدم لتبديل حالة الإنذار. إذا كان الرمز '*' موجودًا على شاشة LCD في الزاوية السفلية اليمنى ، فسيتم تشغيل التنبيه ، وإذا لم يكن '*' موجودًا ، فسيتم إيقاف تشغيل حالة التنبيه.

مزيد من التفاصيل حول كيفية ضبط المنبه موضح في الجزء السفلي من المقالة.

قم بتنزيل ملفات المكتبة أدناه:

Link1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

الآن ، يتعين علينا ضبط الوقت على وحدة RTC ، وستتم مزامنة الوقت من جهاز الكمبيوتر إلى وحدة RTC.

قم بتحميل الكود أدناه لضبط الوقت وفتح Serial Monitor:

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

لقد نجحت الآن في ضبط الوقت على RTC
بعد ذلك ، تحتاج إلى تحميل الكود الرئيسي التالي:

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

بعد تحميل الكود أعلاه ، يجب أن ترى الوقت والتاريخ الصحيحين على الشاشة.

الآن دعونا نرى كيفية ضبط المنبه:
• اضغط لفترة طويلة على S2 حتى تتمكن من رؤية قائمة التنبيه.
• اضغط على S3 و S4 لضبط الساعات والدقائق على التوالي.
• بعد ضبط الوقت المطلوب ، اضغط على S2 مرة أخرى. سيقول 'تم ضبط المنبه على xx: xx ساعة'.
• إذا كان المنبه قيد التشغيل ، يمكنك رؤية الرمز '*' على الشاشة ، وإذا كان التنبيه في وضع الإيقاف ، فلن يكون هناك رمز '*'.
• يمكنك تشغيل / إيقاف المنبه بالضغط على S5 لمدة نصف ثانية. لا تضغط طويلاً حتى تختفي '*' (تعود مرة أخرى) ، فقط اضغط لمدة نصف ثانية لتبديل حالة التنبيه.

ملاحظة مهمة:

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

لمواجهة هذه المشكلة ، تم تصميم إعداد المنبه المقترح على تنسيق ساعة 24 ساعة.

سيكون الوقت المعروض على شاشة LCD هو 12 ساعة بتنسيق AM / PM ، ولكن عند ضبط منبه مع هذا المشروع ، يجب عليك ضبط تنسيق 24 ساعة من 0 إلى 23 ساعة.

على سبيل المثال: إذا كنت تريد ضبط المنبه على الساعة 9:00 مساءً ، فعليك ضبط 21 ساعة و 0 دقيقة. لمدة 5 صباحًا: 5 ساعات و 0 دقائق وهكذا.

النموذج الأولي للمؤلف:

هل تحب هذا المشروع؟ إذا كان لديك أي سؤال بخصوص هذا المشروع ، فلا تتردد في التعبير عنه في التعليق ، فقد تتلقى ردًا سريعًا.

مقطع فيديو:




السابق: دائرة مؤشر مستوى منارة لخزانات الحبوب الحصادة التالى: 3 دوائر عالية الطاقة SG3525 العاكس موجة جيبية نقية