منتديات الالكترونيات العصرية  
yoursite.com page title .

استرجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
العودة   منتديات الالكترونيات العصرية > منتدى الحاكمات الدقيقة Microcontroller > منتدى آردوينو Arduino

  #21  
قديم 04-01-2020, 09:12 PM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,819
معدل تقييم المستوى: 23
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي الدرس السابع عشر المصفوفات والاردوينو Arduino Arra

دورة برمجة الاردوينو : الدرس السابع عشر
المصفوفات والاردوينو Arduino Arrays


المصفوفات Arrays هي مجموعات من نفس النوع من البيانات data التي يتم وضعها على التوالي في الذاكرة. على سبيل المثال ، يمكن أن يكون لدينا مصفوفة من الأعداد الصحيحة (النوع int) وهى رقمان صحيحان أو أكثر يحدثان الواحد تلو الآخر.
المفتاح هنا هو أن كل عنصر element في المصفوفة يتم وضعه مباشرة بعد العنصر السابق مما يسمح لنا بالوصول إلى كل عنصر بدوره باستخدام حلقة loop.
يشير عنصر في مصفوفة إلى قيمة في المصفوفة . إذا كان لدينا مصفوفة من الأعداد الصحيحة ، فسيتم الإشارة إلى كل عدد صحيح فردي كعنصر من المصفوفة . في مصفوفة من البايتات bytes ، يكون كل عنصر بايت (من نوع byte).

استخدام المصفوفات Using Arrays
يوضح البرنامج أدناه الاستخدام الأساسي للمصفوفة .

كود:
void setup() {
  int my_array[5];     // an array with 5 integer elements
  int i;               // used as an index into the array
  
  Serial.begin(9600);
  
  my_array[0] = 23;    // assign a value of 23 to the 1st element
  my_array[1] = 1001;  // assign a value of 1001 to the 2nd element, etc.
  my_array[2] = 9;
  my_array[3] = 1234;
  my_array[4] = 987;
  
  // display each number from the array in the serial monitor window
  for (i = 0; i < 5; i++) {
    Serial.println(my_array[i]);
  }
}

void loop() {
}

تعريف المصفوفة Defining the Array
في هذا البرنامج ، يتم تعريف مصفوفة من 5 عناصر. هذا يصنع مساحة في الذاكرة لخمسة أعداد صحيحة يتم وضعها في الذاكرة واحدة تلو الأخرى. يمكن أن تحتوي القيم التي يحتوي عليها كل عنصر بعد تعريف المصفوفة على أي بيانات عشوائية. من الممكن أيضًا أن يتم التعيين بمعرفة المترجم compiler لجعل القيم صفرًا ، ولكن لا يمكننا الاعتماد على ذلك.

تعريف مصفوفة من 5 أعداد صحيحة:

كود:
int my_array[5];     // an array with 5 integer elements

في هذا المثال ، المصفوفة من النوع int ، ولكن يمكن أن يكون float أو byte ، إلخ.
المصفوفة لها اسم وهو my_array في المثال.
المصفوفة لها طول [5] مما يعني أن مساحة 5 أعداد صحيحة متتالية يتم صنعها في الذاكرة.

تعيين (تخصيص) القيم للعناصر في المصفوفة Assigning Values to Elements in the Array
يتم تعيين قيمة عدد صحيح لكل عنصر من خلال الرجوع (الإشارة) إليه باستخدام الأقواس المربعة [] مع رقم العنصر بين الأقواس للوصول إليه.

كود:
my_array[0] = 23;
my_array[1] = 1001;
my_array[2] = 9;
my_array[3] = 1234;
my_array[4] = 987;

لاحظ أن ترقيم numbering العناصر يبدأ من صفر [0] وليس واحد [1] ، لذا فإن العنصر الأول في المصفوفة هو العنصر 0.
بالطريقة نفسها ، يتم ترقيم العنصر الأخير في المصفوفة بحجم المصفوفة ناقص عنصر واحد أقل . في المثال ، حجم المصفوفة هو 5 ، وبالتالي فإن رقم العنصر الأخير هو 4 - مرة أخرى هذا لأننا نرقم العناصر بدءًا من 0.

الوصول إلى المصفوفة في حلقة Accessing an Array in a Loop
يتم استخدام حلقة for للحصول على محتويات كل عنصر في المصفوفة كل بدوره وطباعة القيم إلى النافذة التسلسلية .

كود:
 for (i = 0; i < 5; i++) {
  Serial.println(my_array[i]);
}

يستخدم المتغير i في حلقة for كمؤشر (فهرس) index في المصفوفة للوصول إلى كل عنصر من عناصر المصفوفة.
في الحلقة ، تتم تهيئة i إلى 0 ثم تتم زيادته بمقدار واحد في كل مرة من خلال الحلقة بحيث يتم حسابه من 0 إلى 4. ويتم الخروج من الحلقة عندما يصبح 5.
يستخدم المتغير i في المصفوفة للحصول على القيمة التي يحتفظ بها عنصر المصفوفة بدءًا من العنصر 0 وينتهي بالعنصر 4.

كود:
(my_array[i]);

في الكود أعلاه ، عندما تكون i بصفر 0 ، يتم الوصول إلى العنصر الأول من المصفوفة ويمكننا بعد ذلك الحصول على القيمة التي يحتوي عليها والتي هي 23 في برنامج المثال .

المزيد عن تهيئة المصفوفات More on Initializing Arrays
بدلاً من تهيئة كل عنصر في المصفوفة بشكل فردي ، يمكن تعريف المصفوفة وتهيئتها في سطر واحد كما هو موضح في هذا الكود .
يعمل هذا البرنامج تمامًا مثل البرنامج السابق.

كود:
void setup() {
  int my_array[5] = {23, 1001, 9, 1234, 987};
  int i;
  
  Serial.begin(9600);
  
  // display each number from the array in the serial monitor window
  for (i = 0; i < 5; i++) {
    Serial.println(my_array[i]);
  }
}

void loop() {
}

يتم وضع القيم لتهيئة كل عنصر بها بين الأقواس {} بعد عامل التعيين (علامة يساوي =). سيتم تعيين القيمة الأولى بين الأقواس للعنصر الأول في المصفوفة (رقم العنصر 0) ، وسيتم تعيين الرقم الثاني بين الأقواس للعنصر الثاني في المصفوفة (العنصر رقم 1) ، إلخ.
يمكن أيضًا كتابة التعليمات البرمجية التي تقوم بالتعريف defining والتهيئة initializing دون عدد العناصر في المصفوفة بين القوسين المربعين:

كود:
int my_array[] = {23, 1001, 9, 1234, 987};

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

استخدامات المصفوفات Uses of Arrays
يوضح هذا الدرس أن المصفوفات يمكنها تخزين متغيرات البيانات من نفس النوع على التوالي في الذاكرة مما يسمح بالوصول السهل باستخدام حلقة.
هناك العديد من الاستخدامات للمصفوفات في البرمجة ، على سبيل المثال ، يمكن للمصفوفات تخزين البيانات التي يتم تسجيلها ، مثل درجات الحرارة. السلاسل النصية Strings ، وهي أسطر نصية ، هي في الواقع مصفوفات كما سنرى في الدرس التالي .
رد مع اقتباس
  #22  
قديم 04-02-2020, 09:24 PM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,819
معدل تقييم المستوى: 23
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي الدرس الثامن عشر السلاسل النصية والاردوينو Arduino

دورة برمجة الاردوينو : الدرس الثامن عشر
السلاسل النصية والاردوينو Arduino Strings


تُستخدم السلاسل Strings لتخزين نص text. يمكن استخدامها لعرض النص على شاشة LCD أو في نافذة الاردوينو التسلسلية لبيئة التطوير Arduino IDE.
السلاسل مفيدة أيضًا لتخزين إدخال input المستخدم - على سبيل المثال الأحرف التي يكتبها المستخدم على لوحة مفاتيح متصلة بالاردوينو .

هناك نوعان من السلاسل في برمجة الاردوينو Arduino:
1) مصفوفات Arrays الأحرف التي هي نفس السلاسل المستخدمة في برمجة لغة C.
2) سلسلة الاردوينو Arduino String التي تتيح لنا استخدام كائن السلسلة string object في البرنامج .
يتم بالكامل شرح السلاسل Strings والكائنات objects وكيفية استخدام السلاسل في برامج Arduino في هذا الدرس . يتم الإجابة على السؤال عن نوع السلسلة التي سيتم استخدامها في البرنامج في نهاية هذا الدرس .

سلسلة مصفوفات الحرف String Character Arrays
النوع الأول من السلسلة الذي سنتناوله هو السلسلة التي هي سلسلة (متتالية) series من الأحرف من نوع char. أوضح الدرس السابق ما هي المصفوقة - سلسلة متتالية consecutive series من نفس النوع من المتغيرات المخزنة في الذاكرة. السلسلة string هي مصفوفة من متغيرات الحرف char.
السلسلة هي مصفوفة خاصة تحتوي على عنصر إضافي واحد في نهاية السلسلة والذي يكون دائمًا له القيمة 0 (صفر). يُعرف هذا "سلسلة منتهية بحرف عديم الوجود أو لاشىء""null terminated string".

مثال برنامج على سلسلة مصفوفة الحرف :
سيوضح هذا البرنامج كيفية صنع (عمل) سلسلة وطباعتها إلى نافذة الشاشة التسلسلية.

كود:
void setup() {
  char my_str[6];    // an array big enough for a 5 character string
  
  Serial.begin(9600);
  
  my_str[0] = 'H';  // the string consists of 5 characters
  my_str[1] = 'e';
  my_str[2] = 'l';
  my_str[3] = 'l';
  my_str[4] = 'o';
  my_str[5] = 0;    // 6th array element is a null terminator
  
  Serial.println(my_str);
}

void loop() {
}

يُظهر البرنامج مما تتكون السلسلة من - تتكون من مصفوفة حرف بأحرف قابلة للطباعة و 0 في العنصر الأخير من المصفوفة لإظهار أن هذا حيث تنتهي السلسلة.
يمكن طباعة السلسلة إلى نافذة الشاشة التسلسلية باستخدام Serial.println() وتمريرها باسم السلسلة.
يمكن كتابة نفس هذا البرنامج بسهولة أكبر بهذه الطريقة:

كود:
void setup() {
  char my_str[] = "Hello";
  
  Serial.begin(9600);
  
  Serial.println(my_str);
}

void loop() {
}

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

السلاسل والحروف Strings and Characters :
تتم كتابة الأحرف بين علامات الاقتباس الفردية مثل هذا:

كود:
'w'

تتم كتابة السلاسل بين علامات الاقتباس المزدوجة مثل هذا:

كود:
"This is a string"

معالجة مصفوفات السلسلة Manipulating String Arrays
يمكننا تغيير مصفوفة سلسلة داخل برنامج كما يظهر البرنامج التالي.

كود:
void setup() {
  char like[] = "I like coffee and cake";  // create a string
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(like);
  
  // (2) delete part of the string
  like[13] = 0;
  Serial.println(like);
  
  // (3) substitute a word into the string
  like[13] = ' ';  // replace the null terminator with a space
  like[18] = 't';  // insert the new word
  like[19] = 'e';
  like[20] = 'a';
  like[21] = 0;    // terminate the string
  Serial.println(like);
}

void loop() {
}

إنشاء وطباعة السلسلة Creating and Printing the String
في هذا البرنامج ، يتم إنشاء سلسلة جديدة ثم طباعتها للعرض في النافذة التسلسلية (1) .

• تقصير السلسلة Shortening the String
يتم تقصير السلسلة عن طريق استبدال الحرف الرابع عشر في السلسلة بصفر الانتهاء (2). هذا هو العنصر رقم 13 في مصفوفة السلسلة العد من 0.
عند طباعة السلسلة ، تتم طباعة جميع الأحرف حتى صفر الانتهاء الجديد . لا تختفي الحروف الأخرى - فهي لا تزال موجودة في الذاكرة ولا تزال مصفوفة السلسلة بنفس الحجم. والفرق الوحيد هو أن أي دالة تعمل مع السلاسل لن ترى سوى السلسلة حتى حرف النهاية null الأول.


• تغيير كلمة في السلسلة Changing a Word in the String
وأخيرًا يستبدل البرنامج كلمة "cake" بكلمة "tea" (3). يجب أولاً استبدال حرف النهاية null في like[13] بمسافة space بحيث تتم استعادة السلسلة إلى كيفية إنشائها في الأصل.
الحروف الجديدة تستبدل "cak" من كلمة "cake" بكلمة tea" . يتم ذلك عن طريق استبدال الأحرف الفردية. يتم استبدال حرف "e" من "cake" بحرف إنهاء null جديد . والنتيجة هي أن السلسلة تنتهي فعليًا بحرفين فارغين - الحرف الأصلي في نهاية السلسلة والحرف الجديد الذي يحل محل حرف "e" في "cake" . لا يحدث هذا فرقًا عند طباعة السلسلة الجديدة لأن الدالة التي تطبع السلسلة تتوقف عن طباعة أحرف السلسلة عندما تواجه أول حرف نهاية null .

دوال لمعالجة مصفوفات السلسلة Functions to Manipulate String Arrays
في البرنامج السابق تم معالجة السلسلة بطريقة يدوية للغاية عن طريق الوصول إلى أحرف فردية في السلسلة. لتسهيل معالجة مصفوفات السلسلة ، يمكنك كتابة الدوال الخاصة بك للقيام بذلك ، أو استخدام بعض دوال السلسلة من مكتبة لغة C.
يستخدم البرنامج التالي بعض دوال سلسلة لغة C.

كود:
void setup() {
  char str[] = "This is my string";  // create a string
  char out_str[40];                  // output from string functions placed here
  int num;                           // general purpose integer
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(str);
  
  // (2) get the length of the string (excludes null terminator)
  num = strlen(str);
  Serial.print("String length is: ");
  Serial.println(num);
  
  // (3) get the length of the array (includes null terminator)
  num = sizeof(str);  // sizeof() is not a C string function
  Serial.print("Size of the array: ");
  Serial.println(num);
  
  // (4) copy a string
  strcpy(out_str, str);
  Serial.println(out_str);
  
  // (5) add a string to the end of a string (append)
  strcat(out_str, " sketch.");
  Serial.println(out_str);
  num = strlen(out_str);
  Serial.print("String length is: ");
  Serial.println(num);
  num = sizeof(out_str);
  Serial.print("Size of the array out_str[]: ");
  Serial.println(num);
}

void loop() {
}

يعمل البرنامج بالطريقة التالية.

(1) طباعة السلسلة Print the String
تتم طباعة السلسلة التي تم إنشاؤها حديثًا إلى النافذة التسلسلية كما تم في البرامج السابقة.

(2) الحصول على طول السلسلة Get the Length of the String
يتم استخدام الدالة strlen() للحصول على طول السلسلة. طول السلسلة مخصص للأحرف القابلة للطباعة فقط ولا يتضمن حرف النهاية null .
تحتوي السلسلة على 17 حرفًا ، لذلك نرى 17 مطبوعة في النافذة التسلسلية .

(3) الحصول على طول المصفوفة Get the Length of the Array
يستخدم العامل sizeof() للحصول على طول المصفوفة التي تحتوي على السلسلة. يشتمل الطول على حرف نهاية null ، لذا فإن الطول أكبر بواحد من طول السلسلة.
العامل sizeof() يشبه دالة ، ولكن من الناحية الفنية هو عامل operator . وهو ليس جزءًا من مكتبة السلسلة string للغة C ، ولكن تم استخدامه في البرنامج لإظهار الفرق بين حجم المصفوفة وحجم السلسلة (أو طول السلسلة).

(4) نسخ سلسلة Copy a String
يتم استخدام الدالة strcpy() لنسخ السلسلة str[] إلى المصفوفة out_num[] . تنسخ الدالة strcpy() السلسلة الثانية التي تم تمريرها إليها في السلسلة الأولى. توجد نسخة من السلسلة الآن في المصفوفة out_num[] ، ولكنها لا تستوعب سوى 18 عنصرًا من المصفوفة ، لذلك لا يزال لدينا 22 عنصرًا char حرا في المصفوفة . يتم العثور على هذه العناصر الحرة بعد السلسلة في الذاكرة.
تم نسخ السلسلة إلى المصفوفة بحيث يكون لدينا مساحة إضافية في المصفوفة لاستخدامها في الجزء التالي من البرنامج الذي يضيف سلسلة إلى نهاية السلسلة.

(5) إلحاق سلسلة بسلسلة (تسلسل) Append a String to a String (Concatenate)
يربط البرنامج سلسلة بأخرى ، والتي تُعرف بالسلسلة أو التسلسل concatenation . يتم ذلك باستخدام الدالة strcat() . تضع الدالة strcat() السلسلة الثانية التي تم تمريرها إليها في نهاية السلسلة الأولى التي تم تمريرها إليها.
بعد التسلسل ، تتم طباعة طول السلسلة لإظهار طول السلسلة الجديدة. ثم يتم طباعة طول المصفوفة لإظهار أن لدينا سلسلة طويلة مكونة من 25 حرفًا في مصفوفة بطول 40 عنصرًا.
تذكر أن السلسلة الطويلة المكونة من 25 حرفًا تستهلك في الواقع 26 حرفًا من المصفوفة بسبب حرف الانتهاء null .

حدود المصفوفة Array Bounds
عند العمل مع السلاسل والمصفوفات ، من المهم جدًا العمل ضمن حدود bounds السلسلة أو المصفوفة. في برنامج المثال ، تم إنشاء مصفوفة مكونة من 40 حرفًا من أجل تخصيص الذاكرة التي يمكن استخدامها لمعالجة السلاسل.

إذا كانت المصفوفة صغيرة للغاية وحاولنا نسخ سلسلة أكبر من المصفوفة إليها ، فسيتم نسخ السلسلة في نهاية المصفوفة . يمكن أن تحتوي الذاكرة بعد نهاية المصفوفة على بيانات مهمة أخرى مستخدمة في البرنامج والتي سيتم استبدالها overwritten بعد ذلك بواسطة السلسلة الخاصة بنا. إذا تم تجاوز الذاكرة بعد نهاية السلسلة ، فقد يتعطل البرنامج أو تسبب سلوكًا غير متوقع.

كائن سلسلة الاردوينو The Arduino String Object
النوع الثاني من السلسلة المستخدمة في برمجة الاردوينو هو الكائن String.

ما هو الكائن ؟ What is an Object?
الكائن هو بناء construct يحتوي على كل من البيانات data والدوال functions . يمكن إنشاء كائن String تمامًا مثل المتغير وتعيين قيمة أو سلسلة. يحتوي كائن String على دوال (والتي تسمى "طرق" "methods"في البرمجة الموجهة للكائنات (OOP)) والتي تعمل على بيانات السلسلة الموجودة في كائن السلسلة String.
سوف يوضح البرنامج والشرح التاليان ما هو الكائن وكيف يتم استخدام كائن String.

كود:
 void setup() {
  String my_str = "This is my string.";
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(my_str);
  
  // (2) change the string to upper-case
  my_str.toUpperCase();
  Serial.println(my_str);
  
  // (3) overwrite the string
  my_str = "My new string.";
  Serial.println(my_str);
  
  // (4) replace a word in the string
  my_str.replace("string", "Arduino sketch");
  Serial.println(my_str);
  
  // (5) get the length of the string
  Serial.print("String length is: ");
  Serial.println(my_str.length());
}

void loop() {
}

يتم إنشاء كائن سلسلة string object وتعيين قيمة (أو سلسلة) في أعلى البرنامج .

كود:
String my_str = "This is my string.";

يؤدي هذا إلى إنشاء كائن من الفئة String باسم my_str ويعطيه قيمة "This is my string." .
يمكن مقارنة ذلك بإنشاء متغير وتعيين قيمة له مثل عدد صحيح:

كود:
int my_var = 102;

(1) طباعة السلسلة Printing the String
يمكن طباعة السلسلة إلى النافذة التسلسلية تمامًا مثل سلسلة مصفوفة الأحرف.

(2) تحويل السلسلة إلى أحرف كبيرة Convert the String to Upper-case
يحتوي كائن السلسلة my_str الذي تم إنشاؤه على عدد من الدوال أو الأساليب methods التي يمكن عملها عليه. يتم استدعاء هذه الطرق باستخدام اسم الكائنات متبوعًا بعامل النقطة (.) ثم اسم الدالة المراد استخدامها.

كود:
my_str.toUpperCase();

تعمل الدالة toUpperCase() على السلسلة الموجودة في الكائن my_str وهو من النوع String وتحول بيانات السلسلة (أو النص) التي يحتوي عليها الكائن إلى أحرف كبيرة.
يمكن العثور على قائمة بالدوال التي تحتوي عليها الفئة String في مرجع سلسلة الاردوينو Arduino String reference .
فنيا تُسمى String فئة class وتُستخدم لإنشاء كائنات String.

(3) استبدال سلسلة Overwrite a String
يتم استخدام عامل التخصيص assignment operator لتعيين سلسلة جديدة إلى كائن my_str الذي يحل محل السلسلة القديمة.

كود:
my_str = "My new string.";

لا يمكن استخدام عامل التخصيص في سلاسل مصفوفات الأحرف ، ولكنه يعمل على كائنات سلسلة String فقط.

(4) استبدال كلمة في السلسلة Replacing a Word in the String
يتم استخدام الدالة replace() لاستبدال السلسلة الأولى التي تم تمريرها إليها بالسلسلة الثانية التي تم تمريرها إليها. replace() هي دالة أخرى مضمنة في الفئة String وهي متاحة للاستخدام على كائن String وهو my_str.

(5) الحصول على طول السلسلة Getting the Length of the String
يتم الحصول على طول السلسلة بسهولة باستخدام الدالة length() . في برنامج المثال ، يتم تمرير النتيجة التي تم إرجاعها بواسطة length() مباشرةً إلى Serial.println() بدون استخدام متغير وسيط.

متى يتم استخدام كائن سلسلة String Object أو مصفوفة أحرف سلسلة String Character Array
يعتبر استخدام كائن String أسهل بكثير من استخدام مصفوفة أحرف سلسلة. يحتوي الكائن على دوال مضمنة يمكنها إجراء عدد من العمليات على سلاسل موثقة بالكامل في القسم المرجعي على موقع Arduino على الويب.

العيب الرئيسي لاستخدام كائن String هو أنه يستخدم الكثير من الذاكرة ويمكنه استخدام ذاكرة Arduinos RAM بسرعة والتي قد تتسبب في تعليق Arduino أو تعطله أو إنتاج سلوك غير متوقع.
إذا كان البرنامج على Arduino صغيرًا ويحد من استخدام الكائنات ، فلا يجب أن تكون هناك مشاكل.

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

أين يتم استخدام السلاسل Where Strings are Used
تناول هذا الدرس ما هي السلاسل وكيف تبدو في الذاكرة وبعض العمليات التي يمكن القيام بها على السلاسل.
سيتم تغطية الاستخدامات العملية الفعلية للسلاسل في الدرس التالي عندما نتناول كيفية الحصول على إدخال المستخدم من نافذة الشاشة التسلسلية وحفظ الإدخال في سلسلة.
رد مع اقتباس
  #23  
قديم 04-03-2020, 09:28 PM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,819
معدل تقييم المستوى: 23
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي الدرس التاسع عشر الحصول على واستخدام الإدخال التسل

دورة برمجة الاردوينو : الدرس التاسع عشر
الحصول على واستخدام الإدخال التسلسلى والاردوينو Getting and Using Arduino Serial Input

يوضح هذا الدرس كيفية الحصول على البيانات في برنامج الاردوينو من المنفذ التسلسلي serial port. يمكن إرسال البيانات إلى الاردوينو من نافذة المراقبة التسلسلية فى في Arduino IDE.

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

الحصول على الإدخال التسلسلي Getting Serial Input
يوضح البرنامج التالي كيفية الحصول على حرف واحد من نافذة المراقبة التسلسلية Serial Monitor وتحديد ما إذا كان الحرف رقمًا أم لا.

كود:
void setup() {
  Serial.begin(9600);
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
  
    // check if a number was received
    if ((rx_byte >= '0') && (rx_byte <= '9')) {
      Serial.print("Number received: ");
      Serial.println(rx_byte);
    }
    else {
      Serial.println("Not a number.");
    }
  } // end: if (Serial.available() > 0)
}

كيف يعمل البرنامج How the Sketch Works

1- التحقق من وجود حرف Checking for a Character
في الدالة الرئيسية loop() ، يتم استخدام عبارة if للتحقق مما إذا كان الحرف متاحًا على المنفذ التسلسلي - أي إذا تم إرسال حرف من نافذة Serial Monitor واستقبله Arduino.
يتم تشغيل عبارة if هذه بسرعة لتشغيل العبارة if والعودة إلى أعلى الحلقة لتشغيلها مرة أخرى.

كود:
if (Serial.available() > 0) {    // is a character available?
}

لا يتم تشغيل أي شيء في جسم عبارة if حتى يتم استقبال حرف.

2- الحصول على حرف Getting a Character
عند استقبال حرف على المنفذ التسلسلي ، يتم تخزينه في متغير حرف (من نوع char) يسمى rx_byte.

كود:
rx_byte = Serial.read();       // get the character

يتم الآن تخزين نسخة من الحرف المستقبل في المتغير rx_byte ويمكننا استخدام الحرف المستقبل في برنامجنا .

3- التحقق مما إذا كان الحرف المستقبل رقمًا Check if the Received Character is a Number
يختبر البرنامج ما إذا كان الحرف المستقبل رقمًا أم لا عن طريق التحقق مما إذا كان الحرف أكبر من أو يساوي "0" وأقل من أو يساوي "9".

كود:
if ((rx_byte >= '0') && (rx_byte <= '9')) {
}

نحن نتحقق فعليًا من "أحرف الأرقام" من '0' إلى '9' وليس الأرقام الصحيحة الفعلية من 0 إلى 9. وذلك لأن البيانات التي يتم استقبالها من نافذة Serial Monitor تكون بتنسيق ASCII.
من الجدول الذي يظهر أحرف ASCII القابلة للطباعة ، يمكننا أن نرى أن حرف '0' له القيمة الصحيحة 48 عشري وأن حرف '9' له قيمة 57 عشرى . وبعبارة أخرى عند كتابة '0' على لوحة المفاتيح في حقل "إرسال" "send" من نافذة Serial Monitor ويتم النقر فوق الزر إرسال Send ، يتم إرسال القيمة الصحيحة 48 إلى Arduino. في البرنامج ، يمكننا الإشارة إلى هذا الحرف باسم '0' أو 48.
نفس الشيء يمكن كتابة عبارة if باستخدام الأعداد الصحيحة العشرية على النحو التالي:

كود:
if ((rx_byte >= 48) && (rx_byte <= 57)) {
}

سيفعل هذا الكود تمامًا نفس عمل الكود الذي يتحقق من الأحرف.
إذا كان الحرف الذي تم استقباله هو أحد أحرف الأرقام ، فسيتم طباعة حرف الرقم. تهتم عبارة else بأي حرف ليس حرفًا لرقم .

الحصول على إدخال السلسلة Getting String Input
تم استخدام البرنامج السابق للحصول على ومعالجة حرف واحد في كل مرة. سيكون أكثر فائدة إذا تمكنا من الحصول على سلسلة كاملة في كل مرة ، ثم يمكننا الحصول على اسم كدخل ، أو عدد number يتكون من أكثر من رقم digit واحد.

إيجاد نهاية سلسلة Finding the End of a String
السلسلة String هي سلسلة series من الأحرف. حتى نتمكن من قراءة سلسلة من المنفذ التسلسلي في Arduino ، سنحتاج إلى معرفة متى تنتهي السلسلة. إحدى الطرق للقيام بذلك هي إدراج حرف سطر جديد newline في نهاية السلسلة. حرف سطر جديد هو حرف ASCII غير قابل للطباعة يسمى "تغذية السطر" "line feed" في جدول كود ASCII.
حرف line feed له القيمة 10 عشرى ولكن يمكن كتابته كرمز هروب escape في برنامج الاردوينو على النحو التالي: '\n' .
البرنامج التالي هو نسخة معدلة من البرنامج السابق. بالإضافة إلى التحقق مما إذا تم استلام رقم number أو غير رقم non-number ، فإنه يتحقق أيضًا من استلام حرف السطر الجديد newline .
عند تشغيل البرنامج وإرسال حرف من نافذة Serial Monitor ، يجب تغيير إعداد في أسفل نافذة Serial Monitor بحيث يتم إلحاق حرف سطر جديد بالحرف المرسل كما هو موضح في الصورة أسفل البرنامج .

كود:
void setup() {
  Serial.begin(9600);
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
  
    // check if a number was received
    if ((rx_byte >= '0') && (rx_byte <= '9')) {
      Serial.print("Number received: ");
      Serial.println(rx_byte);
    }
    else if (rx_byte == '\n') {
      Serial.println("Newline");
    }
    else {
      Serial.println("Not a number.");
    }
  } // end: if (Serial.available() > 0)
}

قبل تشغيل البرنامج ، تأكد من ضبط نافذة شاشة Arduino Serial Monitor على "Newline" كما هو موضح في هذه الصورة.



عندما يتم تعيين "Newline" في نافذة Serial Monitor ، فإن كل ما يتم كتابته في حقل "send" في نافذة Serial Monitor ، سيتبعه حرف سطر جديد.
تم استخدام else if لاختبار إذا ما تم تلقي حرف سطر جديد كما هو موضح في هذا السطر من التعليمات البرمجية.

كود:
else if (rx_byte == '\n') {

يتحقق هذا الكود من وجود حرف السطر الجديد الذي يمثله '\n' ويطبع "Newline" في نافذة Serial Monitor إن وجدت.

قراءة سلسلة Reading a String
يقرأ البرنامج أدناه سلسلة في Arduino ويستخدم حرف السطر الجديد لتحديد متى تنتهي السلسلة.

كود:
void setup() {
  Serial.begin(9600);
  Serial.println("Enter your name.");
}

char rx_byte = 0;
String rx_str = "";

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
    
    if (rx_byte != '\n') {
      // a character of the string was received
      rx_str += rx_byte;
    }
    else {
      // end of string
      Serial.print("Welcome ");
      Serial.println(rx_str);
      rx_str = "";                // clear the string for reuse
      Serial.println("");
      Serial.println("Enter your name.");
    }
  } // end: if (Serial.available() > 0)
}

يتم الحصول على كل حرف فردي من السلسلة بنفس الطريقة مثل البرامج السابقة وتخزينها في المتغير rx_byte.
إذا لم يكن الحرف مساويًا لحرف السطر الجديد ، فسيتم إضافته إلى الكائن rx_str للفئة String.

كود:
 if (rx_byte != '\n') {
  // a character of the string was received
  rx_str += rx_byte;
}

سطر الكود

كود:
rx_str += rx_byte;

بالضبط مثل:

كود:
rx_str = rx_str + rx_byte;

فهو ببساطة يضع كل حرف في نهاية السلسلة لبناء السلسلة من الأحرف المستلمة.
بعد تجميع السلسلة ، سيتم استلام حرف السطر الجديد الذي سيقوم بعد ذلك بتشغيل عبارة else ويتم طباعة السلسلة المستلمة إلى نافذة Serial Monitor كجزء من رسالة ترحيب.

الحصول على رقم Getting a Number
عندما يتم استلام رقم من نافذة Serial Monitor ، فإنه يكون عبارة عن سلسلة من أحرف الأرقام ويجب تحويلها إلى رقم يمكن تخزينه في متغير لرقم مثل عدد صحيح أو int .
يتحقق البرنامج التالي لمعرفة أن الأحرف المستلمة هي أحرف رقمية ثم يحول الرقم إلى عدد صحيح.

كود:
void setup() {
  Serial.begin(9600);
  Serial.println("Enter a number to multiply by 2.");
}

char rx_byte = 0;
String rx_str = "";
boolean not_number = false;
int result;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
    
    if ((rx_byte >= '0') && (rx_byte <= '9')) {
      rx_str += rx_byte;
    }
    else if (rx_byte == '\n') {
      // end of string
      if (not_number) {
        Serial.println("Not a number");
      }
      else {
        // multiply the number by 2
        result = rx_str.toInt() * 2;
        // print the result
        Serial.print(rx_str);
        Serial.print(" x 2 = ");
        Serial.print(result);
        Serial.println("");
        Serial.println("Enter a number to multiply by 2.");
      }
      not_number = false;         // reset flag
      rx_str = "";                // clear the string for reuse
    }
    else {
      // non-number character received
      not_number = true;    // flag a non-number
    }
  } // end: if (Serial.available() > 0)
}

• بناء السلسلة Building the String
يتم بناء سلسلة من الأحرف المستلمة كما تم في البرنامج السابق. إذا كان أي حرف مستلم ليس حرف رقم ، فسيتم تعيين المتغير not_number على true كإشارة أو"علم" flag على أنه تم استلام حرف غير رقمي.

• استخدام العلم المنطقي Using a Boolean Flag
المتغير not_number هو من نوع Boolean (منطقي) يمكن أن يكون له قيمة صواب true أو خطأ false . في البرنامج ، يتم استخدام هذا المتغير كعلامة flag يتم التحقق منها لاحقًا لمعرفة ما إذا تم استلام أي أحرف غير رقمية.
بعد استلام السلسلة الكاملة ، التي تحدث عند استلام حرف السطر الجديد ، يتم التحقق من علامة المتغير not_number ويتم عرض رسالة إذا لم يكن أي حرف تم استلامه رقمًا.

• معالجة السلسلة Processing the String
إذا كانت جميع الأحرف المستلمة عبارة عن أرقام ، يتم تحويل السلسلة إلى عدد صحيح باستخدام rx_str.toInt() ، مضروبة في 2 والنتيجة تخزن في المتغير result . نتيجة الحساب يتم طباعتها في نافذة المراقبة التسلسلية.

• قيود البرنامج Sketch Limitations
هناك بعض القيود على هذا البرنامج . لا يمكننا الحصول على نتيجة عند إرسال رقم سالب إلى Arduino لأن علامة الطرح ستؤدي إلى إنطلاق (تشغيل) علامة المتغير not_number. حجم الرقم الذي يمكن ضربه محدود أيضًا بحجم عدد موجب على Arduino.

رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

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

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة



الساعة الآن 06:00 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
الحقوق محفوظة لمنتديات الاليكترونيات العصرية

Security team

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77