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

تعرف على لوحة الوقت و أطرافها ..
توجد عدة مقاسات من دائرة RTC من أشهرها TinyRTC المعروض في الصورة ، لاحظ أن المنافذ موجودة على الجانبين ، يمكنك استخدام أي الجانبين .
في حالات التشغيل العادية ستحتاج لتوصيل 4 أطراف فقط :
VCC, GND , SDA , SCL
ملاحظة مهمة : أحيانا تنتهي الطاقة في البطارية مما يسبب تعطل الساعة ، يجب استبدال البطارية بالمقاس الصحيح .
النوع المناسب للساعة المستخدمة في التجربة هو : CR2032 و الفولت = 3 فولت

تثبيت المكتبة الخاصة بالساعة RTC
كما هو الحال مع المكونات المتقدمة (موديولز) توجد مكتبات تسهل العمل مع هذه الملحقات . يجب تحميل المكتبات و تثبيتها لاستخدامها … توجد مكتبات عديدة ، و لكننا سنستخدم مكتبة شائعة و هي:
RTClib.h
من اصدار شركة AdaFruit
يمكنك تثبيتها من قائمة : library manager
أو بتحميل الملف المضغوط من الرابط (الزر البرتقالي هنا)

توصيل الساعة مع الأردوينو
الاتصال بين الأردوينو و الساعة يكون بتقنية i2c لذا يجب معرفة المنافذ المخصصة للاتصال بتقنية i2c
في الأردوينو أونو و الأردوينو نانو يكون المنفذان هما
A5 : SCL
A4: SDA
شاهد الصور للتوضيح.
و اذا كان أرودينو آخر ، يمكنك مراجعة الصفحة التالية لمعرفة المنافذ المخصصة للاتصال بتقنية اي تو سي.


الأوامر الأساسية لاستخدام المكتبة
السطر 13 يستخدم لضبط الوقت بشكل يدوي
بينما السطر 14 يستخدم لضبط الوقت بشكل آلي – من الكمبيوتر
لاستخدام أحد هذين الأمرين وقت الحاجة … احذف علامتي (//) في بداية السطر و ارفع الكود . و لايقاف عملهما أعد العلامتين مكانهما ثم أعد الرفع.
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup () {
pinMode(13,OUTPUT);
Serial.begin(9600);
// while (!Serial); // for Leonardo/Micro/Zero
if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1);}
if (! rtc.isrunning()) {Serial.println("RTC is NOT running!"); }
// rtc.adjust(DateTime(2006, 5, 4, 3, 2, 1));//YMDhms
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
DateTime now = rtc.now();
int Y=now.year();
int M=now.month();
int D=now.day();
int DW=now.dayOfTheWeek();
int h=now.hour();
int m=now.minute();
int s=now.second();
Serial.print(Y); Serial.print("/");
Serial.print(M); Serial.print("/");
Serial.print(D); Serial.print(" ");
Serial.println(daysOfTheWeek[DW]);
Serial.print(h); Serial.print(":");
Serial.print(m); Serial.print(":");
Serial.println(s);
delay(5000);
}
مشروع: تشغيل جرس منزلي بدل ساعة التنبيه العادية !
في هذا المشروع سنستخدم ساعة الأردوينو لمعرفة الوقت بدقة ، ثم سنربط الأردوينو مع شاشة لعرض الوقت ، كما سنربط المنفذ 13
من الأردوينو مع ريلاي (مرحل) يمكنك ببساطة ربط المرحل مع جرس منزلي ليشتغل في الوقت المحدد .

#include "RTClib.h"
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup () {
lcd.init();
lcd.backlight();
// while (!Serial); // for Leonardo/Micro/Zero
if (! rtc.begin()) { lcd.println("Couldn't find RTC"); while (1);}
if (! rtc.isrunning()) {Serial.println("RTC is NOT running!"); }
// rtc.adjust(DateTime(2019, 3, 3, 20, 0, 0));
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
lcd.clear();
DateTime now = rtc.now();
int Y=now.year();
int M=now.month();
int D=now.day();
int DW=now.dayOfTheWeek();
int h=now.hour();
int m=now.minute();
int s=now.second();
lcd.setCursor(0,0); //(COL,ROW)
lcd.print(Y); lcd.print("/");
lcd.print(M); lcd.print("/");
lcd.print(D); lcd.print("/");
lcd.print(daysOfTheWeek[DW]);
lcd.setCursor(0,1); //(COL,ROW)
lcd.print(h); lcd.print(":");
lcd.print(m); lcd.print(":");
lcd.print(s); lcd.print(" ");
if(DW0 && s<30){digitalWrite(13,HIGH);}
else{digitalWrite(13,LOW);}
delay(1000);
}
اضافة على المشروع السابق - زر لزيادة الوقت 5 دقائق
توصيل مفتاح على المنفذ 12 لزيادة 5 دقائق على الوقت المخزن في الساعة.
#include "RTClib.h"
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,20,4);
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup () {
pinMode(13,OUTPUT);
pinMode(12,INPUT_PULLUP);
lcd.init();
lcd.backlight();
// while (!Serial); // for Leonardo/Micro/Zero
if (! rtc.begin()) { lcd.println("Couldn't find RTC"); while (1);}
if (! rtc.isrunning()) {Serial.println("RTC is NOT running!"); }
// rtc.adjust(DateTime(2019, 3, 3, 20, 0, 0));
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
lcd.clear();
DateTime now = rtc.now();
int Y=now.year();
int M=now.month();
int D=now.day();
int DW=now.dayOfTheWeek();
int h=now.hour();
int m=now.minute();
int s=now.second();
lcd.setCursor(3,0); //(COL,ROW)
lcd.print(Y); lcd.print("/");
lcd.print(M); lcd.print("/");
lcd.print(D);
lcd.setCursor(3,1); //(COL,ROW)
lcd.print(daysOfTheWeek[DW]);
lcd.setCursor(0,2); //(COL,ROW)
lcd.print(h); lcd.print(":");
lcd.print(m); lcd.print(":");
lcd.print(s);
lcd.setCursor(3,3); //(COL,ROW)
lcd.print("jeem2.com");
if (digitalRead(12)==0 && m54) {rtc.adjust(DateTime(Y, M, D, h+1, m-60, s));}
if( h==3 p;& m==11 && s>0 && s<20){digitalWrite(13,HIGH);}
else{digitalWrite(13,LOW);}
delay(1000);
}
توصيل الساعة مع شاشة TM1637
توصيل مفتاح على المنفذ 2 و 3 لعرض الوقت على الشاشة

#include "RTClib.h"
#include "TM1637Display.h"
TM1637Display dd(3, 2); //clk,Data
RTC_DS1307 rtc;
void setup () {
Serial.begin(9600);
if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1);}
if (! rtc.isrunning()) {Serial.println("RTC is NOT running!"); }
// rtc.adjust(DateTime(2006, 5, 4, 3, 2, 1));//YMDhms
// rtc.adjust(DateTime(F(_DATE), F(TIME_)));
dd.setBrightness(15);
}
void loop () {
DateTime now = rtc.now();
int DW=now.dayOfTheWeek();
int h=now.hour();
int m=now.minute();
int x=h*100+m;
dd.showNumberDecEx(x, 64, true);delay(500);
dd.showNumberDecEx(x, 0 , true);delay(500);
}