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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 18-12-2019, 08:08 PM المشاركة 1   
افتراضي وحدات العرض (شاشة) السفن سيجمنت (الشرائح السبعة) Seven Segment وربطها مع الاردوينو Twitter FaceBook Google+



وحدات العرض (شاشة) السفن سيجمنت (الشرائح السبعة) Seven Segment وربطها مع الاردوينو :
كم مرة شاهدت فيلمًا يحتاج فيه شخص ما لإيقاف عمل قنبلة؟ يشاهد البطل الشاشة والوقت يمر ، وكل ثانية تمر تكون أكثر قيمة من السابقة. حسنًا ، إذا لاحظت ، إن كل تلك القنابل في الأفلام بها شاشات عرض من سبعة شرائح seven-segment . يجب أن تكون موجودة ، وإلا ، كيف يمكن للبطل أن يعرف كم من الوقت بقي؟
ربما لا تبدو شاشات العرض المكونة من سبعة شرائح حديثة بدرجة كافية بالنسبة لك ، ولكنها أكثر الطرق عملية لعرض الأرقام. إنها سهلة الاستخدام وفعالة من حيث التكلفة وقابلة للقراءة للغاية ، سواء في ظروف الإضاءة المحدودة أو في ضوء الشمس القوي.
مثال على العالم الحقيقي الذي يستخدم شاشة العرض المكونة من سبعة شرائح هو ساعة العد التنازلي الشهيرة في كيب كانافيرال بولاية فلوريدا التي استخدمتها ناسا لإطلاق أبولو.



نظرة عامة على الأجهزة (الهاردوير) :
دعنا نناقش بإيجاز خصائص ووظائف شاشة العرض المكونة من 7 شرائح قبل توصيلها بأردوينو.
إن شاشات العرض المكونة من 7 شرائح هي في الحقيقة سبعة ليدات LED مصفوفة بنمط معين. في هذه الحالة ، شكل الرقم "8" الذي نعرفه جميعًا. يُطلق على كل ليد من الليدات السبعة مقطع أو شريحة segment لأنه عند إضاءة الشريحة فإنها تشكل جزءًا من رقم رقمي (عشري أو سداسى عشرى على حد سواء) ليتم عرضها. أحيانًا يتم استخدام ليد إضافي لبيان العلامة العشرية.


يتم منح كل واحد من الليدات السبعة في الشاشة شريحة موضعية مع إخراج أحد أطراف التوصيل الخاصة بها مباشرة من العبوة البلاستيكية المستطيلة. يتم تمييز (تسمية) أطراف الليد الفردية هذه من a إلى g لتمثل كل ليد بشكل فردي. يتم توصيل أطراف الليد معًا لتشكيل الطرف المشترك.
لتشغيل وإيقاف جزء معين من الشاشة ، يمكنك تعيين الطرف المناسب على الحالة المرتفعة HIGH أو الحالة المنخفضة LOW تمامًا كما تفعل مع الليد العادى . لذلك تكون بعض الشرائح مضاءة والبعض الآخر سيكون مظلمًا مما يسمح بنمط الأحرف المرغوب في الرقم الذي سيتم إنشاؤه على الشاشة. هذا يسمح لنا بعد ذلك بعرض كل من العشرة أرقام العشرية من 0 إلى 9 على نفس شاشة السبعة شرائح.

أطراف شاشة السفن سيجمنت :
الآن ، دعنا ننتقل إلى تهيئة الشريحة حتى نعرف أي الأطراف تضيء أي الشرائح . الشكل التالى يبين أطراف شاشة السفن سيجمنت :



• الأطراف a-g & DP ، من بين 10 أطراف ، الثمانى أطراف a, b, c, d, e, f, g و DP (النقطة العشرية decimal point ) تتصل داخليا بشرائح العرض وتتصل خارجيا بالأطراف الرقمية للاردوينو . عن طريق التحكم بكل ليد على شريحة يمكن عرض الأرقام .
• الأطراف COM (المشتركة Common ) هى الأطراف 3 و 8 ، متصلة داخليا لتشكيل الطرف المشترك . هذا الطرف يجب أن يتصل بالارضى GND ( الكاثود المشترك) أو بالجهد 5V (الأنود المشترك) بناء على نوع الشاشة .

الكاثود المشترك (CC) مقابل الأنود المشترك (CA) :
شاشات السفن سيجمنت نوعين: الكاثود المشترك (CC) والأنود المشترك (CA). البناء الداخلي لكلا النوعين هو نفسه تقريبا. الفرق هو قطبية الليدات والطرف المشترك. كما يوحي اسمها ، فإن الكاثود المشترك يحتوي على جميع الكاثودات الخاصة بالليدات في الشرائح السبعة متصلة ببعضها البعض ، ويحتوي الأنود المشترك على جميع أنودات الليدات بالشرائح السبعة متصلة ببعضها البعض.
في شاشة الكاثود المشترك ، يتم توصيل جميع وصلات الكاثود لشرائح الليدات إلى "المنطق 0" / GND. يتم بعد ذلك إضاءة الشرائح الفردية عن طريق تطبيق إشارة مرتفعة HIGH / 'المنطق 1' على أطراف الأنود الفردية (a-g).


Common Cathode 7 Segment Working
في شاشة الأنود المشترك ، يتم توصيل جميع وصلات الأنود لشرائح الليدات بالمنطق "1" HIGH . يتم إضاءة الشرائح الفردية عن طريق تطبيق إشارة الأرضى ،أى المنطق "0" أو "LOW" على الكاثود الخاص بشريحة معينة (a-g).



Common Anode 7 Segment Working

ملحوظة
بشكل عام ، تعد شاشات الأنود المشترك أكثر شيوعًا نظرًا لأن العديد من الدوائر المنطقية يمكن أن تعمل كمصب sink لتيار أكثر من عملها كمصدر للتيار source .
لاحظ أيضًا أن شاشة الكاثود المشترك ليست بديلاً مباشرًا في الدائرة لشاشة الأنود المشترك والعكس صحيح ، حيث إنها تشبه توصيل الليدات في الاتجاه المعاكس ، وبالتالي لن يحدث انبعاث للضوء.

كيف تعمل شاشة السفن سيجمنت ؟
اعتمادًا على الرقم العشري الذي سيتم عرضه ، يتم إضاءة مجموعة معينة من الليدات LEDs. على سبيل المثال ، لعرض الرقم العددى 4 ، سوف نحتاج إلى إضاءة أربعة من شرائح الليدات المقابلة وهى b و c و f و g. وبالتالي ، يمكن عرض الأرقام المختلفة من "0 إلى 9" والأحرف من "A إلى F" باستخدام شاشة السبعة شرائح كما هو موضح أدناه.



يظهر جدول الحقيقة أدناه الشرائح الفردية التي تحتاج إلى إضاءة من أجل إنتاج أرقام وأحرف. يرجى ملاحظة أن جدول الحقيقة لشاشة الانود المشترك عكس تمامًا مع شاشة الكاثود المشترك.



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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 18-12-2019, 08:19 PM المشاركة 2   
افتراضي


شاشات السفن سيجمنت 7 segment المتعددة الوحدات وطريقة الانتخاب من لمتعدد Multiplexing
هنا ، سنتعلم كيفية تعامل شاشات العرض السفن سيجمنت (الشرائح السبعة) 7 segment (الكاثود المشترك والأنود المشترك) مع Arduino ومفهوم استخدام الانتخاب من المتعدد multiplexing . سوف نتعلم كيفية التعامل مع (ربط) شاشة مكونة من واحد إلى أربعة أرقام مع اردوينو.

ما هى تقنية الانتخاب من المتعدد Multiplexing فى وحدات السفن سيجمنت ؟
الانتخاب من المتعدد Multiplexing هى تقنية يتم فيها تمرير إشارات بيانات مختلفة عبر مسار مشترك أو مجموعة مشتركة من الأسلاك (تسمى الناقل bus) والتي يتم مشاركتها مع وجهات destinations مختلفة.
على سبيل المثال: دعنا نفترض أن لدينا الأجهزة A و B و C وهذه الأجهزة تكون أي أجهزة اتصال وأن A و B و C تحتاج إلى 5 أسلاك لكل منها لنقل البيانات data . الآن بدلاً من الأسلاك 5 + 5 + 5 = 15 ، سوف نقوم بتوصيل 5 أسلاك فقط لجميع الأجهزة الثلاثة. الآن قد تتساءل حيث أن الأجهزة بأكملها تشترك في نفس الأسلاك الخمسة ، كيف يمكننا منع تدفق البيانات الخاطئ من دخول الأجهزة الخطأ؟ سؤال جيد ، يتم معالجة هذه المشكلة عن طريق "خطوط الإختيار أو الانتخاب " “select lines” .

خطوط الاختيار Select Lines :
خطوط الاختيار "Select Lines" هي الأسلاك التي تمكّن enable أو تعطل disable الاتصال بالأجهزة بشكل فردى (كل على حدة)، نظرًا لأن لدينا 3 أجهزة هنا ، سيكون لدينا 3 خطوط اختيار . عند اختيار الجهاز "A" ، يتم تعطيل الجهاز B و C ، وسنرسل دفق البيانات عبر 5 أسلاك تصل إلى الجهاز المستهدف "A" فى حين أن الأجهزة B و C ستتجاهل دفق البيانات. بالمثل ، عند اختيار الجهاز "B" ، يتم الآن تعطيل “A” و “C” ، وسيتجاهل "A" و "C" دفق البيانات الوارد.
لذلك نحن بحاجة فقط إلى 5 أسلاك (بيانات data ) + 3 أسلاك (اختيار select ) = 8 أسلاك بدلاً من 15 سلكًا.
يتم تطبيق نفس المفهوم تماما على وحدات العرض السفن سيجمنت المتعددة الوحدات . يوجد أدناه رسم تخطيطي لأربع وحدات سفن سيجمنت والتى تستخدم نظام الانتخاب :





تحتوي كل شاشة عرض سفن سيجمنت على 8 خطوط بيانات (A ، B ، C ، D ، E ، F ، G و نقطة عشرية decimal point) والتي تضيء 8 ليدات فردية ، لعرض أربعة أرقام نحتاج 8 x 4 = 32 سلك عند عدم استخدام الانتخاب .
يتضمن انتخاب السفن سيجمنت توصيل كل الشرائح المتماثلة معًا كما هو موضح في الرسم التخطيطي. خطوط الاختيار(الانتخاب) هي الأطراف المشتركة لكل وحدة على حدة . الآن انخفض عدد الأسلاك إلى 8 (خطوط بيانات) + 4 (خطوط اختيار ) = 12 سلكًا بدلاً من 32 سلكًا.

كيف يتم عمل الانتخاب فى وحدات السفن سيجمنت ؟
لنفترض أننا نريد عرض العدد "9867" على شاشة مكونة من 4 أرقام ، لفعل ذلك يقوم المتحكم الدقيق بتطبيق إشارة LOW (على طرف الكاثود المشترك ) لوحدة الرقم الأول (من اليسار) وتطبيق إشارات +Ve على كل شريحة على حدة لإضاءة الليدات لإظهار الرقم " 9 "، بعد بضع ميلي ثانية ، يتوقف عن تطبيق إشارة LOW على الرقم الأول ويطبق إشارة LOW على الرقم الثاني ويطبق أيضًا إشارات +Ve على كل شريحة على حدة لإظهار الرقم" 8 " وبشكل مماثل بالنسبة إلى الرقم الثالث لإظهار الرقم" 6 "والرقم الرابع لإظهار "7" وتكرر الدورة.
أحد الأشياء المهمة الجديرة بالملاحظة هو أنه في أي لحظة معيّنة يضيء رقم واحد فقط وتبقى الأرقام الثلاثة مغلقة OFF ، ولكن نتيجة لظاهرة "استمرارية الرؤية persistence of vision " ، سنرى أن جميع الأرقام الأربعة مضاءة في وقت واحد كما هو موضح بالشكل أدناه .



إذا كنت لا ترغب في توصيل 4 شاشات عرض سفن سيجمنت بأسلاك كما هو موضح أعلاه ، فيمكنك شراء شاشة عرض مكونة من 4 أرقام سفن سيجمنت كما هو موضح أدناه:







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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 19-12-2019, 11:36 AM المشاركة 3   
افتراضي


برمجة وحدة سفن سيجمنت واحدة بدون استخدام الدوال المساعدة

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




البرنامج :
وحدة السفن سيجمنت المستخدمة من نوع الكاثود المشترك ، لذلك يقوم الاردوينو بإرسال إشارة الحالة المرتفعة HIGH إلى أنودات السفن سجمنت لإضاءتها .
البرنامج يبدو طويل جدا ولكنه بسيط للغاية فى الفهم والغرض هو استخدام المبادىء الأولية .



كود:
/*Seven Segment Display Connection
 Arduino Pin  Seven Segment Pin
       0   	=>   a
       1   	=>   b
       2   	=>   c
       3   	=>   d
       4   	=>   e
       5   	=>   f
       6   	=>   g
       7               =>  dp
*/

void setup() {               
  pinMode(0, OUTPUT);  
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  digitalWrite(7, 0);  // Make pin "dp" off in all digit
}

void loop() {
 // Display Digit '0'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 delay(1000);

 // Display Digit '1'
 digitalWrite(0, 0);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 delay(1000);

 // Display Digit '2'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 delay(1000);
 
 // Display Digit '3'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 1);
 delay(1000);

 // Display Digit '4'
 digitalWrite(0, 0);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 delay(1000);

 // Display Digit '5'
 digitalWrite(0, 1);
 digitalWrite(1, 0);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 delay(1000);

 // Display Digit '6'
 digitalWrite(0, 1);
 digitalWrite(1, 0);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 delay(1000);

 // Display Digit '7'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 delay(1000);

 // Display Digit '8'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 delay(1000);

 // Display Digit '9'
 digitalWrite(0, 1);
 digitalWrite(1, 1);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 delay(1000);
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 19-12-2019, 12:05 PM المشاركة 4   
افتراضي


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






كود:
// segment | Arduino board PIN number
#define A 0 
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
#define DP 7
// functions to display digits
void digit0 () {
// for 0 needed to turn ON A B C D E F segments, so:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);
}

void digit1 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void digit2 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void digit3 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
}
void digit4 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit5 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit6 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit7 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
void digit8 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void digit9 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}

//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
}
}

void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
}

void loop ()
{
for (int i=0;i<10;i++) { //counting from 0 to 9
showdigit(i);
delay (1000); // 1000ms= 1s delay

if (i%2) { digitalWrite(DP, HIGH); }
else {digitalWrite(DP, LOW); }
}
}

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 21-12-2019, 08:27 AM المشاركة 5   
افتراضي


شاشة سفن سيجمنت متعددة ، أربعة ارقام ، وقرأة دخل تناظرى مع الاردوينو :
الدائرة الكهربية :




البرنامج يعرض قرأة الدخل التناظرى على المدخل A0 والناتج عن مقاومة متغيرة 0-5V تعادل العدد 0-1023 .
يتم استخدام شاشة مكونة من 4 وحدات سفن سيجمنت نوع الكاثود المشترك ، وأربع ترانزستورات BC547 و تستخدم مقاومات 1K من أجل تحديد تيار القاعدة ، ومقاومات 330R لتحديد التيار المار بليدات الشاشة .
فى الاردوينو تستخدم المخارج الرقمية D2-D8 لنشغيل الشرائح a-g ، كما تستخدم المخارج القمية D9-D12 من أجل الأرقام digits (D0-D3) ، كما يمكن المخرج الرقمى D13 لتشغيل النقطة العشرية DP .


كود:
/*
* Arduino 4x7 LED Display
* Displays numbers ranging from 0 through 1023
* Test Code displays the value of a sensor connected to the analog input A0
*/
// bits representing segments A through G (and decimal point) for numerals 0-9
const int numeral[10] = {
   //ABCDEFG /dp
   B11111100, // 0
   B01100000, // 1
   B11011010, // 2
   B11110010, // 3
   B01100110, // 4
   B10110110, // 5
   B00111110, // 6
   B11100000, // 7
   B11111110, // 8
   B11100110, // 9
};

// pins for decimal point and each segment
// DP,G,F,E,D,C,B,A
const int segmentPins[] = { 13,8,7,6,5,4,3,2 };
const int nbrDigits= 4; // the number of digits in the LED display
//dig 0 1 2 3
const int digitPins[nbrDigits] = { 9,10,11,12 };

void setup()
{
   for(int i=0; i < 8; i++) {
      pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output
   }

   for(int i=0; i < nbrDigits; i++) {
      pinMode(digitPins[i], OUTPUT);
   }
} 

void loop()
{
   int value = analogRead(0);
   showNumber(value);
} 

void showNumber( int number)
{
   if(number == 0) {
      showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit
   } else {
      // display the value corresponding to each digit
      // leftmost digit is 0, rightmost is one less than the number of places
      for( int digit = nbrDigits-1; digit >= 0; digit--)  {
         if(number > 0)  {
            showDigit( number % 10, digit) ;
            number = number / 10;
         }
      }
   }
} 

// Displays given number on a 7-segment display at the given digit position
void showDigit( int number, int digit)
{
   digitalWrite( digitPins[digit], HIGH ); //digit on

   for(int segment = 1; segment < 8; segment++)  {// repeat for each bit of number
      boolean isBitSet = bitRead(numeral[number], segment);
      // isBitSet will be true if given bit is 1
      // isBitSet = ! isBitSet; // Code Option*
      // uncomment the above Code Option line for common anode display
      digitalWrite( segmentPins[segment], isBitSet);
   }

   delay(5);

   digitalWrite( digitPins[digit], LOW );//digit off
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 23-12-2019, 10:14 AM المشاركة 6   
افتراضي


برمجة الاردوينو باستخدام المكتبة SevSeg   :
قبل أن تتمكن من بدء كتابة التعليمات البرمجية للتحكم في شاشات العرض المكونة من 7 شرائح ، ستحتاج إلى تنصيب (تثبيت) install المكتبة SevSeg  أولاً.
لتنصيب المكتبة ، افتح Arduino IDE ، انتقل إلى Sketch> Include Library> Manage Libraries…  ، تظهر لك نافذة مدير المكتبة . فى حقل البحث اكتب اسم المكتبة SevSeg ، تظهر لك المكتبات المتوفرة بهذا الاسم ، انقر على Install لتنصيب المكتبة تجهيزا لاستخدامها فى برامجك . حدد Sketch> Include Library وستجد أنها قد أصيفت إلى المكتبات المضمنة  .





المكتبة SevSeg :
تحول هذه المكتبة الاردوينو Arduino إلى وحدة تحكم فى شاشة السفن سيجمنت . فهى تستخدم لعرض الأرقام numbers بسهولة على شاشة العرض السفن سيجمنت دون أي وحدات تحكم إضافية.
وهى تدعم نوع الكاثود المشترك ونوع الأنود المشترك ، وتستخدم الترانزستورات كمفاتيح . يمكن عرض الأرقام في التمثيل العشري أو السداسي عشر ، مع العلامة العشرية. يمكن عرض الأحرف (بأكبر قدر ممكن من الدقة). كما تدعم الشاشات المتعددة ، بأبعادها المختلفة. لا تدعم مسجلات الإزاحة Shift registers والأجهزة المماثلة.

الأجهزة (الهاردوير) Hardware :
أطراف شاشة السفن سيجمنت :
يجب أن تحتوى الشاشة :
• "أطراف الأرقام " Digit Pins : طرف لكل رقم . وهى "الأطراف المشتركة" . فهى سوف تكون الكاثودات (الأطراف السالبة) للشاشات نوع الكاثود المشترك ، أو الأنودات (الأطراف الموجبة ) للشاشات نوع الأنود المشترك .
• أطراف الثمانية شرائح  8 Segment Pins : طرف لكل شريحة بالإضافة إلى النقطة العشرية .

توصيلات الأردوينو :
يمكن توصيل جميع أطراف الأرقام وأطراف الشريحة بأي من أطراف الاردوينو Arduino الرقمية ، أو الأطراف التناظرية مع الدعم الرقمي .

مقاومات تحديد التيار Current-limiting resistors :
لا تنس أن الشاشة تستخدم ليدات LED ، لذلك يجب عليك استخدام مقاومات الحد من التيار على التوالى مع أطراف"الارقام" digit pins . استخدام  330 أوم هي قيمة آمنة إذا كنت غير متأكد. إذا كنت تستخدم مقاومات لتحديد التيار على أطراف الشرائح بدلاً من ذلك ، فقم بتعيين resistorsOnSegments على "صحيح" true (راجع مثال SevSeg_Counter.ino).

تهيئة الأجهزة Hardware configuration :
يجب عليك تحديد تهيئة الهاردوير الخاص بك للمكتبة كوسيط أول في الأمر sevseg.begin. الخيارات مفصلة أدناه.

الشاشات البسيطة منخفضة القدرة Simple, low power displays :
هذه الشاشات يتم تغذيتها مباشرة من خلال أطراف خرج الاردوينو .
• البارامتر COMMON_CATHODE : لشاشات الكاثود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد منخفض low على  طرف الرقم لإضاءة الرقم .
• البارامتر COMMON_ANODE : لشاشات الأنود المشترك بدون ترانزستورات كمفاتيح .  هذه الشاشات تتطلب جهد مرتفع high  على  طرف الرقم لإضاءة الرقم .
الشاشات بمفاتيح (ترانزستورات) : Displays with switches
تستخدم بعض شاشات العرض (معظمها أكبر حجمًا) ترانزيستورات للتحويل ، لا داعى إلى القلق بشأن التكوينات أدناه.
• البارامتر N_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع N كمصب للتيار .
• البارامتر P_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع P لإمداد التيار .

الإعداد Setting up :

كود:
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; 
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  ...
}

المصفوفة digitPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الأرقام digits. مرتبة  من اليسار إلى اليمين. المصفوفة  segmentPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الشرائح segments  . مرتبة من الشريحة a إلى الشريحة g ، ثم شريحة العلامة العشرية (إذا كانت متصلة). إذا كنت ترغب في استخدام أكثر من 8 أرقام ، فقم بزيادة MAXNUMDIGITS في الملف SevSeg.h.

ضبط العدد Setting a number :

كود:
sevseg.setNumber(3141,3); // Displays '3.141'

الوسيط الأول هو العدد المطلوب عرضه. يشير الوسيط الثانى إلى المكان الذي يجب أن يكون فيه العلامة العشرية ، العد من الرقم الأدنى أهمية. مثلا لعرض عدد صحيح integer ، يكون الوسيط الثانى هي 0. يتم دعم النوع float . في هذه الحالة ، شير الوسيط الثانى إلى عدد الأماكن العشرية بالدقة التي تريد عرضها . مثلا:

كود:
sevseg.setNumber(3.14159f,3); //Displays '3.141'

تظهر الأعداد خارج النطاق كما يلى  "----".
إذا كان الوسيط الثانى هو “-1” أو تم حذفه ، فلن يكون هناك مكان عشري.
أدخل 'true' كوسيط ثالث لعرض العدد في التمثيل السداسي عشر.

ضبط سلسلة الأحرف Setting a character string :

كود:
sevseg.setChars("abcd");


يمكن عرض مصفوفات الأحرف - بأكبر قدر ممكن من الدقة على شاشة السفن سيجمنت . الأحرف الأبجدية الرقمية فقط ، بالإضافة إلى ' ', '-' , '.' مدعومة . يجب أن تنتهى مصفوفة الأحرف بحرف النهاية NULL.

تحديث الشاشة Refreshing the display :

كود:
sevseg.refreshDisplay();

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

لإفراغ blank الشاشة ، يتم استدعاء الدالة :

كود:
sevseg.blank();

ضبط السطوع Setting the brightness :

كود:
sevseg.setBrightness(90);

يمكن ضبط السطوع باستخدام قيمة تتراوح بين “-200”  و “200” . 0 إلى 100 هو النطاق القياسي. قد تؤدي الأرقام التي تزيد عن 100 وأقل من “-100” إلى حدوث وميض (رعشة) ملحوظ. لاحظ أن 0 لا تناظر عدم وجود سطوع ، ولا “-200” . إذا كان لشاشتك وميض ملحوظ ، فإن تعديل السطوع باتجاه 0 قد يصححه. ستختلف النتائج لكل تطبيق . يعتمد السطوع على خصائص الشاشة وطراز الاردوينو الذي يقودها والمقاومات المستخدمة ومقدار الوقت الذي يقضيه في عمل أشياء أخرى في البرنامج.

مثال المكتبة SevSeg:

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



يوضح هذا المثال استخدامًا بسيطًا جدًا للمكتبة SevSeg مع شاشة مكونة من 4 أرقام ، يعرض عدادًا تصاعديا ، يعرض بالديسى ثانية deci-seconds .


كود:
*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}

void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;

if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond

if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}

*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}

void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;

if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond

if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}

sevseg.refreshDisplay(); // Must run repeatedly
}

/// END ///
sevseg.refreshDisplay(); // Must run repeatedly
}

/// END ///

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 23-12-2019, 10:16 AM المشاركة 7   
افتراضي


مثال على شاشة مكونة من وحدة واحدة مع المكتبة SevSeg:

هذا البرنامج يعد تصاعديا من 0 إلى 9 ، سوف نتناوله بالشرح ببعض التفصيل .


كود:
برمجة الاردوينو باستخدام المكتبة SevSeg   :
قبل أن تتمكن من بدء كتابة التعليمات البرمجية للتحكم في شاشات العرض المكونة من 7 شرائح ، ستحتاج إلى تنصيب (تثبيت) install المكتبة SevSeg  أولاً. 
لتنصيب المكتبة ، افتح Arduino IDE ، انتقل إلى Sketch> Include Library> Manage Libraries…  ، تظهر لك نافذة مدير المكتبة . فى حقل البحث اكتب اسم المكتبة SevSeg ، تظهر لك المكتبات المتوفرة بهذا الاسم ، انقر على Install لتنصيب المكتبة تجهيزا لاستخدامها فى برامجك . حدد Sketch> Include Library وستجد أنها قد أصيفت إلى المكتبات المضمنة  . 





المكتبة SevSeg : 
تحول هذه المكتبة الاردوينو Arduino إلى وحدة تحكم فى شاشة السفن سيجمنت . فهى تستخدم لعرض الأرقام numbers بسهولة على شاشة العرض السفن سيجمنت دون أي وحدات تحكم إضافية.
وهى تدعم نوع الكاثود المشترك ونوع الأنود المشترك ، وتستخدم الترانزستورات كمفاتيح . يمكن عرض الأرقام في التمثيل العشري أو السداسي عشر ، مع العلامة العشرية. يمكن عرض الأحرف (بأكبر قدر ممكن من الدقة). كما تدعم الشاشات المتعددة ، بأبعادها المختلفة. لا تدعم مسجلات الإزاحة Shift registers والأجهزة المماثلة.

الأجهزة (الهاردوير) Hardware : 
أطراف شاشة السفن سيجمنت : 
يجب أن تحتوى الشاشة :
• "أطراف الأرقام " Digit Pins : طرف لكل رقم . وهى "الأطراف المشتركة" . فهى سوف تكون الكاثودات (الأطراف السالبة) للشاشات نوع الكاثود المشترك ، أو الأنودات (الأطراف الموجبة ) للشاشات نوع الأنود المشترك . 
• أطراف الثمانية شرائح  8 Segment Pins : طرف لكل شريحة بالإضافة إلى النقطة العشرية . 

توصيلات الأردوينو : 
يمكن توصيل جميع أطراف الأرقام وأطراف الشريحة بأي من أطراف الاردوينو Arduino الرقمية ، أو الأطراف التناظرية مع الدعم الرقمي . 

مقاومات تحديد التيار Current-limiting resistors : 
لا تنس أن الشاشة تستخدم ليدات LED ، لذلك يجب عليك استخدام مقاومات الحد من التيار على التوالى مع أطراف"الارقام" digit pins . استخدام  330 أوم هي قيمة آمنة إذا كنت غير متأكد. إذا كنت تستخدم مقاومات لتحديد التيار على أطراف الشرائح بدلاً من ذلك ، فقم بتعيين resistorsOnSegments على "صحيح" true (راجع مثال SevSeg_Counter.ino).

تهيئة الأجهزة Hardware configuration : 
يجب عليك تحديد تهيئة الهاردوير الخاص بك للمكتبة كوسيط أول في الأمر sevseg.begin. الخيارات مفصلة أدناه.

الشاشات البسيطة منخفضة القدرة Simple, low power displays : 
هذه الشاشات يتم تغذيتها مباشرة من خلال أطراف خرج الاردوينو .
• البارامتر COMMON_CATHODE : لشاشات الكاثود المشترك بدون ترانزستورات كمفاتيح . هذه الشاشات تتطلب جهد منخفض low على  طرف الرقم لإضاءة الرقم . 
• البارامتر COMMON_ANODE : لشاشات الأنود المشترك بدون ترانزستورات كمفاتيح .  هذه الشاشات تتطلب جهد مرتفع high  على  طرف الرقم لإضاءة الرقم .
الشاشات بمفاتيح (ترانزستورات) : Displays with switches
تستخدم بعض شاشات العرض (معظمها أكبر حجمًا) ترانزيستورات للتحويل ، لا داعى إلى القلق بشأن التكوينات أدناه.
• البارامتر N_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع N كمصب للتيار . 
• البارامتر P_TRANSISTORS : إذا كنت تستخدم ترانزستورات من النوع P لإمداد التيار . 

الإعداد Setting up :

كود:
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; 
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  ...
}
المصفوفة digitPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الأرقام digits. مرتبة  من اليسار إلى اليمين. المصفوفة  segmentPins لتخزين أرقام أطراف الاردوينو التي تتصل بها الشرائح segments  . مرتبة من الشريحة a إلى الشريحة g ، ثم شريحة العلامة العشرية (إذا كانت متصلة). إذا كنت ترغب في استخدام أكثر من 8 أرقام ، فقم بزيادة MAXNUMDIGITS في الملف SevSeg.h. ضبط العدد Setting a number :
كود:
sevseg.setNumber(3141,3); // Displays '3.141'
الوسيط الأول هو العدد المطلوب عرضه. يشير الوسيط الثانى إلى المكان الذي يجب أن يكون فيه العلامة العشرية ، العد من الرقم الأدنى أهمية. مثلا لعرض عدد صحيح integer ، يكون الوسيط الثانى هي 0. يتم دعم النوع float . في هذه الحالة ، شير الوسيط الثانى إلى عدد الأماكن العشرية بالدقة التي تريد عرضها . مثلا:
كود:
sevseg.setNumber(3.14159f,3); //Displays '3.141'
تظهر الأعداد خارج النطاق كما يلى  "----". إذا كان الوسيط الثانى هو “-1” أو تم حذفه ، فلن يكون هناك مكان عشري. أدخل 'true' كوسيط ثالث لعرض العدد في التمثيل السداسي عشر. ضبط سلسلة الأحرف Setting a character string :
كود:
sevseg.setChars("abcd");
يمكن عرض مصفوفات الأحرف - بأكبر قدر ممكن من الدقة على شاشة السفن سيجمنت . الأحرف الأبجدية الرقمية فقط ، بالإضافة إلى ' ', '-' , '.' مدعومة . يجب أن تنتهى مصفوفة الأحرف بحرف النهاية NULL. تحديث الشاشة Refreshing the display :
كود:
sevseg.refreshDisplay();
يجب أن يقوم البرنامج بتشغيل الدالة refreshDisplay() بشكل متكرر لعرض العدد . لاحظ أن أي تأخير يتم تقديمه بواسطة دوال أخرى سوف ينتج عنه تأثيرات غير مرغوب فيها على الشاشة. لإفراغ blank الشاشة ، يتم استدعاء الدالة :
كود:
sevseg.blank();
ضبط السطوع Setting the brightness :
كود:
sevseg.setBrightness(90);
يمكن ضبط السطوع باستخدام قيمة تتراوح بين “-200”  و “200” . 0 إلى 100 هو النطاق القياسي. قد تؤدي الأرقام التي تزيد عن 100 وأقل من “-100” إلى حدوث وميض (رعشة) ملحوظ. لاحظ أن 0 لا تناظر عدم وجود سطوع ، ولا “-200” . إذا كان لشاشتك وميض ملحوظ ، فإن تعديل السطوع باتجاه 0 قد يصححه. ستختلف النتائج لكل تطبيق . يعتمد السطوع على خصائص الشاشة وطراز الاردوينو الذي يقودها والمقاومات المستخدمة ومقدار الوقت الذي يقضيه في عمل أشياء أخرى في البرنامج. مثال المكتبة SevSeg: الدائرة الكهربية : يوضح هذا المثال استخدامًا بسيطًا جدًا للمكتبة SevSeg مع شاشة مكونة من 4 أرقام ، يعرض عدادًا تصاعديا ، يعرض بالديسى ثانية deci-seconds .
كود:
*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}

void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;

if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond

if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}

*/
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected

sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}

void loop() {
static unsigned long timer = millis();
static int deciSeconds = 0;

if (millis() - timer >= 100) {
timer += 100;
deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond

if (deciSeconds == 10000) { // Reset to 0 after counting for 1000 seconds.
deciSeconds=0;
}
sevseg.setNumber(deciSeconds, 1);
}

sevseg.refreshDisplay(); // Must run repeatedly
}

/// END ///
sevseg.refreshDisplay(); // Must run repeatedly
}

/// END ///
#include "SevSeg.h" SevSeg sevseg; void setup() { //Set to 1 for single digit display byte numDigits = 1; //defines common pins while using multi-digit display. Left empty as we have a single digit display byte digitPins[] = {}; //Defines arduino pin connections in order: A, B, C, D, E, F, G, DP byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; bool resistorsOnSegments = true; //Initialize sevseg object. Uncomment second line if you use common cathode 7 segment sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments); //sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments); sevseg.setBrightness(90); } void loop() {   //Display numbers one by one with 2 seconds delay   for(int i = 0; i < 10; i++)   {     sevseg.setNumber(i);     sevseg.refreshDisplay();     delay(1000);   } }


يبدأ البرنامج بتضمين مكتبة SevSeg التي تعمل على تبسيط التحكم فى السفن سيجمنت . بعد ذلك ، يتعين علينا إنشاء كائن من الفئة  SevSeg يمكننا بعد ذلك استخدامه خلال البرنامج .


كود:
#include "SevSeg.h"
SevSeg myDisplay;


بعد ذلك ، يتعين علينا تحديد عدد الأرقام digits الموجودة على الشاشة. نظرًا لأننا نستخدم شاشة من رقم واحد ، فقم بتعيينها على 1. في حالة استخدام شاشة من 4 أرقام ، قم بتعيينها على 4.


كود:
//Set to 1 for single digit display
byte numDigits = 1;


تحدد المصفوفة digitPins ببساطة "الأطراف المشتركة" ‘common pins’ عند استخدام شاشة متعددة الأرقام. اتركها فارغًا إذا كان لديك شاشة من رقم واحد. بخلاف ذلك ، ضع أرقام أطراف الاردوينو التي تتصل بها "الأطراف المشتركة " من لكل رقم فردى . رتبهم من اليسار إلى اليمين.




المصفوفة الثانية segmentPins تهىء أطراف الشرائح . وهى مصفوفة لجميع أرقام أطراف الاردوينو التي تتصل بشرائح الشاشة. يجب أيضًا ترتيبها بالترتيب الصحيح حيث تفترض المكتبة أن بالترتيب التالى A, B, C, D, E, F, G, DP .
 

كود:
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DP
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};


بعد إنشاء هذه المتغيرات ، نقوم بتمريرها إلى مُنشئ كائن الفئة SevSeg باستخدام الدالة begin() .


كود:
//Initialize sevseg object
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);



في قسم ‘loop’ : يبدأ البرنامج في العد من 0 إلى 9 باستخدام حلقة "for" والمتغير "i". في كل مرة ، يستخدم الدالة setNumber() مع الدالة refreshDisplay () لتعيين الرقم على الشاشة.
ثم هناك تأخير ثانٍ قبل زيادة "i" وعرض الرقم التالي.


كود:
for(int i = 0; i < 10; i++)
{
     sevseg.setNumber(i);
     sevseg.refreshDisplay(); 
     delay(1000);
}



مثال على وحدة واحدة مع المكتبة ومفتاح ضاغط يقوم مقام حجرالنرد (الزهر) المتدحرج



بيت القصيد من النرد هو توفير وسيلة للوصول عشوائيا لرقم من 1 إلى 6. وأفضل طريقة للحصول على رقم عشوائي هي استخدام الدالة المدمجة random(min,max) . وهى تأخذ يارامترين  ، البارامتر الأول يحدد الحد الأدنى للقيمة العشوائية (بما في ذلك هذا الرقم) والبارامتر الثانى يحدد الحد الأعلى للقيمة العشوائية (باستثناء هذا الرقم). يعني سيتم إنشاء عدد عشوائي بين min  و max-1 .

البرنامج :


كود:
#include "SevSeg.h"
SevSeg sevseg; 
const int buttonPin = 10;     // the number of the pushbutton pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup(){
    byte numDigits = 1;
    byte digitPins[] = {};
    byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
    bool resistorsOnSegments = true;
 
    sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
    sevseg.setBrightness(90);
 
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT);
}

void loop()
{
 // read the state of the pushbutton value:
 buttonState = digitalRead(buttonPin);
  
 if (buttonState == HIGH) 
 {
 sevseg.setNumber(random(1,7));
 sevseg.refreshDisplay(); 
 }
}



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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 23-12-2019, 10:18 AM المشاركة 8   
افتراضي


مقياس درجة حرارة (ثرموميتر) Thermometer باستخدام الحساس LM35 و شاشة السفن سيجمنت مع الاردوينو :

الشاشة المستخدمة مكونة من 3 وحدات سفن سيجمنت .

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






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

كود:
#include "SevSeg.h"

إذا أردنا إظهار العلامة العشرية على الشاشة ، فعندئذ نحتاج إلى تحديد أين سنقوم بعرضها من الرقم digit أقصى اليمين . في حالتنا ، سيتم عرضه بعد الرقم الأول من اليمين.
نحتاج أيضًا إلى تحديد عدد الأرقام التي نريد عرضها أو عدد وحدات السفن سيجمنت التي نستخدمها.

كود:
byte numDigits = 3; 
sevseg.setNumber(tempc, 1);

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

كود:
void delay_function() {
unsigned long currentMillis = millis(); // grab current time
// check if "interval" time has passed (1000 milliseconds)
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
sevseg.setNumber(tempc, 1); 
previousMillis = millis();
}
}


كود البرنامج :

كود:
#include "SevSeg.h" // Included the library for the 7 segment display
SevSeg sevseg; // Created an object
	
const int sensor_pin = A0; // initialized A0 for LM35 sensor
float tempc; //variable to store temperature in degree Celsius
float sensor_out; // variable to store the output
	
unsigned long interval=1000; // the time we need to wait
unsigned long previousMillis=0; // millis() returns an unsigned long.
	
void setup(){
pinMode(sensor_pin, INPUT); // Declared the sensor pin as Input
	
byte numDigits = 3; // We are showing 3 digits so set it to 3.
byte digitPins[] = {10, 11, 12}; // Arduino Pins where we have connected the ground pins of 7 segment displays
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Arduino pins where we have connected the segment pins of displays

bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE; // Type of display we are using
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments); // Initialized the display
sevseg.setBrightness(100); // Sets the brigtness of the displays. This can be from 0 to 100
}
	
void loop(){
sensor_out = analogRead(sensor_pin); // Gets the output from LM35
tempc = (sensor_out*500)/1023; // Calculated the temperature in C
delay_function(); // function to add 1 second delay
sevseg.refreshDisplay(); // This function is required to continue displaying
}
	
void delay_function() {
unsigned long currentMillis = millis(); // grab current time
	
	// check if "interval" time has passed (1000 milliseconds)
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
sevseg.setNumber(tempc, 1); // Sets temperature on display
previousMillis = millis();
}
}

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

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

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

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


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

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