قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:331
قديم 13-02-2020, 06:26 PM المشاركة 1   
افتراضي ساعة Clock باستخدام الاردوينو وشاشة مكونة من أربعة وحدات سفن سيجمنت بنظام الانتخاب Mu Twitter FaceBook Google+



ساعة Clock باستخدام الاردوينو وشاشة مكونة من أربعة وحدات سفن سيجمنت بنظام الانتخاب Multiplexing وساعة التوقيت الحقيقى DS3231

يدور هذا التدريب حول إنشاء ساعة رقمية عن طريق "انتخاب" multiplexing ما بين أربعة وحدات سقن سيجمنت باستخدام Arduino UNO وعرض الوقت بتنسيق
HH: MM .

الدائرة الكهربية :



البرمجة :

سيتم شرح كيفية أخذ الوقت (بالساعة hour والدقيقة minute) من وحدة ساعة الوقت الحقيقى RTC بتنسيق 24 ساعة 24hr ، ثم يتم تحويله إلى التنسيق المناسب لعرضه في شاشة العرض السفن سيجمنت المكونة من 4 أرقام .
لربط الموديول DS3231 RTC مع Arduino UNO ، يتم استخدام ناقل I2C من Arduino UNO. يتم تضمين مكتبة تسمى <DS3231.h> في البرنامج للوصول إلى دوال الإعداد setting وقراءة الوقت والتاريخ وبيانات درجة الحرارة وما إلى ذلك. قم بتنزيل المكتبة وتثبيتها فى بيئة تطوير الاردوينو . نظرًا لأن وحدة RTC تستخدم واجهة I2C ، يتم استخدام المكتبة <wire.h> أيضًا في البرنامج.
يتم أخذ الساعة hour والدقيقة minute أولاً من RTC ويتم دمجهما معًا مثل 0930 (09:30 pm) ومن ثم يتم فصل الأرقام بشكل فردى مثل الآلاف thousands والمئات hundreds والعشرات tens والآحاد units ، والأرقام الفردية يتم تحويلها إلى تنسيق ثنائي مثل الصفر 0 يحول إلى 63 (0111111) . يتم إرسال هذا الكود الثنائي إلى سجل الإزاحة ومن ثم من سجل الإزاحة إلى السفن سيجمنت من نوع الكاثود المشترك ، ليتم عرض الرقم 0 على شاشة السفن سيجمنت . وبهذه الطريقة ، يتم انتخاب multiplexed الأرقام الأربعة ويتم عرض الساعة والدقيقة.


خطوات البرنامج :
1- في البداية ، يتم تضمين المكتبات الضرورية مثل مكتبة DS3231 والمكتبة Wire (مكتبة I2C).

كود:
 #include <Wire.h>   
#include<DS3231.h>

2- يتم تعريف أطراف التحكم فى السفن سيجمنت . ستلعب عناصر التحكم هذه دورًا مهمًا في انتخاب multiplexing الشاشة.

كود:
#define latchPin 5                      
#define clockPin 6
#define dataPin 4

3- يتم الإعلان عن المتغيرات لتخزين النتيجة المحولة أو الأولية raw المأخوذة من RTC.


كود:
 int h;               //Variable declared for hour
int m;              //Variable declared for minute
int thousands;    
int hundreds;
int tens;
int unit;
bool h24;
bool PM;

4- يتم الإعلان عن كائن الفئة DS3231 مثل RTC لتبسيط الاستخدام في الأسطر .

كود:
DS3231 RTC;

5- فى الدالة setup ، نظرا لأنه يتم ربط وحدة RTC مع الاردوينو باستخدام الاتصال I2C. لذلك ، تستخدم الدالة wire.begin() لبدء الاتصال I2C في العنوان الافتراضي للوحدة RTC حيث لا توجد وحدات I2C أخرى.

كود:
 Wire.begin();

6- كما يتم تعريف وضع الطرف ، ما إذا كان سيتصرق كدخل أم كخرج .

كود:
  pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);


7- تعمل الدالة loop بشكل لا نهائي وتأخذ الوقت بالساعة والدقيقة من الوحدة RTC DS3231 . يشير البارامتر ‘h24’ إلى تنسيق المتغير فى شكل 24hr .

كود:
كود:
int h= RTC.getHour(h24, PM); 
int m = RTC.getMinute();

8- بعد ذلك يتم الجمع بين الساعة hour والدقيقة minute كعدد واحد (مثال إذا كانت الساعة 10 والدقيقة 60 عندئذ يكون العدد 10*100=1000+60 =1060 ).

كود:
int number = h*100+m;

9- يتم الحصول على الأرقام الفردية من العدد (على سبيل المثال ، العدد 1060- الواحد 1 هو الآلاف thousands ، و الصفر 0 هو المئات hundreds ، والواحد التالى 1 هو العشرات tens والصفر الذى يليه 0 هو الآحاد unit ، آخر رقم). لفصل الأرقام ، يتم استخدام معامل باقى القسمة % . على سبيل المثال ، في 1060 للحصول على 1 عندئذ 1060/1000=1.06%10=1. ومن ثم يتم تخزين الأرقام المنفصلة في متغيرات منفصلة.

كود:
   int thousands = number/1000%10;
    int hundreds = number/100%10; 
    int tens = number/10%10;       
    int unit = number%10;

10- بعد ذلك يتم استخدام عبارة switch case لكل رقم فردي لتحويلها إلى التنسيق المناسب (تنسيق ثنائي) وإرسالها عبر مسجل الإزاحة لعرضها على السفن سيجمنت . على سبيل المثال (بالنسبة للرقم واحد “1” يتم تغييره إلى 06 (0000 0110)) . بحيث يتم إرساله عبر الإزاحة ، ويتم عرض الرقم واحد “1” على السفن سيجمنت (الصفر 0 يعنى LOW ، والواحد 1 يعنى HIGH).

كود:
 switch (t)
{
  case 0:
  unit = 63;
  break;
  case 1:
  unit = 06;
  break;
  case 2:
  unit =91;
  break;
  case 3:
  unit=79;
  break;
  case 4:
  unit=102;
  break;
  case 5:
  unit = 109;
  break;
  case 6:
  unit =125;
  case 7:
  unit = 07;
  break;
  case 8:
  unit = 127;
  break;
  case 9:
  unit =103;
  break; 
  }

11- بعد ذلك ، يتم إرسال الرقم الفردي بالتنسيق الثنائي عبر الدالة "shiftout" مع MSB أولاً ويكون الطرف المشترك للرقم digit الخاص به منخفضا LOW (كاثود مشترك) ويكون طرف latch مرتفعا HIGH .

كود:
digitalWrite(9, LOW);//digit thousands on , common cathode

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST,thousands); 
digitalWrite(latchPin, HIGH); 

delay(5);

digitalWrite(9, HIGH); //   digit thousands off


البرنامج :

كود:
//Four-Digit 7 Segments Multiplexing using Arduino: Display time in HH:MM
#include <Wire.h>    //Library for SPI communication
#include <DS3231.h>   //Library for RTC module
 
#define latchPin 5                       
#define clockPin 6
#define dataPin 4

DS3231 RTC;         //Declare object RTC for class DS3231

int h;              //Variable declared for hour
int m;              //Variable declared for minute
int thousands;     
int hundreds;
int tens;
int unit;
bool h24;
bool PM;

void setup () 
{
    Wire.begin();
    
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);

    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    }
 
void loop () 
{
    int h= RTC.getHour(h24, PM);  //To get the Hour
    int m = RTC.getMinute();      //TO get the minute

    int number = h*100+m;         //Converts hour and minute in 4-digit
    int thousands = number/1000%10; //Getting thousands digit from the 4 digit
    int hundreds = number/100%10;  //Getting hundreds digit from 4 digit
    int tens = number/10%10;        //Getting tens digit from 4-digit
    int unit = number%10;           //Getting last digit from 4-digit
    int t= unit;
    int u= tens;
    int v= hundreds;
    int w= thousands;

//Converting the individual digits into corresponding number for passing it through the shift register so LEDs are turned ON or OFF in seven segment
switch (t)
{
  case 0:
  unit = 63;//common cathod
  break;
  case 1:
  unit = 06;
  break;
  case 2:
  unit =91;
  break;
  case 3:
  unit=79;
  break;
  case 4:
  unit=102;
  break;
  case 5:
  unit = 109;
  break;
  case 6:
  unit =125;
  case 7:
  unit = 07;
  break;
  case 8:
  unit = 127;
  break;
  case 9:
  unit =103;
  break;  
  }
switch (u)
{
  case 0:
  tens = 63;
  break;
  case 1:
  tens = 06;
  break;
  case 2:
  tens =91;
  break;
  case 3:
  tens=79;
  break;
  case 4:
  tens=102;
  break;
  case 5:
  tens= 109;
  break;
  case 6:
  tens =125;
  case 7:
  tens = 07;
  break;
  case 8:
  tens = 127;
  break;
  case 9:
  tens =103;
  break;  
  }
 
  switch (v)
  {
  case 0:
  hundreds = 63;
  break;
  case 1:
  hundreds = 06;
  break;
  case 2:
  hundreds =91;
  break;
  case 3:
  hundreds=79;
  break;
  case 4:
  hundreds=102;
  break;
  case 5:
  hundreds = 109;
  break;
  case 6:
  hundreds =125;
  case 7:
  hundreds = 07;
  break;
  case 8:
  hundreds = 127;
  break;
  case 9:
  hundreds =103;
  break;  
  }
  
  switch (w)
  {
  case 0:
  thousands = 63;
  break;
  case 1:
  thousands = 06;
  break;
  case 2:
  thousands =91;
  break;
  case 3:
  thousands=79;
  break;
  case 4:
  thousands=102;
  break;
  case 5:
  thousands = 109;
  break;
  case 6:
  thousands =125;
  case 7:
  thousands = 07;
  break;
  case 8:
  thousands= 127;
  break;
  case 9:
  thousands =103;
  break;  
  }

    digitalWrite(9, LOW);// Turinig on thousands digit

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,thousands);  // The thousand digit is sent
    digitalWrite(latchPin, HIGH);  // Set latch pin HIGH to store the inputs 

   delay(5);                      // delay for multiplexing 
   digitalWrite(9, HIGH);         // Turinig off thousands digit

    digitalWrite(10, LOW);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,hundreds );    // The hundered digit is sent
    digitalWrite(latchPin, HIGH);

   
    delay(5);
   digitalWrite(10, HIGH);                              
  
    digitalWrite(11, LOW);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,tens);   // The tens digit is sent
    digitalWrite(latchPin, HIGH);

   
    delay(5);
    digitalWrite(11, HIGH);
    
    digitalWrite(12, LOW);

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,unit);   // The last digit is sent
    digitalWrite(latchPin, HIGH);

    delay(5);
    digitalWrite(12, HIGH);
    
}






احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً مسلم11 ( شكر العضو على هذه المشاركة )
اعجاب مسلم11 ( أعجبته المشاركة )
اعلانات

Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 638
نشاط [ Hussain800 ]
قوة السمعة:0
قديم 24-02-2020, 12:09 AM المشاركة 2   
افتراضي


السلام عليكم ورحمة الله وبركاته
هد الدراة جميلة جدا للساعة الالكترونية بواسطة الاردوينو وبارك الله فيك على شرحك الوافى ولاكن ياريت ياريت لو تشرح لنا دارة ساعة بالاردوينو مثل هده بالسفن سيجمنت بس عن طريق 4 مسجلات ازاحة واهم شى يكون بها ازرار تعديل لتصبح ساعة متكامة ..
وبارك الله فيك على شروحاتك والتى اسفدنا منها بشكل كبير جدا جدا وفقك الله اخى فتح الله

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية Bahaa599599
Bahaa599599
:: مهندس متميز ::
تاريخ التسجيل: Nov 2017
الدولة: فلسطين
المشاركات: 406
نشاط [ Bahaa599599 ]
قوة السمعة:0
قديم 26-02-2020, 04:13 PM المشاركة 3   
افتراضي


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


احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 02:28 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2024