|
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: 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 لتبسيط الاستخدام في الأسطر .
5- فى الدالة setup ، نظرا لأنه يتم ربط وحدة RTC مع الاردوينو باستخدام الاتصال I2C. لذلك ، تستخدم الدالة wire.begin() لبدء الاتصال I2C في العنوان الافتراضي للوحدة RTC حيث لا توجد وحدات I2C أخرى.
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);
}
|