القائمة الرئيسية

الصفحات

عالم الكتب والروايات

برمجة ساعة منبه رقمية بواسطة الاردوينو والمتكاملة DS1307

 

برمجة ساعة منبه رقمية بواسطة الاردوينو والمتكاملة DS1307

 مشروع أردوينو 

كيف أصنع ساعة رقمية ومنبه بواسطة الاردوينو

صناعة ساعة رقمية ومنبه بواسطة الاردوينو

الطريقة الصحيحة لصناعة ساعة رقمية ومنبه بواسطة الاردوينو 

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

 


 

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

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

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

العناصر التي نحتاجها من أجل إنجاز هذه الدائرة:

  • اردوينو اونو

  • متكاملة الوقت الحقيقي DS1307

  • 3 أزرار ضغط (push buttons)

  • شاشة كريستالية

  • طنان كهربائي (buzzer)

  • مقاومَتان 10 كيلوأوم.

  • مقاومة متغيرة 10 كيلوأوم

  • كريستالة 32.7 كيلوهيرتز

  • بطارية 3 فولت

دائرة ساعة المنبه بإستعمال الاردوينو:


 

مبدأ عمل متكاملة الوقت الحقيقي DS1307:

DS1307 عبارة عن دائرة متكاملة شائعة الإستخدام في تطبيقات الوقت الحقيقي من أجل عرض التوقيت والحالي والتاريخ، حيث تستطيع حِفظ وعرض المعلومات الخاصة بالساعات والدقائق والثواني بالنسبة للوقت، واليوم والشهر والسنة بالنسبة للتاريخ. تقوم هذه المتكاملة بتصحيح وضبط التاريخ بصورة آلية (أوتوماتيكية) بالنسبة للأشهر التي يبلغ عدد أيامها 30 يوم أو أقل، وهي تحتوي على بيانات كافية من أجل إجراء هذه التصحيحات إلى غاية سنة 2100 وهي تستطيع التمييز بين السنة الكبيسة والسنة البسيطة

 

ننتقل الآن إلى شرح أطراف (pins) المتكاملة DS1307:
  • الطرف SQW: طرف الخرج، يقوم بإخراج موجات مربعية بأربعة ترددات مختلفة نستطيع ضبطها برمجيا على: 1 هيرتز أو 4 كيلوهيرتز أو 8 كيلوهيرتز أو 32 كيلوهيرتز.
  • الطرف DS: من المُفترض أن يقوم هذا الطرف بإخراج قراء لدرجة الحرارة في حالة قمت بتوصيل مجس الحرارة DS18B20.
  • الطرف SCL: مدخل نبضات الساعة.
  • الطرف SDA: مدخل/مخرج البيانات لبروتوكول I2C.
  • الطرف VCC: المدخل الخاص بتوصيل جهد التغذية (يمكن أن يتراوح هذا الجهد بين 3.3 فولت و 5.5 فولت)
  • الطرف GND: الطرف الخاص بتوصيل المأخذ الأرضي.
  • الطرف BAT: الطرف الخاص بتوصيل مصدر التغذية الإحتياطي المتمثل في بطارية 3 فولت
 لابد من تحميل المكتبة الخاص بمتكاملة الوقت الحقيقي DS1307   ويمكن تحميلها من هنا
 
لاتصال بين الاردوينو والمتكاملة DS1307 سيستعمل بروتوكول الاتصال I2C، وهو (بروتوكول I2C) عبارة عن وصيلة تواصل أو تخاطب بين جهاز سريع كالمتحكم الدقيق وهو ما يُسمى في هذه الحالة بالسيد (master) مثلا وجهاز آخر أقل سرعة كمتكاملة الوقت الحقيقي DS1307 في وضعية الخادم (slave)، ويعتبر الناقل I2C عديم القيمة في حالة عدم وجود توابع كما يمكن له أن يتعامل مع أكثر من سيد.

مبدأ عمل الدائرة:

للاردوينو طرفان خاصان ببروتوكول الاتصال I2C، هما A5 و A4، سنقوم بتوصيلهما مع الطرفين SDA (serial data) و SCL (serial clock) الخاصان بالمتكاملة DS1307.

سنستعمل ثلاثة أزرار من أجل ضبط توقيت المنبه، حيث سنوصلهم مع الأطراف 8،9 و10 الخاصة بالاردوينو على الترتيب وسنطلق عليهم أسماء NEXT، INC وSET على التوالي.

من أجل ضبط ساعة المنبه، نضغط على زر SET، عندها تنتقل الساعة إلى وضع المنبه وتطلب منا أختيار التوقيت الذي نرغب في أن يقوم فيه الطنان بالطنين، نستطيع الآن تغيير الساعات بواسطة زر INC، وبما أن ساعتنا تعمل بنمط 24 ساعة، ستتراوح الأعداد التي سنختارها بين 0 و23، بعد الإنتهاء من إختيار الساعة نضغط على زر NEXT حتى ننتقل إلأى وضعية التعديل على الدقائق، بحيث سنضغط على زر INC مجددا من أجل تغيير الدقائق، وبعدما ننتهي نضغط على زر SET.

الوقت الذي ضبطنا عليه المنبه سيتم تخزينه في الذاكرة الميتة القابلة للبرمجة والمسح الكهربائي (EEPROM) الخاصة بالاردوينو وستتم مقارنتها بصفة مستمرة مع الوقت الحالي، وفي حالة التطابق بينهما سيبدأ الطنان بالرنين، ومن أجل إيقاف صوته المزعج نقوم بالضغط على زر NEXT.
 *-****-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 #include <Wire.h>
#include<EEPROM.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
RTC_DS1307 RTC;
int tmp, Inc, hor, mIn, add = 11;
int set = 8;
int cge = 9;
int mod = 10;
int off = 0;
#define buz 11
int Hor, Min, Sec;

///////////////////////////////////////ADJUST-THE-TIME//////////////////////////////////
void time()
{
  int tmp = 1, mins = 0, hors = 0, secs = 0;
  while (tmp == 1)
  {
    off = 0;
    if (digitalRead(cge) == 0)
    {
      Hor++;
      if (Hor == 24)
      {
        Hor = 0;
      }
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Set Alarm Time ");

    lcd.setCursor(0, 1);
    if (Hor <= 9)
      lcd.print("0");
    lcd.print(Hor);
    lcd.print(":");
    lcd.print(Min);
    lcd.print(":");
    lcd.print(Sec);
    delay(200);
    lcd.setCursor(0, 1);
    lcd.print("  ");
    lcd.print(":");
    lcd.print(Min);
    lcd.print(":");
    lcd.print(Sec);
    delay(200);
    if (digitalRead(set) == 0)
    {
      hor = Hor;
      EEPROM.write(add++, hor);
      tmp = 2;
      while (digitalRead(set) == 0);
    }
  }

  while (tmp == 2)
  {
    if (digitalRead(cge) == 0)
    {
      Min++;
      if (Min == 60)
      {
        Min = 0;
      }
    }
    lcd.setCursor(0, 1);
    lcd.print(Hor);
    lcd.print(":");
    if (Min <= 9)
      lcd.print("0");
    lcd.print(Min);
    lcd.print(":");
    lcd.print(Sec);
    lcd.print("  ");
    delay(200);
    lcd.setCursor(0, 1);
    lcd.print(Hor);
    lcd.print(":");
    lcd.print("  ");
    lcd.print(":");
    lcd.print(Sec);
    lcd.print("  ");
    delay(200);
    if (digitalRead(set) == 0)
    {
      mIn = Min;
      EEPROM.write(add++, mIn);
      tmp = 0;
      while (digitalRead(set) == 0);
    }
  }
  off = 1;
  delay(10);
}
///////////////////////////////////////ADJUST-THE-TIME//////////////////////////////////

///////////////////////////////////////////SOUND-THE-BUZZER/////////////////////////////////
void Buz()
{
  if (digitalRead(set) == 0)
    off = 0;
  if (off == 1)
  {
    digitalWrite(buz, HIGH);
    delay(500);

    digitalWrite(buz, LOW);
    delay(500);
  }
}
///////////////////////////////////////////SOUND-THE-BUZZER_end/////////////////////////////////

//////////////////////////////////////////COMPARE-ALARM-TIME-WITH-RTC//////////////////
void TimeCheck()
{
  int tem[17];
  for (int i = 11; i < 17; i++)
  {
    tem[i] = EEPROM.read(i);
  }
  if (Hor == tem[11] && Min == tem[12] && off == 1)
  {
    add = 11;
    Buz();
    Buz();
    lcd.clear();
    lcd.print("alarm...........");
    lcd.setCursor(0, 1);
    lcd.print("...........alarm");
    Buz();
    Buz();
  }
}//////////////////////////////////////////COMPARE-ALARM-TIME-WITH-RTC_end//////////////////

////////////////////////////////////////////////////////////SETUP///////////////////////////
void setup()
{
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  pinMode(cge, INPUT);
  pinMode(set, INPUT);
  pinMode(mod, INPUT);
  pinMode(buz, OUTPUT);
  digitalWrite(set, HIGH);
  digitalWrite(mod, HIGH);
  digitalWrite(cge, HIGH);

  lcd.setCursor(0, 0);
  lcd.print("   mobde3eln   ");
  lcd.setCursor(0, 1);
  lcd.print("  Alarm Clock  ");
  delay(2000);

  if (!RTC.isrunning())
  {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
////////////////////////////////////////////////////////////SETUP_end///////////////////////////


////////////////////////////////////////////////////////////MAIN-LOOP/////////////////////////////////////
void loop()
{
  DateTime now = RTC.now();
  if (digitalRead(mod) == 0)
  {
    current();
    time();
    delay(1000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("  Alarm On");
    delay(2000);
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Time:");
  lcd.setCursor(6, 0);
  Hor = now.hour(), DEC;
  if (Hor <= 9)
  {
    lcd.print("0");
    lcd.print(Hor = now.hour(), DEC);
  }
  else
    lcd.print(Hor = now.hour(), DEC);
  lcd.print(":");
  Min = now.minute(), DEC;
  if (Min <= 9)
  {
    lcd.print("0");
    lcd.print(Min = now.minute(), DEC);
  }
  else
    lcd.print(Min = now.minute(), DEC);

  lcd.print(":");
  Sec = now.second(), DEC;
  if (Sec <= 9)
  {
    lcd.print("0");
    lcd.print(Sec = now.second(), DEC);
  }
  else
    lcd.print(Sec = now.second(), DEC);
  lcd.setCursor(0, 1);
  lcd.print("Date: ");
  lcd.print(now.day(), DEC);
  lcd.print("/");
  lcd.print(now.month(), DEC);
  lcd.print("/");
  lcd.print(now.year(), DEC);
  TimeCheck();
  delay(200);
}
////////////////////////////////////////////////////////////MAIN-LOOP_end/////////////////////////////////////

///////////////////////////////////////////////////////PRINT-RTC-ON-LCD///////////////////////////////////
void current()
{
  lcd.setCursor(0, 1);
  lcd.print(Hor);
  lcd.print(":");
  lcd.print(Min);
  lcd.print(":");
  lcd.print(Sec);
}
*-****-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*




reaction:

تعليقات