مثال على شاشة مكونة من وحدة واحدة مع المكتبة 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 الشاشة ، يتم استدعاء الدالة :
ضبط السطوع 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();
}
}
|