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

   

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



شاشات السفن سيجمنت 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 أرقام سفن سيجمنت كما هو موضح أدناه:







اعلانات

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


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

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




البرنامج :
وحدة السفن سيجمنت المستخدمة من نوع الكاثود المشترك ، لذلك يقوم الاردوينو بإرسال إشارة الحالة المرتفعة 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,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 19-12-2019, 04:07 PM المشاركة 51   
افتراضي


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






كود:
// 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); }
}
}


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


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




البرنامج يعرض قرأة الدخل التناظرى على المدخل 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
}


Hussain800
:: مهندس متميز ::
تاريخ التسجيل: Apr 2012
المشاركات: 635
نشاط [ Hussain800 ]
قوة السمعة:
قديم 21-12-2019, 11:57 PM المشاركة 53   
افتراضي


السلام عليكم ورحمة الله وبركاته
بارك الله فيك اخى فتح الله . الله يفتح عليك .
الصراحة شرح وافى وافى وافى وافى .
اطلب منك شى يارت تشرحه لنا ادا كان بالامكان وهو .
ربط الاردوينو مع عدد 4 سفن سيجمنت كومن انود مع مسجل الازاحة يعنى كل سفن سيجمنت معها مسجل ازاحة 74HC595 وبرمجتها كاعداد مكون من اربع خانات تصاعدى تنازلى ادا امكن
او على الاقل كيف نبرمجهم وكيف يتم التقسيم متى يكون على 10ومتى يكون على 100 ومتى يكون على 1000 وهكدا
وبارك الله فيك وانشاء الله يكون فى ميزان حسنات .
والله الموفق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-12-2019, 09:00 PM المشاركة 54   
افتراضي


برمجة الاردوينو باستخدام المكتبة 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 ///


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-12-2019, 09:13 PM المشاركة 55   
افتراضي


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

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

كود:
#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(); 
	}
}



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


مقياس درجة حرارة (ثرموميتر) 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();
}
}



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