ساعة حساب الوقت للأردوينو 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  
#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  
#include 
#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 
#include 
#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 && m==11 && s>0 && s<20){digitalWrite(13,HIGH);}
    else{digitalWrite(13,LOW);}
    delay(1000);
}
				
			

انتقل إلى المتجر

انتقال إلى الأعلى