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

الأردوينو Arduino للمبتدئين

اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الأردوينو Arduino للمبتدئين

مُساهمة من طرف Admin الإثنين مارس 16, 2020 11:44 am

الأردوينو Arduino للمبتدئين

ما هو الأردوينو What is an Arduino?

مقدمة :
الأردوينو Arduino هو عبارة عن منصة platform مفتوحة المصدر تستخدم لبناء مشاريع الالكترونيات. يتكون الأردوينو من هاردوير hardware وهو لوحة دائرة مطبوعة قابلة للبرمجة (يشار إليها غالبًا باسم المتحكم الدقيق أو الميكروكونترولر microcontroller ) ، وقطعة من البرمجيات software ، أو IDE (بيئة التطوير المتكاملة Integrated Development Environment ) التي تعمل على جهاز الكمبيوتر الخاص بك ، وتستخدم لكتابة وتحميل كود الكمبيوتر إلى اللوحة . الميكروكونترولر هو كمبيوتر صغير مدمج فى شكل شريحة دائرة متكاملة .  
أصبحت منصة Arduino ذات شعبية كبيرة بين الأشخاص الذين بدأ للتو في استخدام الإلكترونيات ولسبب (مبرر) وجيه. على عكس معظم لوحات الدوائر القابلة للبرمجة السابقة ، فإن Arduino لا يحتاج إلى قطعة منفصلة من الأجهزة (الهاردوير)  (تسمى مبرمج programmer ) من أجل تحميل كود جديد على اللوحة - يمكنك ببساطة استخدام كابل USB. بالإضافة إلى ذلك ، تستخدم بيئة التطوير  Arduino IDE نسخة مبسطة من لغة  C++ ، مما يجعل من السهل تعلم البرمجة.
تعد لوحة "الأونو"  Uno واحدة من اللوحات الأكثر شهرة في عائلة الاردوينو  Arduino وهي خيار رائع للمبتدئين. سنتحدث عنها وما الذي يمكنها القيام به لاحقًا .

الأردوينو Arduino للمبتدئين  8f2449a60e4e4f558592b13f340949b2
الأردوينو Arduino للمبتدئين  72d4762b3bb542e58b5e15e4e17f102b
Arduino Uno


الأردوينو Arduino للمبتدئين  5e53b53ee14543a8844e60e7dd660ee1
الأردوينو Arduino للمبتدئين  A6ad52d664704f77ab7b7ea4191faad7
Arduino IDE.
صدق أو لا تصدق ، تلك الأسطر من الكود هي كل ما تحتاجه لوميض الليد LED الموجود على متن لوحة  Arduino. قد لا تكون الشفرة منطقية تمامًا في الوقت الحالي ، ولكن بعد قراءة هذه الدروس سوف يكون لك رأى آخر !

ماذا تفعل؟ What Does it Do?
تم تصميم أجهزة وبرامج الاردويتو  Arduino للفنانين والمصممين والهواة والهاكروالمبتدئين وأي شخص مهتم بإنشاء كائنات أو بيئات تفاعلية. يمكن أن يتفاعل Arduino مع الأزرار buttons والليدات LED والمحركات ومكبرات الصوت ووحدات GPS والكاميرات والإنترنت وحتى هاتفك الذكي أو التلفزيون الخاص بك! هذه المرونة مقترنة بحقيقة أن برنامج Arduino مجاني وأن لوحات الأجهزة رخيصة جدًا وأن كل من البرمجيات والأجهزة سهلة التعلم مما أدى إلى مجتمع كبير من المستخدمين الذين ساهموا بالكود وإصدار تعليمات لمجموعة متنوعة كبيرة من المشاريع القائمة على الاردوينو.
يمكن استخدام Arduino كأدمغة (عقول) وراء أي مشروع إلكترونيات تقريبًا ، في كل شيء .

ما ذا يوجد على متن لوحة الأردوينو ؟
هناك العديد من أنواع لوحات Arduino والتي يمكن استخدامها لأغراض مختلفة. تبدو بعض اللوحات مختلفة قليلاً عن تلك الموجودة أدناه ، ولكن معظم لوحات Arduino لديها غالبية هذه المكونات المشتركة :

الأردوينو Arduino للمبتدئين  1a49fa03c0544a76b04d396b47ed38df

الأردوينو Arduino للمبتدئين  Ee95d55cabaa4cbdb212fd51e85d193e
1- مصدر القدرة الكهربية Power  :
كل لوحة Arduino تحتاج إلى وسيلة لتوصيل مصدر القدرة . يمكن تشغيل Arduino UNO من كابل USB قادم من جهاز الكمبيوتر الخاص بك أو من مصدر قدرة حائط (أدابتر) والذي ينتهى بجاك على شكل برميل. في الصورة أعلاه ، يتم تمييز وصلة USB بالرقم (1) ، ووصلة الأدابتر بالرقم (2) .
التوصيل من خلال USB هو أيضًا الطريقة التي سيتم بها تحميل الكود على لوحة Arduino.
ملاحظة: يتراوح الجهد الموصى به لمعظم طرازات  Arduino بين 7  و 12 فولت.

2- الأطراف (5V, 3.3V, GND, Analog, Digital, PWM, AREF) :
الأطراف الموجودة على Arduino هي الأماكن التي تقوم فيها بتوصيل الأسلاك لإنشاء دائرة (ربما مع لوحة تجارب وبعض الأسلاك). وعادةً ما تحتوي على "رؤوس" بلاستيكية سوداء تسمح لك بتوصيل السلك مباشرة باللوحة. تحتوي لوحة الأردوينو على عدة أنواع مختلفة من الأطراف ، يتم تمييز كل منها بكتابة على اللوحة وتستخدم في وظائف مختلفة.
• الأطراف GND(3) : اختصار لكلمة "أرضى" Ground . يوجد العديد من أطراف GND على لوحة الأردوينو ، يمكن استخدام أى منها كأرضى (مشترك) للدائرة .
• الأطراف 5V (4) & 3.3V (5) : كما هو واضح من التسمية ، للإمداد supply بالجهد 5V و 3.3V . معظم المكونات البسيطة التى تستخدم مع الأردوينو تعمل على جهد 5V أو 3.3V .
• الأطراف Analog (6) : منطقة الأطراف تحت المسمى “ANALOG IN” (الأطراف A0 إلى A5 فى الأونو) هى أطراف دخل تناظرى Analog . هذه الأطراف يمكن أن تقرأ read الإشارة من حساس تناظرى (مثل حساس درجة الحرارة) وتحوله إلى قيمة رقمية ليتم معالجتها .
• الأطراف Digital (7) : على الجهة المقابلة للمداخل التناظرية توجد الأطراف الرقمية DIGITAL ( الطرف 0 إلى الطرف 13  على الأونو) . هذه الأطراف يمكن أن تستخدم فى أى من المدخلات الرقمية digital input ( مثل الإخبار عن حالة الضغط على مفتاح ) أو مخرجات رقمية digital output ( مثل حالة توصيل قدرة إلى ليد LED ) .
• الأطراف PWM (Cool :  ربما لاحظت الرمز  (~) بجانب بعض الأطراف الرقمية (3 و 5 و 6 و 9 و 10 و 11 على UNO). تعمل هذه الأطراف كأطراف رقمية عادية ، ولكن يمكن استخدامها أيضًا في شيء يسمى تعديل عرض النبض (PWM). فكر في هذه الأطراف على أنها قادرة على محاكاة الإخراج التناظرى (مثل خفوت أى تلاشي إضاءة  LED داخل وخارج).  
• الطرف AREF (9 : "المرجع التناظرى" Analog Reference . معظم الوقت يمكن ترك هذا الطرف من دون استخدام . أحيانا يستخدم لضبط set جهد المرجع التناظرى الخارجى ( بين 0V و 5V ) كحد أعلى upper limit لأطراف الدخل التناظرى .

3- مفتاح الإعادة (الريست)   Reset Button
تحتوي لوحة Arduino على زر الإعادة reset (10). سيؤدي الضغط عليه إلى توصيل طرف إعادة التعيين مؤقتًا بالأرض وإعادة تشغيل أي كود يتم تحميله على Arduino. قد يكون ذلك مفيدًا للغاية إذا لم يتم تكرار الكود ، ولكنك تريد اختباره عدة مرات.
4- ليد بيان القدرة الكهربية Power LED Indicator
أسفل ويمين كلمة "UNO" على اللوحة ، يوجد ليد LED صغير بجانب كلمة ‘ON’ (11) . يجب أن يضيء الليد LED هذا عندما تقوم بتوصيل Arduino بمصدر قدرة كهربية . إذا لم يتم تشغيل هذا الضوء ، فهذا بيان على حدوث خطأ.
5- ليدات الإرسال والاستقبال TX RX LEDs
TX اختصار للإرسال transmit  ، RX اختصار للاستقبال receive . تظهر هذه الليدات حالة الأطراف المسؤولة عن الاتصال التسلسلي. في حالتنا ، يوجد مكانان على Arduino UNO يظهر فيهما TX و RX - المرة الأولى عند الأطراف الرقمية 0 و 1 ، ومرة أخرى بجانب ليدات بيان TX و RX (12) . ستمنحنا الليدات هذه بعض المؤشرات المرئية اللطيفة عندما يتلقى Arduino بياناتنا أو ينقلها (مثل عندما نقوم بتحميل برنامج جديد على اللوحة ).
6- الدائرة المتكاملة الرئيسية Main IC :
الشيء الأسود ذات الأرجل المعدنية هو IC ، أو دائرة متكاملة (13). فكر فيها كمخ (دماغ) brains  الأردوينو . يختلف IC الرئيسي في Arduino قليلاً من نوع لوحة إلى نوع لوحة آخر  ، ولكنه عادة ما يكون من نوع ATmega وهو من شركة ATMEL. قد يكون هذا مهمًا ، حيث قد تحتاج إلى معرفة نوع IC (جنبًا إلى جنب مع نوع اللوحة الخاصة بك) قبل تحميل برنامج جديد من برنامج Arduino. عادة ما يمكن العثور على هذه المعلومات مكتوبة على الجانب العلوي من IC. إذا كنت تريد معرفة المزيد عن الفرق بين مختلف IC ، فإن قراءة الداتا شيت غالبًا ما تكون فكرة جيدة.
7- منظم الجهد Voltage Regulator
منظم الجهد (14) ليس في الواقع شيئًا يمكنك أن تتفاعل معه على Arduino. لكن من المحتمل أن نعرف أنه موجود وما هو المقصود منه . يقوم منظم الجهد بعمل ما يعنيه اسمه بالضبط - إنه يتحكم في مقدار الجهد المسموح بدخوله إلى لوحة Arduino. فكر في الأمر كنوع من حارس البوابة ؛ سيؤدي ذلك إلى التخلص من الجهد الإضافي الذي قد يضر الدائرة. بالطبع ، له حدود ، لذلك لا تقم بتوصيل اردوينو الخاص بك بأي شيء يزيد عن 20 فولت.


عدل سابقا من قبل Admin في الخميس مارس 19, 2020 10:44 am عدل 1 مرات

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty بيئة التطوير المتكاملة للأردوينو Arduino IDE

مُساهمة من طرف Admin الأربعاء مارس 18, 2020 12:17 pm

بيئة التطوير المتكاملة للأردوينو Arduino IDE

1- مقدمة
بيئة التطوير المتكاملة للأردوينو Arduino integrated development environment (IDE) هى البرنامج الذي من خلاله يتم كتابة (تحرير) الكود البرمجي للوحة الأردوينو بلغة السى C، وتحميله إليها. تتسم بيئة التطوير بالبساطة وسهولة التعامل، وتحتوي على كل ما يحتاجه المبرمج لكتابة الشيفرة، وتعمل على أنظمة التشغيل المختلفة: Linux، Mac OSX ،Windows .
تعرف البرامج المكتوبة باستخدام بيئة التطوير Arduino IDE باسم "سكتش" sketch، ويتم تخزينها في الحاسب بملف يأخذ الامتداد ino.

2- تحميل بيئة التطوير المتكاملة للاردوينو Arduino IDE
يمكن تحميل Arduino IDE من الموقع الرسمي لمطوري الاردوينو من الرابط التالي:

https://www.arduino.cc/en/Main/Software

الأردوينو Arduino للمبتدئين  894d1ee9a021477d856d9fc6f6808bf4


بعد فتح الرابط نختار نظام التشغيل ومن ثم just download ليبدأ التحميل مباشرة ومجانا.
قم بفك الضغط للملف المحمل الذي يحتوي على برنامج بيئة التطوير وتعاريف ومكتبات وأمثلة وغيرها. قم بتشغيل برنامج Arduino.exe لتعمل بيئة التطوير مباشرة من دون الحاجة إلى تنصيب setup .

الأردوينو Arduino للمبتدئين  81ab12d8a92e4fa8827d4af65e257fda


3- بيئة التطوير المتكاملة للاردوينو Arduino IDE
يوضح الشكل أدناه واجهة بيئة التطوير Arduino IDE التي تتكون من الأجزاء التالية:
1. شريط أدوات القوائم menu toolbar.
2. شريط أدوات الوظائف الشائعة common functions toolbar.
3. محرر النص text editor .
4. منطقة الرسالة message area .
5. لوحة مراقبة (كونسول) النص text console.

الأردوينو Arduino للمبتدئين  Fed0d67241ff4db29cde076993afcc87


1- شريط أدوات القوائم
يحتوي هذا الشريط على خمس قوائم هي: File – Edit – Sketch – Tools – Help. في كل قائمة عدد من الوظائف.

تتضمن القائمة File عدد من الوظائف :
New: إنشاء نموذج جديد للمحرر.

Open: لفتح ملف مخزن.

Open Recent: تقدم قائمة قصيرة لأحدث الملفات البرمجية (sketch) لفتحها.

Sketchbook : يعرض الاسكتشات الحالية داخل هيكل مجلد sketchbook؛ يؤدي النقر على أي اسم إلى فتح الاسكتش المقابل في نسخة محرر جديدة.

Examples: تحتوي أمثلة مقدمة من بيئة التطوير.

Close: إغلاق المحرر الذي يتم العمل عليه.

Save: حفظ الملف البرمجي بنفس االاسم.

Save as: حفظ الملف البرمجي باسم مختلف.

Page setup: إعداد الصفحة للطباعة.

Print: طباعة الملف البرمجي.

Preferences: يتم فتح نافذة التفضيلات لضبط بعض إعدادات بيئة التطوير مثل لغة الواجهة.

Quit: يتم إغلاق كافة نوافذ بيئة التطوير.


الأردوينو Arduino للمبتدئين  258f967057854289a5c2a1fdcc1d6372

الأردوينو Arduino للمبتدئين  Aae45ec843f944efb6824631e517e908


تتضمن القائمة Edit عددا من الوظائف الخاصة بالنسخ، والقص ، واللصق، والتراجع، والبحث.


الأردوينو Arduino للمبتدئين  6cd5907e776e4e19851675a38e82c317

تتضمن القائمة Sketch الوظائف التالية:

Verify/Compile: لفحص النص البرمجي من الأخطاء، مع تقديم معلومات عن مقدار استخدام ذاكرة البرنامج وذاكرة
RAM في منطقة مراقبة النص text area.
Upload: يتم تحويل الملف البرمجي إلى ترميز آلة ومن ثم يتم تحميل الملف الثنائي إلى اللوحة عبر المنفذ الذي تم إعداده. (قبل تحميل الملف للوحة يتم اختيار اللوحة بشكل صحيح من القائمة Tools>Board، واختيار منفذ
COM الصحيح أثناء وصل اللوحة مع الحاسب وذلك من القائمة Tools>Port ) .

Upload Using Programmer: يستخدم هذا الأمر لنقل
الملف البرمجي إلى اللوحة عن طريق مبرمجة خارجية. يتم الكتابة على محمل الإقلاع bootlaoder، وتستخدم كامل
سعة ذاكرة البرنامج.

Export Compiled Binary : يتم تخزبن ملف .hex (ملف ترميز لغة الآلة مكتوب بصيغة ست عشري
hexadecimal لاستخدامه في برنامج محاكاة، أو تحميله للوحة عن طريق أدوات أخرى).

Show Sketch folder: فتح مجلد الشيفرة البرمجية sketch الحالي.

Include library: إضافة مكتبات إلى الشيفرة البرمجية sketch الحالي بإضافة التعبير include# بداية الشيفرة.

Add File: إضافة ملف برمجي، ويتم نسخه إلى مكان الشيفرة البرمجية الحالية.

الأردوينو Arduino للمبتدئين  50fe8c3f895043da91f82db7aeee50b3

تتضمن القائمة Tools الوظائف التالية:
Auto Format: يجعل الشيفرة البرمجية تظهر بشكل أنيق.

Archive Sketch: يتم أرشفة نسخة للشيفرة البرمجية الحالية بتنسيق zip.

Serial Monitor: فتح نافذة المراقبة التسلسلية.

Board: يتم تحديد اللوحة التي يتم العمل بها.

Port: تحتوي هذه القائمة على كل المنافذ التسلسلية المعرفة على الحاسب (فعلية أو ظاهرية). من خلالها يتم اختيار المنفذ الذي يتصل مع لوحة الأردوينو.

Programmer: تستخدم لاختيار المبرمجة عندما يتم برمجة اللوحة من دون استخدام لوصلة USB-serial. في العادة لن تحتاج إلى ذلك، إلا إذا أردت تحميل محمل الإقلاع bootloader إلى الميكروكونترولر .

Burn Bootloader: تستخدم لنقل محمل الإقلاع bootloader إلى ميكروكونترولر الوحة.

الأردوينو Arduino للمبتدئين  728551152a6245929a26c7bdf46d2963


2- أدوات شريط الوظائف الشائعة common functions toolbar:

Verify: لفحص النص البرمجي من الأخطاء.

Upload: يتم تحويل الملف البرمجي إلى ترميز الآلة ومن ثم يتم تحميل الملف الثنائي إلى اللوحة عبر المنفذ الذي تم إعداده.

New: إنشاء نموذج جديد للمحرر.

Open: لفتح ملف مخزن.

Save: حفظ الملف البرمجي.
Serial Monitor: فتح نافذة المراقبة التسلسلية.

الأردوينو Arduino للمبتدئين  63895cc6aafc4411a1cd40616fd132c9

3- محرر النص text editor :
في محرر النص يتم كتابة الشيفرة البرمجية الخاصة بعمل لوحة الأردوينو كما هو موضح في الشكل أدناه (كيفية كتابة الشيفرة البرمجية في بيئة التطوير هو ما سنتعلمه لاحقا .

الأردوينو Arduino للمبتدئين  4da5b3b54c72453e998a07bd979d9420

4- منطقة الرسالة message area :
تقدم معلومات تفاعلية أثناء الحفظ، والتصدير، وتعرض الأخطاء كما هو موضح في الشكل أدناه .

الأردوينو Arduino للمبتدئين  F355b391c8f2475fafe52d030c52b2b6

5- لوحة مراقبة (كونسول) النص text console :
تعرض معلومات عن نتائج الشيفرة البرمجية مثل نسبة استخدام الذواكر، وأماكن التخزين، ورسائل الأخطاء كاملة، وغير ذلك كما هو موضح في الشكل أدناه .

الأردوينو Arduino للمبتدئين  A9ca87c359d940a997da2eec74d7278d

تعرض الزاوية اليمنى السفلية للواجهة اللوحة والمنفذ التسلسلي اللذين تم إعدادهما كما هو موضح في الشكل أدناه .


الأردوينو Arduino للمبتدئين  Edcc1ef1c1864d5aa10e0b9de6a1416f




Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty دورة برمجة اردوينو Arduino Programming Course :

مُساهمة من طرف Admin الأحد مارس 22, 2020 12:30 pm

دورة برمجة اردوينو Arduino Programming Course :

المقدمة والمتطلبات Introduction and Requirements :
تعلم لغة برمجة الاردوينو Arduino والبدء في كتابة البرامج (الاسكيتشات sketches ) الخاصة بك .
تركز دورة برمجة Arduino هذه على تعليم لغة برمجة Arduino وتتكون من عدد من الأجزاء المختلفة ، كل منها يغطي موضوعًا مختلفًا.
في نهاية الدورة ، سيكون لديك ما يكفي من المعرفة والثقة لبدء كتابة البرامج (الاسكيتشات) الخاصة بك من أجل الاردوينو Arduino.

المتطلبات الأساسية للدورة :
قبل البدء ، ستحتاج إلى الأجهزة hardware التالية والمعرفة الأساسية حول Arduino.

متطلبات الأجهزة Hardware Requirements :
• لوحة Arduino Uno أو لوحة Arduino مماثلة (مثل Arduino Mega)
• كبل USB لتشغيل (لتغذية) وبرمجة لوحة Arduino من مقبس (وصلة) USB للكمبيوتر الشخصي
• لوحة تجارب Breadboard ومكونات كما هو محدد في الأجزاء المختلفة من هذه الدورة

الأردوينو Arduino للمبتدئين  C55b7496382e491fbf02fe41504e93a3


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

متطلبات البرمجيات Software Requirements :
ستحتاج إلى أحدث إصدار من بيئة التطوير المتكاملة للاردوينو Arduino IDE لنظامك الأساسي (متوفر لنظام التشغيل Linux و Windows و Mac).
تستخدم هذه الدورة Arduino IDE الإصدار 1.8.1 الذي كان أحدث إصدار في وقت تحديث هذه الدورة. يجب أن يعمل الإصدار 1.0 أو الأحدث.

مع الأجهزة والبرمجيات والمهارات المذكورة أعلاه ، فأنت على استعداد لبدء الدورة.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الأول : بناء وتدفق برنامج الاردوينو Arduino Sketch Structure and Flow :

مُساهمة من طرف Admin الأحد مارس 22, 2020 7:45 pm

دورة برمجة الاردوينو : الدرس الأول :

بناء وتدفق برنامج "سكيتش" الاردوينو Arduino Sketch Structure and Flow :

في هذا الدرس من برمجة Arduino ، سوف نبحث فى البناء (الهيكل) الأساسي لبرنامج (سكيتش) الاردوينو وتنفيذ تعليمات البرنامج من أعلى إلى أسفل (تدفق أو سريان البرنامج program flow ).

أولا : بناء (هيكل) برنامج (سكيتش) الاردوينو Arduino Sketch Structure :

يتكون برنامج الاردوينو الأساسي من "دالتين" functions تسمى "دالة الإعداد " setup() و "دالة الحلقة" loop() .

• إفتح بيئة التطوير Arduino IDE وحدد File → Examples → 01.Basics → BareMinimum (BareMinimum تعنى الحد الأدنى) لرؤية الدالتين . تظهر هاتان الدالتان الآن في نافذة Arduino IDE جديدة .

الأردوينو Arduino للمبتدئين  Aeaffc9661614d71be801ba5acacbbce


ما هي الدالة Function ؟
سيتم تغطية الدوال بمزيد من التفصيل لاحقًا ، والآن ستحتاج فقط إلى معرفة ما يلي حول الدوال :
• يجب أن يكون لجميع الدوال اسم فريد ، و setup هو مثال على اسم الدالة الفريد(setup و loop هي دوال خاصة في برمجة Arduino وتشكل جزءًا من بناء الاسكيتش الأساسي).
• يتبع اسم الدالة بفتح وإغلاق الأقواس () التي قد تحتوي أو لا تحتوي على شيء.
• يجب أن يكون لجميع الدوال نوع إرجاع return type . لكل من setup و loop نوع الإرجاع "فارغ" void .
• يتكون جسم body الدالة من قوس فتح وإغلاق ({و}).

برنامجك الأول : عرض رسالة الترحيب "Hello, world!" :
من تقاليد البرمجة كتابة برنامج ترحيب "hello world" كلما بدأت في تعلم لغة برمجة جديدة.
برنامج "hello world" يكتب ببساطة النص "Hello, world!" على الشاشة. الغرض من هذا البرنامج هو التحقق من أن بيئة البرمجة الخاصة بك مثبتة وتعمل بشكل صحيح. إذا كان برنامج "hello world" يعمل ، فأنت مستعد لبدء تعلم لغة البرمجة الجديدة.
لا يحتوي Arduino على شاشة لكتابة النص "hello world" ، ولكن يمكننا استخدام منفذ USB ونافذة الشاشة التسلسلية serial monitor window .

1- كتابة البرنامج (الاسكتش) :
قم بتعديل البرنامج BareMinimum الذي قمت بفتحه مسبقًا كما يلي:

الكود:
void setup() {
  Serial.begin(9600);
  Serial.println("Hello, world!");
}

void loop() {
}

احفظ البرنامج المعدل باسم hello_world في مجلد الاسكيتشات عن طريق تحديد File → Save As… من قائمة Arduino IDE ثم إعادة تسمية الملف إلى hello_world.

2- تشغيل البرنامج :
قم بتوصيل Arduino بجهاز الكمبيوتر الخاص بك باستخدام كابل USB. انقر فوق الزر تحميل Upload لتحميل البرنامج إلى Arduino.
• الآن افتح نافذة الشاشة التسلسلية Arduino IDE لرؤية تشغيل الاسكيتش وطباعة الرسالة النصية.
يجب أن تبدو نتيجة تشغيل الاسكيتش كما يلي:

الأردوينو Arduino للمبتدئين  53afda2bd19b4a349d3098e305fe1005


يجب أن يكون النص الذي يخرجه البرنامج مرئيًا في نافذة الشاشة التسلسلية.

3- اكتشاف الأخطاء :
أ‌- أخطاء البرمجة (الترجمة) :
أي شيء في سطور التعليمات البرمجية أعلاه والذي يتم كتابته في نافذة IDE بشكل غير صحيح سيؤدي على الأرجح إلى خطأ في الترجمة ، لذا تأكد من كتابة كل شيء تمامًا كما هو موضح في الكود أعلاه. يتم ترجمة البرنامج عند النقر على الزر Verify "التحقق" (أيقونة علامة صح ) أو الزر Upload "التحميل" (أيقونة السهم الأفقي).
سيظهر خطأ في الترجمة في الجزء السفلي من Arduino IDE كما هو موضح في الصورة أدناه.

الأردوينو Arduino للمبتدئين  1a9aaa1e1abc4d72a884b6c19b743c86


في هذا المثال ، تم ترك الفاصلة المنقوطة (Wink عند نهاية هذا السطر: Serial.println("Hello, world!") والذي تسبب في عرض Arduino IDE لرسالة الخطأ.

ب‌- أخطاء الإعداد Setup Faults :
إذا واجهتك مشاكل في تحميل uploading الاسكتش إلى Arduino ، فتأكد من تحديد لوحة Arduino الصحيحة ضمن Tools → Board ومن تحديد المنفذ التسلسلي الصحيح ضمن Tools → Serial Port.

ت‌- خطأ تحديد (ضبط) معدل البود Baud Rate Setting Fault :
إذا تم تحميل uploaded الاسكتش بنجاح ، فإن المشكلة الوحيدة التي يمكن أن تمنع ظهور النص في نافذة الشاشة التسلسلية هي إذا لم يتم ضبط معدل البود (سرعة نقل البيانات) في الجزء السفلي الأيمن من نافذة الشاشة التسلسلية على 9600 كما هو موضح في شكل تشغيل البرنامج أعلاه.

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

1- أجزاء الاسكتش Parts of a Sketch :
تظهر الصورة أدناه أجزاء سكيتش الاردوينو. "العبارات" Statements هي سطور الكود (التعليمات البرمجية) التي يتم تنفيذها أثناء تشغيل البرنامج. يتم إنهاء كل عبارة بفاصلة منقوطة (Wink .

الأردوينو Arduino للمبتدئين  Cb7574e798bc414d896d03c0e10ceffe

2- كيف يعمل سكيتش (برنامج) Hello World
في برنامج Hello World ، يتم تشغيل العبارات في الدالة setup() أولاً ، من الأعلى إلى الأسفل. العبارة Serial.begin(9600); هي العبارة الأولى في الدالة setup() ، لذلك يتم تشغيلها أولاً. تقوم هذه العبارة بضبط سرعة المنفذ التسلسلي على 9600 بود. يجب أن يتطابق إعداد الاتصال بالبود في نافذة الشاشة التسلسلية مع هذه القيمة بحيث يتصل Arduino ونافذة الشاشة التسلسلية بنفس السرعة.
العبارة الثانية المطلوب تشغيلها في الدالة setup() هي Serial.println("Hello, world!"); والتى ترسل النص Hello, world! للخروج من المنفذ التسلسلي / USB للعرض في نافذة الشاشة التسلسلية. في هذه العبارة ، يمكن وضع أي نص بين علامتي التنصيص ("") وسيتم عرضه في نافذة الشاشة التسلسلية.

3- دالة الإعداد The setup() Function :
يتم تشغيل العبارات Statements في الدالة setup() مرة واحدة فقط ، في كل مرة يتم فيها تشغيل البرنامج . يبدأ البرنامج بعد ذلك في تنفيذ العبارات في الدالة loop() .
يتم تشغيل البرنامج بعد برمجته في Arduino. سيؤدي فتح نافذة الشاشة التسلسلية إلى إعادة تعيين (ريست reset ) Arduino ويؤدي إلى تشغيل البرنامج مرة أخرى.
يمكن أيضًا إعادة تشغيل البرنامج بالضغط على زر الإعادة reset على Arduino أو فصل ثم إعادة توصيل الطاقة للاردوينو Arduino.

4- دالة الحلقة The loop() Function :
سيتم تشغيل العبارات في الدالة loop() بشكل مستمر من أعلى إلى أسفل ثم تعود إلى الأعلى.
إذا كانت الدالة loop() تحتوي على عبارتين ، فسيتم تنفيذ العبارة الأولى ، ثم العبارة الثانية ، ثم العبارة الأولى مرة أخرى وهكذا في حلقة loop .
نظرًا لعدم وجود عبارات في الدالة loop() في مثال hello world الخاص بنا ، سينتهي تنفيذ البرنامج في الحلقة ويتعثر (يعلق) هناك ولا يفعل شيئًا.
من المهم أن يكون لديك الدالة loop() في البرنامج ، حتى لو كانت فارغة ، لأنه بدونها سيحاول المتحكم الدقيق الموجود على لوحة Arduino تنفيذ أي شيء يجده بعد ذلك في الذاكرة بعد أن تكون العبارات في الدالة setup() قد تم تنفيذها . سيحاول المتحكم تنفيذ كل ما يجد في الذاكرة كتعليمات ، ولكن الدالة loop() تمنعه من القيام بذلك عن طريق الحفاظ على تنفيذ البرنامج في الحلقة.
في الدرس التالي ، سنضع بعض عبارات البرنامج في الدالة loop() لمعرفة كيفية عملها.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty دورة برمجة الاردوينو : الدرس الثانى : الحلقة الرئيسية Main Loop لبرنامج الاردوينو

مُساهمة من طرف Admin الإثنين مارس 23, 2020 12:41 pm

دورة برمجة الاردوينو : الدرس الثانى :
الحلقة الرئيسية Main Loop لبرنامج (اسكيتش) الاردوينو واستدعاء الدوال Calling Functions :

يوضح هذا الدرس ما هي الحلقة loop في البرمجيات وكيف تعمل الحلقة الرئيسية من برنامج (سكيتش) Arduino.
تقوم الدالة function في البرنامج (الاسكيتش) بمهمة ما (أي تؤدي وظيفة function). نقول إننا "نستدعى دالة " عندما نستخدم دالة لأداء مهمتها المحددة.

الحلقة الرئيسية The Main Loop :
كما هو موضح في السابق ، يتكون برنامج (سكيتش) الاردوينو من دالتين رئيسيتين تسميان setup() و loop() . الدالة loop() هي الحلقة الرئيسية في برنامج (سكيتش) الاردوينو. بعد تنفيذ العبارات التي تحتاج فى تشغيلها لمجرد مرة واحدة والانتهاء من تنفيذها في الدالة setup() ، يبدأ تنفيذ البرنامج في الدالة loop() .
بمجرد بدء تنفيذ البرنامج في الحلقة الرئيسية ، سيتم تنفيذ العبارات في الحلقة الرئيسية بشكل مستمر حتى يتم إيقاف تشغيل Arduino أو إعادته (ريست) reset . الحلقة الرئيسية هي المكان الذي يتم فيه الوظيفة التشغيلية الفعلية للاردوينو Arduino - على سبيل المثال ، إذا تمت برمجة Arduino ليكون جهاز ضوء وامض متتابع ، فسيتم وضع وظيفة الضوء الوامض في الحلقة الرئيسية.

لماذا يطلق عليها حلقة Loop ؟
سيتم تنفيذ العبارات في الدالة loop() من أعلى إلى أسفل ، حتى يتم الوصول إلى الجزء السفلي من الدالة loop() . عندما يتم الوصول إلى الجزء السفلي من الدالة loop() ، يتم تنفيذ العبارات من أعلى الدالة loop() مرة أخرى ، وبالتالي إكمال "الحلقة" كما هو موضح في الصورة أدناه.

الأردوينو Arduino للمبتدئين  22283a1c89604ed5944ea2d638857b71

برنامج (سكيتش) توضيحى للحلقة Loop :
يوضح البرنامج (الاسكيتش) main_loop الموضح أدناه كيفية عمل الحلقة الرئيسية في برنامج (سكيتش) الاردوينو. اكتب البرنامج (الاسكيتش) في Arduino IDE ، أو انسخه والصقه في IDE.
قم بتحميل Load الاسكيتش إلى Arduino ثم افتح نافذة الشاشة التسلسلية لرؤية نص إخراج الاسكيتش أثناء تشغيله.


الكود:
void setup() {
  Serial.begin(9600);
  Serial.println("*** This message will only be displayed on start or reset. ***");
  delay(2000);
}

void loop() {
  Serial.println("-- Arduino now at top of main loop. --");
  Serial.println("--------------------------------------");
  delay(2000);

  Serial.println("Executing instructions in main loop.");
  delay(2000);

  Serial.println("Arduino now at bottom of main loop.\r\n");
}


يظهر النص الذي يطبعه الاسكيتش فى نافذة الشاشة التسلسلية أدناه.

الأردوينو Arduino للمبتدئين  Ea6d3cd5df5340f4be182212b681d653

كما يظهر العرض التوضيحي أعلاه ، يتم عرض النص في الدالة setup() مرة واحدة فقط عند فتح نافذة الشاشة التسلسلية لأول مرة وإعادة تعيين Arduino. بعد ذلك ، يدخل تنفيذ البرنامج إلى الدالة loop() وينفذ بشكل متكرر العبارات في الحلقة من الأعلى إلى الأسفل والعودة إلى الأعلى مرة أخرى في حلقة لا تنتهي أبدًا.
الدوال فى برنامج (سكيتش) توضيح الحلقة Loop :
في الاسكيتش main_loop أعلاه ، تتكون كل عبارة في setup() و loop() من دالة يتم استدعاؤها - أي أن الاستدعاء يعني أنه يتم تنفيذها أو تشغيلها.

الدالة delay() :
عندما يتم استدعاء الدالة delay() في العبارة delay(2000); عندئذ تتسبب دالة التأخير في فترة انتظار مدتها ثانيتان (2000 مللي ثانية ) . يمكن تغيير وقت التأخير بتمرير قيمة مختلفة للدالة delay() ، على سبيل المثال 3000 سيتسبب في تأخير 3 ثانية: delay(3000); .

الدالة println() :
ترسل الدالة println() نص text خارجًا من منفذ تسلسلي / USB للاردوينو Arduino ويتم عرضه في نافذة جهاز العرض التسلسلي.
تختلف الدالة println() عن الدالة delay() في أنها تحتوي على كلمة Serial ونقطة (.) قبلها:

الكود:
  Serial.println("Text to print."); 

سبب هذا الترميز notation (Serial.function_name()) لأن الدالة تعمل على المنفذ التسلسلي أو الكائن التسلسلي Serial object . ستلاحظ في الدالة setup() أن Serial.begin() تم استدعاؤها . هذه هي الدالة begin() التي تعمل على المنفذ التسلسلي - في هذه الحالة لضبطه على السرعة المطلوبة.
تسمى هذه الدوال التي يسبقها اسم كائن (مثل Serial) "طرق" "methods" في البرمجة الموجهة للكائنات.

ملخص الدوال Functions :
نأمل أن يوضح ما يلي ماهية الدوال والمصطلحات المستخدمة معها. لن يكون الفهم الأعمق للدوال ممكنًا إلا عندما نبدأ في كتابة الدوال الخاصة بنا .

• الدوال setup() و loop() :
الدوال setup() و loop() دالتان خاصتان تشكلان جزءًا من هيكل سكيتش (برنامج) الاردوينو.
نحن في الواقع نكتب هذه الدوال الخاصة من خلال إعطائها جسم الدالة (بين قوسي الفتح والإغلاق: {}) وكتابة العبارات في جسم الدالة .
كانت العبارات statements في هذه الدوال في الاسكيتش أعلاه تستدعي دوال موجودة مسبقًا تؤدي المهام التي نريدها ، على سبيل المثال إعداد سرعة المنفذ التسلسلي ، والتسبب في تأخير الوقت ، وكتابة نص إلى نافذة جهاز العرض التسلسلي.
يتم استدعاء الدالتين setup() و loop() تلقائيًا في الوقت المناسب لأنهما من دوال Arduino الخاصة.

• إستدعاء الدوال Calling Functions :
من خلال استدعاء أو استخدام الدوال الموجودة مسبقًا ، نستخدم التعليمات البرمجية (الكود) التي كتبها شخص آخر بالفعل.
تحتوي الدالة delay() على جسم دالة يحتوي على عبارات تؤدي إلى التأخير delay .نحن لا نرى هذه العبارات أو جسم الدالة لأنها إما جزء من لغة برمجة Arduino أو أنها موجودة في مكتبة دوال خارجية.

• تمرير قيمة إلى دالة Passing a Value to a Function
عندما يتم استخدام قيمة (مثل عدد number أو سلسلة نصية string) بواسطة دالة ، يقال أننا نمرر القيمة إلى الدالة.

تمرير قيمة للدالة delay() :
نحن نستدعى الدالة delay() فى الاسكيتش كما فى العبارة التالية :
delay(2000);
قيمة التأخير بالملى ثانية (2000) يقال أنه قد تم تمريرها إلى الدالة .

تمرير قيمة إلى الدالة println() :
نحن نمرر سلسلة نصية إلى الدالة println() كما فى العبارة التالية :

الكود:
Serial.println("Executing instructions in main loop."); 

يجب علينا تمرير سلسلة نصية إلى الدالة حتى تعرف الدالة ما يجب إرساله من منفذ التسلسلي / USB. يُعرف النص بين علامتي اقتباس ("") بالسلسلة string في البرمجة.

التعليق على البرنامج (الاسكيتش) main_loop
يمكن رؤية الاسكيتش main_loop المبين أعلاه هنا مرة أخرى ، ولكن مع شرح وتعليق على ما يحدث في الاسكيتش .

الكود:
void setup() {

يبدأ اسكيتش الاردوينو في العمل هنا عندما يتم استدعاء دالة الإعداد setup() تلقائيًا.

أولاً قمنا بإعداد set up المنفذ التسلسلي بمعدل البود 9600 الذي يجب أن يتطابق مع معدل البود في نافذة الشاشة التسلسلية. يمكن اعتبار سرعة الاتصال بالبود على أنها السرعة التي يتم بها الاتصال بين الاردوينو Arduino ونافذة الشاشة التسلسلية.

الكود:
Serial.begin(9600);

يتم إرسال سطر line من النص (يُعرف باسم "سلسلة" "string" النص في لغات البرمجة) خارج المنفذ التسلسلي / USB لعرضه في نافذة جهاز العرض التسلسلي.

الكود:
Serial.println("*** This message will only be displayed on start or reset. ***");

تمت إضافة تأخير لمدة ثانيتين حتى لا يظهر النص التالي الذي سيتم عرضه في نافذة جهاز العرض التسلسلي على الفور.

الكود:
delay(2000);
}

تم الانتهاء من تنفيذ العبارات في الدالة setup() ، لذا يتم الآن استدعاء دالة الحلقة loop() تلقائيًا.

الكود:
void loop() {

الآن يتم التنفيذ في حلقة ، سيتم تنفيذ العبارات داخل الدالة loop() من أعلى إلى أسفل. عند الوصول إلى الجزء السفلي من الحلقة ، سيتم تنفيذ جميع العبارات مرة أخرى من أعلى إلى أسفل.

يتم إرسال هذا النص إلى نافذة جهاز العرض التسلسلي وهو أول عبارة يتم تنفيذها في الحلقة.

الكود:
Serial.println("-- Arduino now at top of main loop. --");

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

الكود:
Serial.println("--------------------------------------");

التأخير لمدة ثانيتين بحيث لا يظهر سطر النص التالي على الفور مع النص أعلاه.

الكود:
delay(2000);

نقوم الآن بتنفيذ العبارات statements (تسمى أيضًا تعليمات instructions) في منتصف حلقة Arduino الرئيسية. العبارة التالية ترسل المزيد من النص إلى نافذة جهاز العرض التسلسلي.

الكود:
Serial.println("Executing instructions in main loop.");

تأخير آخر بحيث لا يظهر سطر النص التالي في نفس وقت سطر النص أعلاه.

الكود:
delay(2000);
 

العبارة الأخيرة في الحلقة والنص الأخير الذي يتم إرساله إلى نافذة جهاز العرض التسلسلي قبل العودة إلى أعلى الحلقة لبدء تنفيذ العبارات مرة أخرى.
تتسبب الدالة println() في تحريك المؤشر غير المرئي إلى السطر التالي في نافذة جهاز العرض التسلسلي. يؤدي هذا إلى ظهور النص التالي المرسل إلى نافذة جهاز العرض التسلسلي على السطر الموجود أسفل النص المطبوع حاليًا.
تنقل الأحرف \r\n الموجود في نهاية نص السلسلة هذا المؤشر غير المرئي لأسفل بسطر واحد آخر ويترك سطرًا فارغًا بين النص المطبوع في أسفل الحلقة والنص المطبوع في أعلى الحلقة.

الكود:
Serial.println("Arduino now at bottom of main loop.\r\n");
}

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty دورة برمجة الاردوينو : الدرس الثالث : المتغيرات Variables

مُساهمة من طرف Admin الإثنين مارس 23, 2020 6:54 pm

[SIZE="4"]دورة برمجة الاردوينو : الدرس الثالث :
المتغيرات Variables

يستخدم المتغير في البرمجة لتخزين قيمة value قد تتغير أثناء حياة البرنامج (الاسكيتش ).
يتم تخصيص الذاكرة لتخزين المتغير ويتم إعطاء المتغير اسمًا يسمح بالوصول إليه في الاسكيتش .
أحد الأمثلة على المتغير هو كتابة برنامج يحفظ مجموع نقاط الفرق في مباراة رياضية. سيتم عرض القيمة التي يحملها المتغير (على سبيل المثال نتيجة نقاط الفرق teams score ) على الشاشة أثناء تشغيل المباراة الرياضية. كلما زادت النتيجة score ، سيتم زيادة القيمة التي يحملها المتغير وسيتم تحديث العرض على الشاشة لإظهار القيمة الجديدة التي يحملها متغير النتيجة score .
في هذا المثال ، قد تتغير قيمة النتيجة عدة مرات أثناء المباراة والوقت الذي يتم فيه تشغيل البرنامج . وبالتالي فهي متغيرة مقارنة بقيمة ثابتة .

استخدام المتغير Using a Variable :
يوضح الاسكيتش التالي الذي يسمى variables استخدام المتغير. قم بتحميل هذا الاسكيتش إلى Arduino الخاص بك وافتح نافذة الشاشة التسلسلية لرؤية إخراج الاسكيتش .

الكود:
void setup() {
  int count;
 
  Serial.begin(9600);
 
  count = 0;
  Serial.println(count);
  count = 1;
  Serial.println(count);
  count = 2;
  Serial.println(count);
}

void loop() {
}

• تعريف المتغير Variable Definition :

العبارة التالية من البرنامج أعلاه هى تعريف متغير لأنها تعرف (تحدد) نوع المتغير واسمه:

الكود:
int count;

• نوع المتغير Variable Type :
في المثال أعلاه ، يكون نوع المتغير int. هذا يعني أن المتغير يمكنه الاحتفاظ بقيمة صحيحة integer.
العدد الصحيح integer هو عدد صحيح whole number - أي ليس كسرًا. على سبيل المثال ، الأرقام التالية هي أعداد صحيحة 2 ، 5 ، 0 ، 100 ، 1024 ، -32 ، إلخ.

• اسم المتغير Variable Name :
تم إعطاء المتغير أعلاه الاسم count . يمكن الآن الإشارة إلى هذا المتغير أو استخدامه في البرنامج باستخدام الاسم "count".
بإعطاء المتغير نوعًا واسمًا ، يتم توفير مساحة في الذاكرة لهذا المتغير.

• استخدام المتغير فى الاسكيتش (البرنامج) Using the Variable in a Sketch :
بعد تعريف المتغير ، يمكن تعيين قيمة له ويمكن عرض قيمة المتغير في نافذة المراقبة التسلسلية.

في العبارتين التاليتين ، يتم أولاً تعيين assigned المتغير count بالقيمة 0 ثم يتم إرسال القيمة التي يحتفظ بها هذا المتغير خارج المنفذ التسلسلي للعرض في نافذة جهاز العرض التسلسلي.

الكود:
count = 0;
Serial.println(count);
 

في الاسكيتش ، تتكرر نفس أسطر التعليمات البرمجية ، ولكن في كل مرة يتم تعيين قيمة مختلفة للمتغير count .

أنواع المتغيرات Types of Variables :
نوع المتغير الصحيح (int) هو نوع واحد فقط من المتغيرات. مثال على نوع متغير مختلف هو المتغير float أو متغير النقطة (الفاصلة) العائمة floating point variable .
يتم استخدام متغير الفاصلة العائمة لتخزين رقم يحتوي على كسر ، على سبيل المثال 1.45 ، 99.99 ، 362.5634 ،
-200.21 ، إلخ.
يتم تعريف متغير الفاصلة العائمة بنفس الطريقة التي يتم بها تعريف متغير صحيح ، باستثناء أنه يتم استخدام الكلمة الأساسية float بدلاً من int كما هو موضح في المثال أدناه.

الكود:
float average;

يمكن الآن تعيين متغير الفاصلة العائمة لقيمة فاصلة عائمة ، على سبيل المثال:

الكود:
average = 1.2;

طباعة القيمة العائمة Printing a Float Value :
لطباعة أو إرسال قيمة نقطة عائمة إلى نافذة الشاشة التسلسلية للاردوينو ، يمكن استخدام الدالة println() .
يمكن تمرير وسيط ثانى إلى الدالة println() لتحديد عدد الارقام العشرية التي يجب طباعتها كما هو موضح في الاسكيتش floats أدناه.


الكود:
 void setup() {
  float average;
 
  Serial.begin(9600);
 
  average = 12.3299;
 
  Serial.println(average);

  Serial.println(average, 4);
}

void loop() {
}

فيما يلى خرج الاسكيتش أعلاه :

الأردوينو Arduino للمبتدئين  C38aa0bfff544769b87bb0fa94ddb40b

يعين assigns البرنامج أعلاه القيمة 12.3299 لمتغير النقطة العائمة average . عندما يتم إرسال قيمة المتغير إلى نافذة الشاشة التسلسلية ، يمكننا أن نرى أن الدالة println() تقوم بتقريب الرقم تلقائيًا إلى رقمين عشريين.
في المرة الثانية التي يتم فيها استخدام الدالة println() لإرسال قيمة المتغير إلى نافذة جهاز العرض التسلسلي ، يتم تحديد عدد الارقام العشرية على أنه 4. ويتم ذلك عن طريق تمرير قيمة وسيط ثانى هو 4 إلى الدالة println() .

أنواع متغير أخرى Other Variable Types :
يمكن رؤية أنواع أخرى من المتغيرات المتاحة في مرجع لغة Arduino تحت عنوان المتغيرات Variables .
هنا ، سيتم تقديم كل نوع متغير وتفسيره في الوقت المناسب.

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

قواعد تسمية المتغير Variable Naming Rules :
• يمكن أن تتكون أسماء المتغيرات من أي حروف letters (من a إلى z ومن A إلى Z )
• يمكن أن تحتوي أسماء المتغيرات على الأرقام من 0 إلى 9 ، ولكن لا تبدأ برقم ، على سبيل المثال لا يُسمح بالاسم 3var ، ولكن يُسمح باستخدام الاسم var3
• لا تحتوي أسماء المتغيرات على نفس الأسماء مثل الكلمات الرئيسية للغة Arduino ، على سبيل المثال لا يمكن أن يكون لديك متغير باسم int
• يجب أن يكون للمتغيرات أسماء فريدة ، أي أنه لا يمكن أن يكون لديك متغيرين بنفس الاسم
• الأسماء المتغيرة حساسة لحالة الأحرف ، لذا يعد Count و count متغيرين مختلفين
• لا يجوز أن تحتوي أسماء المتغيرات على أي أحرف خاصة ، باستثناء الشرطة السفلية underscore (_) ، على سبيل المثال top_score

تهيئة المتغيرات Initializing Variables:
في المثال الموضح أعلاه ، تم تعريف المتغيرات التي تم استخدامها أولاً ، ثم تم تعيين قيمة لها.
يمكن أيضًا تعيين قيمة أولية initial للمتغير عند تعريفه كما هو موضح أدناه:

الكود:
int total = 0;

في هذا المثال ، قيمة العدد الصحيح المسمى total تم تعريفها defined وتعيين assigned قيمة صفر (0) لها في عبارة واحدة.

ملاحظة :
في هذا الدرس حيث يلزم شرح المفاهيم ، غالبًا ما يتم وضع كود المثال في جزء الإعداد setup() من الاسكيتش ، بدلاً من جزء الحلقة loop() ، وذلك لأن التعليمات البرمجية تحتاج عادةً إلى التشغيل مرة واحدة فقط لتوضيح بعض المفاهيم.
ستحتوي معظم الاسكتشات على الجزء الأكبر من الكود في الدالة loop() والكود الوحيد الذى يهيئ الأجهزة hardware في الدالة setup() .
[/SIZE]

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الرابع العوامل الحسابية Arithmetic Operators

مُساهمة من طرف Admin الأربعاء مارس 25, 2020 6:21 pm

دورة برمجة الاردوينو : الدرس الرابع :
العوامل الحسابية Arithmetic Operators :


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

1- الجمع Addition :
لجمع (إضافة) أرقام على Arduino ، نستخدم عامل الجمع addition operator (+) .
يوضح المثال أدناه كيفية جمع رقمين معًا.

الكود:
 nt a = 2;
int b = 7;
int sum;

sum = a + b;

في الكود أعلاه ، تم تعريف ثلاثة متغيرات. يتم تعيين قيمة لكل من المتغيرين a و b عند تعريفهما .
تم تعريف المتغير sum ، ولكن لم يتم تهيئته ، لذلك يحتوي على أي رقم عشوائي. سنستخدم هذا المتغير لتخزين نتيجة حساب الجمع ، بحيث يتم استبدال overwritten القيمة العشوائية التي يحتوي عليها sum عندما نضع نتيجة الجمع (أو المجموع sum) فيها.
بعد تنفيذ العبارة الموضحة أدناه ، سيحتوي المجموع sum على القيمة 9 أي نتيجة جمع المتغير a والمتغير b.

الكود:
sum = a + b;

يمكننا أيضًا إضافة قيمتين ثابتتين وتخزين النتيجة في متغير كما هو موضح أدناه.

الكود:
int sum;

sum = 2 + 10;

النتيجة المخزنة في المجموع sum بعد تنفيذ عبارة الجمع (الإضافة) ستكون 12 في هذا المثال .

يمكن أيضًا إضافة القيم الثابتة والمتغيرات معًا وتخزين النتيجة في متغير كما هو موضح هنا.

الكود:
int a = 3;
int sum;

sum = a + 24;

بعد تنفيذ الإضافة ، سيحتوي sum على 27.
يمكن أيضًا للمعاملات الحسابية الباقية العمل على قيم ثابتة ومتغيرات ومزيج من كليهما.

2- الطرح Subtraction :
يقوم عامل الطرح subtraction operator بطرح رقم من آخر باستخدام علامة الطرح (-) كما يوضح المثال التالي.

الكود:
int result;

result = 10 - 2;

ستكون نتيجة هذا الحساب 8 وسيتم تخزينها في المتغير result .

3- الضرب Multiplication :
يتم الضرب باستخدام عامل الضرب multiplication operator (*) .

الكود:
 nt result;

result = 4 * 3;

ستكون نتيجة الحساب أعلاه 12 وسيتم تخزينها في المتغير result .

4- القسمة Division :
يتم استخدام عامل القسمة (/) لأداء القسمة في Arduino.

الكود:
int result;

result = 12 / 3;

نتيجة الحساب أعلاه 4.

الأعداد الصحيحة Integers مقابل أعداد النقطة العائمة Floating Point :
حتى الآن كنا نستخدم القيم الصحيحة integer values فقط لإجراء الحساب. إذا كانت نتيجة القسمة ليست عددًا صحيحًا integer (أو عددًا صحيحًا whole number ) ، ولكنها تحتوي على جزء كسر ، فسيتم تجاهل جزء الكسر إذا تم تخزين النتيجة في متغير نوع عدد صحيح integer .
ستوضح الأمثلة التالية ما يحدث عندما يتم تخزين نتيجة بجزء كسري في عدد صحيح ثم متغير الفاصلة العائمة.

الكود:
 int result;

result = 5 / 4;

ستكون النتيجة 1 لأنه يتم تجاهل الكسر عندما يتم تخزين النتيجة في result متغير عدد صحيح.
نفس الحساب ، ولكن هذه المرة تعريف result كمتغير نقطة عائمة (float) .

الكود:
float result;

result = 5.0 / 4.0;

النتيجة الآن في المتغير result هي 1.25.
عند استخدام القيم الثابتة في الحسابات التي تخزن النتيجة في متغير الفاصلة العائمة ، نستخدم الفاصلة العشرية والصفر للأرقام الصحيحة ، أي 5.0 بدلاً من 5 بمفردها.

5- الباقى Remainder :
يتم استخدام عامل الباقي remainder operator لإيجاد الباقي بعد قسمة رقمين. يتم استخدام علامة النسبة المئوية (%) كعامل للباقى .

الكود:
int result;

result = 11 % 4;

ستكون نتيجة هذا الحساب الباقي من 11 مقسومًا على 4 وهو 3 (4 تخصم من 11 مرتين ويترك الباقي 3 أى نتيجة القسمة تكون 2 وباقى القسمة يكون 3).

برنامج (سكيتش) العمليات الحسابية Arithmetic Sketch :
يوضح البرنامج (الاسكيتش) التالي المسمى arithmetic جميع العمليات الحسابية المذكورة أعلاه.
قم بتحميل الاسكيتش إلى Arduino وجربه. أضف أيضًا الأمثلة أعلاه ، مثل خلط القيم الثابتة والمتغيرات.

الكود:
 void setup() {
  int a = 2;
  int b = 7;
  int result;
  float result_fl;
 
  Serial.begin(9600);
 
  Serial.print("Addition (a + b): ");
  result = a + b;
  Serial.println(result);
 
  Serial.print("Subtraction (10 - 2): ");
  result = 10 - 2;
  Serial.println(result);
 
  Serial.print("Multiplication (4 * 3): ");
  result = 4 * 3;
  Serial.println(result);
 
  Serial.print("Int Division (5 / 4): ");
  result = 5 / 4;
  Serial.println(result);
 
  Serial.print("Float Division (5.0 / 4.0): ");
  result_fl = 5.0 / 4.0;
  Serial.println(result_fl);
 
  Serial.print("Remainder (11 % 4): ");
  result = 11 % 4;
  Serial.println(result);
}

void loop() {
}

تعليقات على البرنامج (الاسكيتش) :
• الدالة print() :
يحتوي البرنامج على مزيج من الدوال print() و println() . يتم استدعاء print() عندما يجب أن يظل المؤشر غير المرئي على نفس السطر بحيث تتم طباعة النص المطبوع في عبارة println() التالية على نفس السطر أيضًا.
• الدالة println() :
يتم استخدام println() عندما يجب طباعة النص ثم ينتقل المؤشر غير المرئي إلى السطر التالي بحيث تطبع عبارة print() التالية النص على سطر جديد.
متغير النقطة العائمة Floating Point Variable :
تم تعريف متغير result_fl منفصل للاحتفاظ بنتيجة حساب النقطة العائمة.
• متغير العدد الصحيح Integer Variable :
يتم إعادة استخدام result المتغير الصحيح عدة مرات أثناء البرنامج . الشيء المهم هو عرض نتائجه قبل وضع نتيجة الحساب التالي فيه.
• الثوابت والمتغيرات Constants and Variables :
تعرفنا على المتغيرات variables في الدرس الأخير . الثوابت Constants هي أرقام تظل ثابتة طوال البرنامج - أي أنها لا تتغير أبدًا.
أمثلة الثوابت هي الأرقام التي يتم استخدامها مباشرة في الحساب ولا يتم تعيينها إلى متغير ، على سبيل المثال sum = 2 + 3 يحتوي على الثوابت 2 و 3.
الثوابت ليس لها اسم ولا يمكن تغيير قيمها عند تشغيل البرنامج .
• العمليات الحسابية على أرقام النقطة العائمة Floating Point Arithmetic :
على الرغم من عدم ظهورها في الأمثلة أعلاه ، يمكن أيضًا إجراء الجمع والطرح والضرب على قيم الفاصلة العائمة.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الخامس : عوامل العلاقة (الارتباط - المقارنة) Relational Operators

مُساهمة من طرف Admin الخميس مارس 26, 2020 6:28 pm

دورة برمجة الاردوينو : الدرس الخامس
عوامل العلاقة (الارتباط - المقارنة) Relational Operators :


تختبر عوامل العلاقية العلاقة relationship بين القيم ، على سبيل المثال هل الرقم 7 أكبر من الرقم 5 ؛ أو القيمة التي يحملها holds المتغير أقل من 10.
نتيجة تقييم مقارنة قيمتين بواسطة عامل علاقة ستكون إما صحيحة true أو خاطئة false ، على سبيل المثال ، هل القيمة الموجودة في متغير تساوي 8؟ ستكون الإجابة إما صحيحة true (يحتوي على القيمة Cool أو خاطئة false (لا يحتوي على القيمة Cool.
في البرمجة ، يتم تمثيل true بالقيمة 1 ويتم تمثيل false بالقيمة 0. سيساعد المثال التالي على توضيح هذا التفسير للعوامل العلاقية.

مثال على عامل علاقة (إرتباط ) :
يستخدم البرنامج التالي عامل العلاقة "أكبر من" (>) وعامل العلاقة "أصغر أو أقل من" (<) لمقارنة رقمين.

الكود:
 void setup() {
  Serial.begin(9600);
 
  Serial.print("Is 7 greater than 5? ");
  Serial.println(7 > 5);
 
  Serial.print("Is 7 less than 5? ");
  Serial.println(7 < 5);
}

void loop() {
}

خرج البرنامج مبين أدناه :

الأردوينو Arduino للمبتدئين  129c2e8b06a549ea99090a2a4e297688

يختبر عامل العلاقة الأول ما إذا كانت 7 أكبر من 5 : 7 > 5
7 أكبر من 5 ، لذا يكون الناتج من هذه المقارنة true أو 1.
يختبر عامل العلاقة الثاني ما إذا كان 7 أقل من 5: 7 < 5
7 ليس أقل من 5 ، وبالتالي فإن الناتج من المقارنة false أو 0.

أنواع عوامل العلاقة (الارتباط) Types of Relational Operators :
تحتوي لغة برمجة Arduino على 6 عوامل علاقة (ارتباط) مدرجة أدناه.

1- العامل أكبر من Greater Than >
لقد رأينا بالفعل عامل العلاقة أكبر من يعمل في المثال أعلاه. هنا مثال آخر يستخدم نفس العامل لمقارنة محتويات متغيرين.

الكود:
 int a = 2;
int b = 3;

Serial.println(a > b);

يسأل عامل العلاقة السؤال "هل a أكبر من b؟" "Is a greater than b?".
ستكون نتيجة المقارنة 0 (false) في هذا المثال لأن القيمة التي يحتوي عليها المتغير a ليست أكبر من القيمة التي يحتوي عليها المتغير b.

2- العامل أصغر من Less Than <
هنا نستخدم عامل العلاقة أصغر من لمقارنة محتويات نفس المتغيرين.

الكود:
 int a = 2;
int b = 3;

Serial.println(a < b);

يسأل عامل العلاقة السؤال "هل a أصغر من b؟" "Is a less than b?" .
سيكون خرج هذا البرنامج 1 (true) لأن القيمة التي يحتوي عليها المتغير a أقل من القيمة التي يحتوي عليها المتغير b.

3- العامل أكبر من أوتساوى Greater Than or Equal To >=
يعمل هذا العامل بنفس الطريقة التي يعمل بها عامل أكبر من ، ولكنه سيقيم evaluate أيضًا بالقيمة true (1) إذا كانت القيمتان قيد المقارنة متساويتين.

4- العامل أصغر من أو تساوى Less Than or Equal To <=
سيتم تقييم نتيجة هذا العامل إلى القيمة true (1) إذا كانت القيمة على يسار العامل أقل من القيمة الموجودة على يمين العامل ؛ أو إذا كانت القيمتان متساويتان.

5- العامل يساوى Equal To ==
يتم تقييم نتيجة العامل يساوى فقط بالقيمة true (1) إذا كانت القيمتان قيد المقارنة متساوية equal ، وإلا فسيتم تقييمها إلى false (0) .
من السهل نسيان استخدام علامتين تساوى (==) واستخدام علامة يساوى واحدة فقط لمعامل العلاقة يساوى . سيؤدي استخدام علامة تساوى واحدة فقط إلى تعيين المتغير على يسار العامل القيمة للمتغير أو الثابت على اليمين. إذا كانت القيمة على اليسار ثابتة ، فسيحدث خطأ في الترجمة compile error إذا تم استخدام يساوي واحد (=) بدلاً من يساوي مزدوجة (==).

6- عامل عدم التساوى Not Equal To !=
يتم تقييم عامل عدم التساوى فقط بالقيمة true إذا كانت القيمتان التي تتم مقارنتها مع بعضها البعض غير متساوية ، وإلا فسيتم تقييمها إلى false .

برنامج (سكيتش) عامل العلاقة Relational Operator Sketch
يوضح سكيتش الاردوينو أدناه العوامل العلائقية.

الكود:
void setup() {
  int a = 2;
  int b = 3;
 
  Serial.begin(9600);
 
  Serial.print("Is a greater than b? ");
  Serial.println(a > b);
 
  Serial.print("Is a less than 25? ");
  Serial.println(a < 25);
 
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
 
  a = 3;
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
 
  a = 4;
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
 
  Serial.print("Is a equal to b? ");
  Serial.println(a == b);
 
  b = 4;
  Serial.print("Is a equal to b? ");
  Serial.println(a == b);
 
}

void loop() {
}
 

انسخ هذا الاسكيتش وقم بتشغيله على Arduino. جرب مع عوامل الارتباط العلائقية للتأكد من فهمك لها.

أشياء يجب ملاحظتها في الاسكيتش :
• تقييم وطباعة تعبير Evaluating and Printing an Expression
ما يجب ملاحظته في الاسكتشات أعلاه هو أن التعبير expression يتم تقييمه evaluated وطباعته في عبارة statement واحدة. لا يتم حفظ نتيجة تعبير العامل العلائقي أولاً في متغير ثم تتم طباعته.
يمكن القيام بذلك أيضًا مع عوامل الحساب كما هو موضح هنا:

الكود:
void setup() {
  int a = 2;
  int b = 3;
 
  Serial.begin(9600);
 
  Serial.print("a + b = ");
  Serial.println(a + b);
}

void loop() {
}

خرج الاسكيتش أعلاه مبين بالشكل التالى :

الأردوينو Arduino للمبتدئين  99b8693a16a447e5a56dab534f1ecf1d

يتم تقييم التعبير a + b (للحصول على القيمة 5) ويتم طباعته في نفس العبارة.
• الارتباك Confusing بين = و == :
كما ذكرنا من قبل ، من السهل نسيان علامة التساوي الثانية عند استخدام عامل يساوي equal. يوضح الاسكيتش أدناه ما يمكن أن يحدث مع هذا الخطأ.

الكود:
void setup() {
  int a = 2;
  int b = 3;
 
  Serial.begin(9600);
 
  Serial.print("a == b: ");
  Serial.println(a == b);
 
  Serial.print("a = b: ");
  Serial.println(a = b);
}

void loop() {
}

إن المقارنة بين a و b في التعبير a == b صحيحة ويتم تقييمها إلى 0 كما هو متوقع.
إذا تم ترك علامة التساوي الثانية كما هو موضح في التعبير الثاني a = b ، فسيتم استخدام عامل التخصيص (=) عن طريق الخطأ بدلاً من عامل التساوي (==).
يؤدي هذا إلى تعيين a لقيمة b وهي 3 ثم تتم طباعة 3. سيتم تقييم الرقم غير الصفري non-zero على أنه true كما سنرى لاحقًا .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس السادس عامل الزيادة والتعليق Increment Operator and Commenting

مُساهمة من طرف Admin الجمعة مارس 27, 2020 11:24 am

[SIZE="4"]دورة برمجة الاردوينو : الدرس السادس
عامل الزيادة والتعليق Increment Operator and Commenting

عامل الزيادة increment operator هو عامل حسابي فى الاردوينو يستخدم لزيادة متغير صحيح integer بقيمة واحد one . سوف نتناول كيفية استخدام عامل الزيادة في هذا الدرس .
التعليقات comments في البرمجة هي ملاحظات notes مكتوبة في برنامج (أو سكيتش) من قبل المبرمج. تُستخدم هذه الملاحظات لشرح ما يفعله الكود ، أو لإضافة معلومات بشرية أخرى مفيدة يمكن قراءتها إلى الكود. يتم شرح كيفية ومتى وسبب استخدام التعليقات في نهاية هذا الدرس .

عامل زيادة الاردوينو Arduino Increment Operator
يستخدم عامل زيادة الاردوينو لزيادة القيمة التي يحتفظ بها المتغير بواحد. هذا مفيد في أنواع معينة من الحلقات كما سيتم عرضه لاحقًا .

عامل الزيادة – مثال 1 :
يوضح المثال أدناه عامل الزيادة المستخدم لزيادة القيمة عدة مرات.


الكود:
void setup() {
  int count = 0;
 
  Serial.begin(9600);
 
  Serial.println(count++);
  Serial.println(count++);
  Serial.println(count++);
 
  Serial.println(count);
}

void loop() {
}


خرج البرنامج :

الأردوينو Arduino للمبتدئين  F656ec95acb74cee8b5f3a38b2852aaf

• تهيئة المتغير للزيادة Initializing the Variable to Increment
في المثال أعلاه ، يتم تعريف المتغير count وتهيئته بقيمة 0 (صفر).
من المهم تهيئة هذا المتغير قبل استخدام عامل الزيادة لأنه إذا لم تتم تهيئته ، فيمكن أن يحتوي على أي قيمة عشوائية. هنا نقوم بتهيئته إلى 0 ، ولكن يمكن استخدام أي قيمة صحيحة أخرى.

• الطباعة والتزايد Printing and Incrementing
يتم استخدام الدالة Serial.println() لطباعة قيمة count ، ولكن في نفس العبارة ، يتم استخدام عامل الزيادة (++) لزيادة القيمة التي يحتفظ بها المتغير count .
تؤدي عملية الزيادة إلى زيادة القيمة فى count من 0 إلى 1.

• الزيادة اللاحقة (ما بعد) Post Incrementing
يعد وضع ++ بعد اسم المتغير (count++) عملية زيادة لاحقة (بعد) . وهذا يعني أن المتغير يستخدم في العبارة ويزداد بعد ذلك فقط.
بسبب عملية الزيادة اللاحقة ، تتم طباعة القيمة الأولية للمتغير count (وهى 0) بواسطة الدالة println() الأولى ، ويتم زيادته فقط بعد ذلك.
تقوم الدالة println() التالية بطباعة القيمة المتزايدة الجديدة (الآن هى 1) ثم يزيد عامل الزيادة في العبارة قيمة count بعد طباعتها - يتم زيادتها الآن إلى 2.
تطبع عبارة println() الثالثة 2 وتزيد القيمة في count إلى 3.
تطبع عبارة println() النهائية قيمة count لكنها لا تستخدم عامل الزيادة. تطبع القيمة 3 التي تمت زيادة المتغير إليها مسبقًا.

عامل الزيادة – مثال 2
يعمل البرنامج التالي تمامًا مثل البرنامج السابق ، ولكن تم فصل عمليات الزيادة وعمليات الطباعة في عباراتها الخاصة.
قد يساعد هذا المثال على توضيح ما يحدث في المثال السابق. يمكننا أن نرى أن عبارة println() الأولى تطبع قيمة count وفقط بعد ذلك يتم زيادة القيمة فى count.

الكود:
void setup() {
  int count = 0;
 
  Serial.begin(9600);
 
  Serial.println(count);
  count++;
  Serial.println(count);
  count++;
  Serial.println(count);
  count++;
 
  Serial.println(count);
}

void loop() {
}

من هذين المثالين ، يمكننا أن نرى أن هذا السطر المفرد من الكود:

الكود:
 Serial.println(count++);

هو نفس السطرين من الكود :

الكود:
Serial.println(count);
count++;

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

تعليقات البرامج (الاسكيتشات) Commenting Sketches :
تسمح لك التعليقات بكتابة الملاحظات النصية الخاصة بك مع كود البرنامج . يوضح البرنامج التالي طريقتين لكتابة التعليقات.

الكود:
 /*
    Sketch Name:  comments
   
    Purpose:      Demonstrates how to use comments.
                  Increments and displays a number in the main loop.
   
    Date:           
    Author:     
*/

void setup() {
  Serial.begin(9600);      // use the serial port for printing the number
}

int count = 0;              // the number to print

void loop() {
  Serial.println(count++);  // print and increment the number
  delay(1000);              // 1 second delay between printing
}

• تعليقات متعددة الأسطر Multi-line Comments
يمكن كتابة التعليقات على أسطر متعددة عند استخدام حرفى الشرطة المائلة للأمام والنجمة للفتح (/*) واستخدام حرفى النجمة والشرطة المائلة للأمام (*/) للإغلاق كما هو موضح أعلى البرنامج .
يمكن كتابة أي تعليقات نصية بين فتح وإغلاق التعليق ويمكن أن تمتد إلى عدة أسطر. سيتم تجاهل جميع النصوص في التعليق من قبل المترجم compiler .
يمكن أيضًا استخدام هذا النمط من التعليق على سطر واحد ، ولكن يجب دائمًا إغلاقه بعلامة النجمة والشرطة الأمامية كما هو موضح أدناه.

الكود:
 delay(1000);  /* 1 second delay between printing */

هناك طريقة أسهل للتعليق على سطر واحد من الكود ، باستخدام تعليق سطر واحد ، كما هو موضح أدناه.

• تعليقات سطر واحد Single Line Comments
يتم استخدام شرطة مائلة للأمام مزدوجة (//) لإنشاء تعليق سطر واحد. سيكون كل النص الموجود على يمين الخط المائل المزدوج على نفس السطر عبارة عن تعليق وسيتم تجاهله من قبل المترجم.
يمكن استخدام تعليق سطر واحد على سطر خاص به أو على يمين عبارة البرنامج.

الكود:
// the delay slows down the printing of the numbers
delay(1000);  // 1 second delay between printing

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

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

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس السابع حلقة for للاردوينو The Arduino for Loop

مُساهمة من طرف Admin السبت مارس 28, 2020 11:06 am

دورة برمجة الاردوينو : الدرس السابع
حلقة for للاردوينو The Arduino for Loop


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

استخدام حلقة for Using the for Loop
يوضح البرنامج (الاسكيتش) التالي استخدام حلقة for.

الكود:
void setup() {
  int i;
 
  Serial.begin(9600);
 
  for (i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
}

void loop() {
}

قم بتحميل البرنامج إلى Arduino الخاص بك لمعرفة كيف يعمل .

كيف تعمل حلقة for How the for Loop Works :
توضح الصورة أدناه أجزاء حلقة for .

الأردوينو Arduino للمبتدئين  2e830fddca5b42c696618f447d3ab91c

أجزاء حلقة for فى برنامج الاردوينو :
• بناء حلقة for :
تبدأ حلقة for الأساسية على النحو التالي:

الكود:
for () {
}

يتم إضافة ثلاثة تعبيرات expressions بين قوسي الفتح والإغلاق () لتحديد عدد مرات تشغيل العبارات في الحلقة قبل الخروج من الحلقة. عند الخروج من الحلقة ، يستمر تنفيذ البرنامج أسفل الحلقة - أي يتم تنفيذ العبارات خارج الحلقة وأسفلها من أعلى إلى أسفل.
يحتوي جسم body الحلقة بين أقواس الفتح والإغلاق {} على العبارات التى سوف يتم تشغيلها في الحلقة.
تسمى التعابير بين الأقواس () تعبير التهيئة initialize expression وتعبير الاختبار test expression وتعبير الزيادة increment expression .
يجب تعريف متغير لاستخدامه في تعبيرات الحلقة الثلاثة. في المثال أعلاه ، يتم استخدام متغير صحيح integer يسمى i.
يجب أن تظهر تعبيرات الحلقة الثلاثة بالترتيب: التهيئة والاختبار والتزايد. يتم فصلها بفواصل منقوطة (Wink. لا ينتهي تعبير الزيادة بفاصلة منقوطة.

1- تعبير التهيئة Initialize Expression :
يتم تشغيل تعبير التهيئة مرة واحدة فقط في الوقت الذي تبدأ فيه الحلقة. يقوم بتهيئة المتغير i الخاص بنا إلى الصفر (0) في المثال .

2- تعبير الاختبار Test Expression
يحدد تعبير الاختبار متى نخرج من الحلقة. يتم استخدامه لتعيين عدد المرات التي يتم فيها تشغيل العبارات في جسم الحلقة.
عندما يتم تقييم تعبير الاختبار إلى true ، سيتم تشغيل العبارات في جسم الحلقة. عندما يتم تقييم تعبير الاختبار على أنه false ، فلن يتم تشغيل الحلقة مرة أخرى ، ولكن سيتم الخروج منها.
يتم تقييم تعبير الاختبار في كل مرة يبدأ فيها التنفيذ في الجزء العلوي من الحلقة.

3- تعبير الزيادة Increment Expression
يستخدم تعبير الزيادة لتغيير القيمة التي يحملها المتغير i. يتم تشغيله في كل مرة يبدأ فيها التنفيذ في الجزء العلوي من الحلقة.

تدفق البرنامج في الحلقة Program Flow in the Loop :
توضح الصورة أدناه كيفية عمل تدفق البرنامج في حلقة for.

الأردوينو Arduino للمبتدئين  Fad37f6bd14b4c5cabf4d21f3733b05d

تدفق برنامج حلقة for :

1- المرة الأولى من خلال الحلقة :
في المرة الأولى من خلال الحلقة ، تتم تهيئة i على 0 ، ويختبر تعبير الاختبار ما إذا كان i < 10 (0 < 10) صحيحًا true ، لذلك سيتم تشغيل العبارات في الحلقة.
نظرًا لاستخدام عامل الزيادة اللاحقة مع المتغير ، فلن يتم زيادة i إلا في نهاية الحلقة. العبارات في الحلقة تعمل وتطبع قيمة i بالقيمة 0 لأنه لم يتم زيادتها بعد.
لذلك لدينا ما يلى :

الكود:
i is initialized to 0
i contains 0
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 0
At the end of the loop i is incremented so i == 1

2- المرة الثانية من خلال الحلقة :
في المرة الثانية من خلال الحلقة ،i الآن تحتوي على 1 حيث تم زيادتها في الجزء السفلي من الحلقة. يختبر تعبير الاختبار الآن ما إذا كان i < 10 (1 < 10) صحيحًا true ، لذلك سيتم تشغيل العبارات في الحلقة مرة أخرى. سيتم زيادة المتغير i فقط إلى 2 في الجزء السفلي من الحلقة ، لذلك تتم طباعة 1 إلى نافذة جهاز العرض التسلسلي.
لدينا الآن :

الكود:
i is not initialized again
i contains 1
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 1
At the end of the loop i is incremented so i == 2

3- المرة الأخيرة من خلال الحلقة :
سيستمر تنفيذ الحلقة وسوف تتزايد i في كل مرة.
في المرة الأخيرة من خلال الحلقة ، يكون لدينا:

الكود:
i is not initialized again
i contains 9
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 9
At the end of the loop i is incremented so i == 10
 

يبدأ التنفيذ من أعلى الحلقة مرة أخرى ، ويتم اختبار تقييم تعبير الاختبار .
لدينا الآن :

الكود:
 i is not initialized again
i contains 10
i < 10 evaluates to false or 0 because i is not less than 10 (it is equal to 10)
The statements in the loop are not run again
The loop is exited
The statement below the closing bracket of the loop will be run

طريقة بديلة لكتابة حلقة for
البرنامج التالي يوضح أن المتغير المستخدم في تعبيرات الحلقة يمكن تعريفه أيضًا في الحلقة ولا يجب تعريفه خارج الحلقة كما فعلنا فى البرنامج السابق.

الكود:
 void setup() {
  Serial.begin(9600);
 
  for (int i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
}

void loop() {
}

يعمل هذا البرنامج تمامًا مثل البرنامج السابق ويخرج الأرقام من 0 إلى 9.

حلقة داخل حلقة A Loop Within a Loop
يستخدم البرنامج التالي حلقة for داخل الحلقة الرئيسية للاردوينو Arduino.

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

void loop() {
  for (int i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
  delay(1000);
}

تعمل حلقة for بنفس الطريقة التي كانت تعمل بها من قبل ، ولكن الآن بعد خروجها ، يتم تشغيل الدالة delay() لإعطاء تأخير لمدة ثانية واحدة. يتم الوصول إلى نهاية الحلقة الرئيسية للاردوينو ، بحيث يتم تشغيل حلقة for مرة أخرى.
عند تشغيل حلقة for مرة أخرى ، تتم تهيئة i إلى 0 لأن حلقة for تبدأ من الأعلى مرة أخرى. ثم يتم تشغيلها مرة أخرى كما هو موضح سابقًا.
سيتم تشغيل حلقة for والدالة delay() باستمرار لأن الحلقة الرئيسية للاردوينو لا تخرج أبدًا.

ملاحظات على أمثلة برامج حلقة for :
لاحظ ما يلي حول أمثلة البرامج في هذا الدرس .
• تعبير التهيئة Initialize Expression
ليس من الضروري تهيئة تعبير التهيئة في حلقة for إلى صفر (0) ، ولكن يمكن تهيئته إلى أي قيمة صحيحة integer ، أو حتى قيمة سالبة.

• تعبير الزيادة Increment Expression
يُستخدم تعبير الزيادة لتغيير قيمة المتغير الذي يختبره تعبير الاختبار. لا يجب أن يكون هذا عامل زيادة ، ولكن يمكن أن يكون عامل إنقاص decrement (يطرح 1 من المتغير) أو أي تعبير حسابي آخر.
تم استخدام عامل الزيادة في البرامج للحفاظ على بساطة الأمور في البداية ، ولأنها طريقة شائعة لاستخدام حلقة for. سنلقي نظرة على طرق أخرى لاستخدام حلقة for لاحقًا .

• العد من الصفر (0) Counting from Zero (0)
لاحظ أنه في الأمثلة ، تتم تهيئة القيمة التي يحتوي عليها المتغير i على 0 وليس 1. وبالتالي ، فإننا نطبع قيمة عدد تبدأ من 0 وتنتهي عند 9.
يتم تشغيل الحلقة في الواقع 10 مرات وليس 9 مرات. هذا لأننا نبدأ من 0 ، من 0 إلى 9 تكون 10 أرقام ، لكن من 1 إلى 9 تكون 9 أرقام ، ومن 1 إلى 10 تكون 10 أرقام .
تعرض القائمة التالية عدد المرات خلال الحلقة على اليسار وقيمة i على اليمين.

الأردوينو Arduino للمبتدئين  3c49abf95cd848e3a063be52d54d0535


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الثامن حلقات while وdo while والاردوينو

مُساهمة من طرف Admin السبت مارس 28, 2020 11:29 am

دورة برمجة الاردوينو : الدرس الثامن
حلقات while وdo while والاردوينو


تتشابه حلقة while مع حلقة for التي تم شرحها في الدرس السابق. والفرق الرئيسي هو أن حلقة while تفصل separates عناصر حلقة for كما هو موضح لاحقا .
حلقة أخرى تسمى حلقة do while يتم تغطيتها أيضًا. يتم تشغيل حلقة do while دائمًا مرة واحدة على الأقل قبل إجراء أي اختبارات قد تؤدي إلى قطع تنفيذ البرنامج والخروج من الحلقة.

1- حلقة while
البرنامج التالي يفعل بالضبط نفس عمل برنامج حلقة for فى الدرس السابق ، باستثناء أنه يستخدم حلقة while حتى نتمكن من رؤية أوجه التشابه بين الحلقتين.

الكود:
void setup() {
  int i = 0;
 
  Serial.begin(9600);
 
  while (i < 10) {
    Serial.print("i = ");
    Serial.println(i);
    i++;
  }
}

void loop() {
}

بناء حلقة while
تمتلك حلقة while بناء structure على النحو التالي:

الكود:
while (loop test expression goes here) {
  Statements that run in the loop go here
  Statement 1
  Statement 2
  ...
}

تبدأ حلقة while بالكلمة المفتاحية while متبوعة بتعبير اختبار بين قوسي الفتح والإغلاق ( ) . تدل أقواس الفتح والإغلاق { } على جسم الحلقة.

• تعبير الاختبار Test Expression
كما هو الحال مع الحلقة for ، فإن حلقة while لها تعبير اختبار سيحدد ما إذا كانت العبارات في الحلقة ستعمل أم لا. إذا تم تقييم تعبير الاختبار إلى true ، يتم تشغيل عبارات الحلقة. إذا تم تقييم تعبير الاختبار على أنه false ، فلن يتم تشغيل عبارات الحلقة ، ولكن العبارات التي تتبع قوس إغلاق الحلقة سيتم تشغيلها - أي يستمر التنفيذ خارج الحلقة وأسفلها.

• تعبير التهيئة Initialize Expression
تحتوي حلقة for على تعبير تهيئة كجزء من الحلقة. يمكن للحلقة while استخدام أي متغير من البرنامج الذي يحتوي على قيمة صالحة. في مثال البرنامج ، يجب تهيئة المتغير المستخدم في الحلقة (i) عند تعريفه ، وإلا فسيحتوي على أي قيمة عشوائية.

• تعبير الزيادة Increment Expression
تم استخدام تعبير الزيادة في أمثلة حلقة for في الدرس السابق . في مثال حلقة while ، يتم وضع تعبير الزيادة داخل جسم الحلقة.

كيف يعمل مثال حلقة while :
في مثال البرنامج ، يحدث ما يلي:
1. تتم تهيئة المتغير i إلى 0 عند بدء تشغيل البرنامج .
2. تقوم حلقة while بتقييم تعبير الاختبار (i <10).
3. يتم تقييم تعبير الاختبار إلى "صواب" true لأن i أقل من 10.
4. نظرًا لأن تعبير الاختبار صحيح true ، يتم تشغيل العبارات في الحلقة.
5. تتم طباعة القيمة الحالية للمتغير i ثم تتم زيادته.
6. عند الوصول إلى الجزء السفلي من الحلقة ، يبدأ التنفيذ من عند الجزء العلوي من الحلقة مرة أخرى.
7. يتم تقييم تعبير الاختبار مرة أخرى ، يكون صحيحًا true مرة أخرى ، لذلك يتم تشغيل الحلقة مرة أخرى.
فقط عندما يتم زيادة المتغير i إلى 10 ، سيتم تقييم تعبير الحلقة إلى false وسيتم إنهاء (الخروج من) الحلقة.

مثال آخر :
في المثال أدناه ، يتم استخدام حلقة while لحساب count up ما يصل إلى خمسة وعشرين بالخمسات fives عن طريق إضافة خمسة إلى متغير في كل مرة من خلال الحلقة.

الكود:
void setup() {
  int sum = 0;
 
  Serial.begin(9600);
 
  // count up to 25 in 5s
  while (sum < 25) {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  }
}

void loop() {
}

في هذا البرنامج ، يتم تعريف متغير يسمى المجموع sum وتهيئته إلى 0. يختبر تعبير الاختبار في حلقة while إذا كان المجموع sum يحتوي على قيمة أقل من 25.
داخل الحلقة ، يتم زيادة متغير المجموع sum بمقدار 5 في كل مرة من خلال الحلقة بواسطة التعبير الحسابي:

الكود:
sum = sum + 5;

يعني هذا التعبير "إضافة 5 إلى متغير المجموع sum ".
ثم تُطبع القيمة التي يحتفظ بها المتغير sum ، ويتبعها تأخير لمدة نصف ثانية.
نظرًا لأن قيمة المتغير يتم زيادتها أولاً ثم تتم طباعتها ، فإننا نرى القيمة 5 مطبوعة أولاً وليس القيمة 0 التي تمت تهيئتها لها.
على الرغم من أن تعبير الاختبار سيتم تقييمه على أنه خطأ false عند sum == 25 ، إلا أن 25 لا يزال الرقم الأخير الذي يتم طباعته. وذلك لأن آخر مرة يتم فيها تقييم تعبير الاختبار إلى true هي عندما يكون sum == 20 ، ولكن بعد ذلك تتم زيادة المجموع إلى 25 ويتم طباعته قبل تقييم تعبير الاختبار مرة أخرى.

2- حلقة do while :

تعمل حلقة do while بنفس طريقة حلقة while ، إلا أنها تعمل دائمًا مرة واحدة حتى إذا تم تقييم تعبير الاختبار إلى false.

بناء حلقة do while :
تتكون حلقة do whileمن كلمتين رئيسيتين do و while ، كما هو موضح أدناه.

الكود:
 do {
    Statements that run in the loop go here
    Statement 1
    Statement 2
    ...
} while (test expression goes here);

يقع جسم حلقة do while بين أقواس الفتح والغلق { } ويحتوي على العبارات التي سيتم تشغيلها في الحلقة.
بينما تأتي الكلمة الأساسية while وتعبير الاختبار بعد جسم الحلقة ويتم إنهاؤها بفاصلة منقوطة (Wink .

مثال :
هذا المثال يوضح حلقة do while .

الكود:
 void setup() {
  int sum = 0;
 
  Serial.begin(9600);
 
  // count up to 25 in 5s
  do {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  } while (sum < 25);
}

void loop() {
}

يتم تشغيل جميع العبارات في جسم الحلقة قبل تقييم تعبير الاختبار.
إذا تمت تهيئة المجموع sum بقيمة 25 عند تعريفه ، كما هو موضح في البرنامج أدناه ، سيتم تشغيل الحلقة مرة واحدة وسيتم طباعة 30. لن يتم تشغيل الحلقة بعد ذلك لأن تقييم الاختبار يتم تقييمه false .

الكود:
void setup() {
  int sum = 25;
 
  Serial.begin(9600);
 
  // count up to 25 in 5s
  do {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  } while (sum < 25);
}

void loop() {
}

باستخدام نفس البرنامج ، ولكن مع تغيير حلقة do while إلى حلقة while ، كما هو موضح أدناه ، لن يتم تشغيل العبارات في جسم . هذا لأنه يتم تقييم تعبير الاختبار قبل تنفيذ العبارات في جسم الحلقة. يتم تقييم تعبير الاختبار على الفور إلى false ، لذلك لن يتم تشغيل عبارات الحلقة مطلقًا.

الكود:
 void setup() {
  int sum = 25;
 
  Serial.begin(9600);
 
  // count up to 25 in 5s
  while (sum < 25) {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  }
}

void loop() {
}

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

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس التاسع عبارة if والاردوينو The Arduino if Statement

مُساهمة من طرف Admin الأحد مارس 29, 2020 6:25 pm

[SIZE="4"]دورة برمجة الاردوينو : الدرس التاسع
عبارة if والاردوينو The Arduino if Statement


في هذا الدرس ، يتم استخدام عبارة if لتوضيح كيفية اتخاذ القرارات decisions في البرنامج .
يتم استخدام عبارة if للتحقق من دخل لوحة المفاتيح إلى Arduino التي يكتبها المستخدم في نافذة الشاشة التسلسلية لبيئة التطوير Arduino IDE.
يمكن اتخاذ المزيد من القرارات ، اعتمادًا على المفتاح الذي يضغط عليه المستخدم ، على سبيل المثال ، إذا تم الضغط على المفتاح "1" ، يمكن تشغيل الليد LED الموجود على متن لوحة Arduino وإذا تم الضغط على المفتاح "0" ، فإن الليد LED يمكن إيقاف تشغيلها بينما يتم تجاهل جميع ضغطات المفاتيح الأخرى.

استخدام عبارة if Using the if Statement
يوضح البرنامج عبارة if المستخدمة في البرنامج للتحقق مما إذا تم إرسال حرف من نافذة الشاشة التسلسلية Arduino IDE.

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

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();      // get the character
    Serial.print("You typed: ");
    Serial.println(rx_byte);
  }
}

إذا أرسل المستخدم حرفًا character من نافذة الشاشة التسلسلية ، فإن Arduino يرسل رد back النص "You typed: X" ، حيث X هو الحرف الذي كتبه المستخدم.

كيف يعمل البرنامج :
بناء عبارة if للاردوينو Arduino if Statement Structure
تظهر بنية عبارة (تعليمة) if هنا:

الكود:
if (conditional expression) {
  Body of if statement
}

إذا تم تقييم التعبير الشرطي conditional expression إلى "صواب" true ، يتم تشغيل التعليمات البرمجية في جسم body العبارة. إذا تم تقييم العبارة الشرطية إلى خطأ false ، فلن يتم تشغيل أي من التعليمات البرمجية في جسم عبارة if.

• التحقق من وجود حرف من نافذة المراقبة التسلسلية :
في مثال البرنامج ، ستكون القيمة التي تعود بها returns الدالة Serial.available() أكبر من 0 فقط إذا تم استلام حرف أو أكثر بواسطة Arduino من نافذة جهاز العرض التسلسلي.
سيتم تقييم عبارة if إلى true فقط إذا تم استلام حرف واحد أو أكثر.
عندما لا يتم إرسال أحرف إلى Arduino ، سيتم تقييم عبارة if في كل مرة من خلال الحلقة الرئيسية وتقييمها إلى false في كل مرة. وبالتالي لن يتم تشغيل الكود الموجود في جسم جملة if.
بمجرد أن يتم إرسال حرف من نافذة جهاز العرض التسلسلي ، ترجع الدالة Serial.available() "واحد" 1. عند تقييم العبارة if مرة أخرى ، يتم تقييمها إلى true (لأن 1 > 0) ويتم تشغيل الكود في جسم عبارة if .
الحرف الذي تم إرساله من نافذة جهاز العرض التسلسلي يتم تخزينه في المتغير rx_byte باستخدام سطر التعليمات البرمجية التالي.

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

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

استخدام عبارة if لتشغيل ليد Switch On an LED :
يمكن استخدام عبارة if لاتخاذ قرار make a decision بتشغيل LED إذا تم استلام (استقبال) حرف معين كما يوضح هذا المثال التالي.

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
    if (rx_byte == 'a') {
      digitalWrite(13, HIGH);
    }
  }
}

في هذا البرنامج ، إذا كان الحرف المرسل من نافذة الشاشة التسلسلية هو 'a' ، فسيتم تشغيل الليد LED الموجود في الطرف 13 من Arduino. إذا تم إرسال أي حرف آخر ، فلن يحدث شيء.
عبارة if التالية :

الكود:
 if (rx_byte == 'a')
سيتم تقييمها إلى "صواب" true فقط إذا كان الحرف الذي تم إستقباله من نافذة جهاز العرض التسلسلي والمخزن في المتغير rx_byte يساوي 'a'.

إيقاف تشغيل الليد مرة أخرى Switching the LED Off Again :

يمكن تعديل البرنامج أعلاه لإضافة عبارة if أخرى يمكن استخدامها لإيقاف تشغيل الليد LED مرة أخرى.
سيعمل البرنامج أدناه على تشغيل الليد LED إذا تم إرسال 'a' إلى Arduino وإيقاف تشغيل LED إذا تم إرسال 'b' إلى Arduino (لاحظ أنها حساسة لحالة الأحرف ، لذلك فإن استخدام 'A' و 'B' لن تعمل).

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();      //
    if (rx_byte == 'a') {
      digitalWrite(13, HIGH);
    }
    if (rx_byte == 'b') {
      digitalWrite(13, LOW);
    }
  }
}

الآن إذا تم إرسال الحرف "b" ، يتم تقييم اختبار عبارة if للحرف 'a' إلى "خطأ" false ، ولكن يتم تقييم اختبار عبارة if للحرف جملة الحرف 'b' إلى "true" ويتم إيقاف تشغيل الليد LED.
يتم تناول طريقة أكثر فاعلية للتعامل مع تشغيل وإيقاف تشغيل الليد LED في الدرس التالي والذي يغطي عبارات else و else if .
[/SIZE]

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس العاشر اتخاذ القرارات باستخدام if-else Making Decisions with if-else :

مُساهمة من طرف Admin الأحد مارس 29, 2020 6:41 pm

دورة برمجة الاردوينو : الدرس العاشر
اتخاذ القرارات باستخدام if-else Making Decisions with if-else :


متابعة للدرس التاسع الذى غطى عبارة if ، نتناول الآن بنية if-else if-else construct .
يضيف هذا البناء construct المزيد من القدرة على اتخاذ القرار لعبارة if.

استخدام if-else :
عند استخدام عبارة if ، يتم تشغيل التعليمات البرمجية (الكود) في جسم عبارة if فقط عندما يتم تقييم عبارة if إلى true. عندما يتم تقييمها false ، يتخطى تنفيذ البرنامج الكود في جسم عبارة ة if ويستمر أسفل جسم عبارة if.

عن طريق إضافة عبارة else ، سيتم تشغيل التعليمات البرمجية في جسمها فقط عندما يتم تقييم عبارة if المقابلة لها إلى false .
يعرض الكود التالي بناء بنية if-else.

الكود:
if (conditional expression) {
}

else {
}

يوضح الكود أدناه كيف يقارن عمل عبارة if مع عمل بنية if-else.

الكود:
// "if" statement
if (conditional expression) {
  // Code placed here only runs if conditional expression is true
}

// Whether the conditional expression evaluates to true or false,
// code placed here will run

// "if-else" construct
if (conditional expression) {
  // Body of the "if" statement between { and }
  // Works as a normal "if" statement, code placed here will only
  // run if the conditional expression evaluates to true
}

else {
  // Body of the "else" statement between { and }
  // Code placed here will always run if the conditional expression
  // from the "if" statement evaluates to false
}

// Code placed below the if-else construct will always run whether
// the conditional expression evaluated to true or false

عندما يتم تقييم التعبير الشرطي conditional expression بالقيمة true:
1. يتم تشغيل التعليمات البرمجية في جسم عبارة if.
2. لا يتم تشغيل التعليمات البرمجية في جسم عبارة else .

عندما يتم تقييم التعبير الشرطي conditional expression إلى false :
1. الكود في جسم عبارة if لا يتم تشغيله .
2. يتم تشغيل الكود في جسم عبارة else .

مثال لبرنامج if-else :
يوضح البرنامج أدناه مثالًا على استخدام بنية if-else. سيتم تشغيل الليد LED (المتصل بالطرف 13 ) إذا تم إرسال الحرف 'a' إلى Arduino باستخدام نافذة الشاشة التسلسلية. إذا تم إرسال أي حرف آخر باستثناء 'a' ، فسيتم تقييم عبارة if إلى false ويتم تشغيل الكود الموجود في كتلة else مما يؤدي إلى إيقاف تشغيل LED.

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
    if (rx_byte == 'a') {
      // switch the LED on if the character 'a' is received
      digitalWrite(13, HIGH);
    }
    else {
      // switch the LED off if any character except 'a' is received
      digitalWrite(13, LOW);
    }
  }
}

ملاحظات حول مثال برنامج if-else
• بنية if-else المتداخلة Nested if-else Construct
يتم وضع بنية if-else في المثال أعلاه بالفعل داخل جسم عبارة if أخرى. هذا يسمى "تداخل" "nesting" ونقول أن
if-else متداخلة داخل عبارة if الأولى.
لجعل هذا أكثر وضوحًا ، هذا هو بناء if-else المتداخل:

الكود:
if (rx_byte == 'a') {
  // switch the LED on if the character 'a' is received
  digitalWrite(13, HIGH);
}
else {
  // switch the LED off if any character except 'a' is received
  digitalWrite(13, LOW);
}

يتم تداخل الكود أعلاه داخل جسم عبارة if هذه :

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

• كيف يعمل البرنامج :
يعتمد مثال البرنامج على برنامج من الدرس السابق . بدلاً من إيقاف تشغيل الليد LED عند إرسال 'b' فقط ، سيتم إيقاف تشغيل الليد LED عند إرسال أي حرف باستثناء 'a'.
سيقوم الحرف 'a' بتشغيل الليد LED كما في البرنامج السابق لأن التعبير الشرطي فى عبارة if يتم تقييمه إلى true عند استقبال 'a' . أي حرف آخر يتم استلامه سيؤدي إلى تقييم التعبير الشرطي إلى false . عندما يتم تقييم التعبير على أنه false ، لا يتم تشغيل جسم عبارة (جملة) if ، ولكن يتم تشغيل جسم عبارة else بدلاً من ذلك ، مما يؤدي إلى إيقاف تشغيل الليد LED.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الحادى عشر القرارات باستخدام if-else-if Decisions with if-else-if :

مُساهمة من طرف Admin الأحد مارس 29, 2020 6:51 pm

دورة برمجة الاردوينو : الدرس الحادى عشر
القرارات باستخدام if-else-if Decisions with if-else-if :


تسمح بنية if-else-if بتقييم "المزيد من التعبيرات الشرطية" عن بنية if-else الذي تم تغطيتها سابقًا.
ما يعنيه هذا هو أنه يمكننا إضافة المزيد من القدرة على اتخاذ القرار إلى برامج الاردوينو . يمكن التحقق من متغير واحد لمعرفة ما إذا كان يحتوي على أي واحدة من عدد من القيم المختلفة ويمكن اتخاذ قرار اعتمادًا على القيمة التي يحتوي عليها المتغير.

استخدام بنية if-else-if :
بناء if-else-if موضح أدناه.

الكود:
if (conditional expression 1) {
}
else if (conditional expression 2) {
}

كما هو مبين ، فإن بناء if-else-if يسمح بتقييم تعبير شرطي ثانٍ بعد عبارة if الأولى.
إذا تم تقييم التعبير الشرطي الأول إلى "صواب" true ، فسيتم تشغيل التعليمات البرمجية الموجودة في جسم جملة if ولن يتم تشغيل التعليمات البرمجية الموجودة في جسم جملة else-if .
فقط إذا تم تقييم التعبير الشرطي الأول إلى خطأ false ، فسيتم تقييم التعبير الشرطي الثاني. إذا تم تقييم التعبير الشرطي الثاني إلى "صواب" true ، فسيتم تشغيل الكود الموجود في الكتلة أسفل عبارة else-if . إذا تم تقييم التعبير الشرطي الثاني إلى خطأ false ، فسيستمر تنفيذ البرنامج أسفل قوس الإغلاق لجسم عبارة else-if .

مثال على if-else-if :
يوضح البرنامج أدناه استخدام بنية if-else-if. إذا تم إرسال الحرف 'a' من نافذة الشاشة التسلسلية ، سيومض الليد LED بمعدل معين. إذا تم إرسال الحرف 'b' ، سيومض الليد LED بمعدل أسرع.

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
  }
  if (rx_byte == 'a') {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
  else if (rx_byte == 'b') {
    digitalWrite(13, HIGH);
    delay(200);
    digitalWrite(13, LOW);
    delay(200);
  }
}

أول عبارة if تحصل على حرف من المنفذ التسلسلي إذا كان متاحًا. فيما يلى بناء if-else-if .

الكود:
if (rx_byte == 'a') {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}
else if (rx_byte == 'b') {
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(200);
}

تحديد المعدل الذي يومض به الليد LED :
يتحقق هذا الكود ببساطة من الحرف الذي يحمله المتغير rx_byte. إذا كان هذا المتغير يحتوي على 'a' ، فسيتم تشغيل الكود الموجود في كتلة if والذي سيومض الليد مع تأخير 500 مللي ثانية. يؤدي هذا إلى تشغيل الليد لمدة 500 مللي ثانية باستخدام الدالة delay() ثم إيقاف تشغيله لمدة 500 مللي ثانية.
إذا كان المتغير يحتفظ بالقيمة 'b' ، فسوف يومض الليد بمعدل أسرع عن طريق تغيير أوقات تشغيل وإيقاف الليد إلى 200 مللي ثانية.

إيقاف الليد عن الوميض :
إذا تم إرسال أي حرف فيما عدا 'a' أو 'b' ، فسيتوقف الليد عن الوميض لأنه لن يتم تقييم أي من التعبيرات الشرطية إلى true.

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

بناء if-else-if-else The if-else-if-else Construct
بنفس الطريقة التي يمكننا من خلالها إضافة عبارة else أسفل عبارة if ، يمكننا إضافة عبارة else أسفل بناء if-else-if كما يوضح البرنامج أدناه.
يعمل هذا البرنامج بنفس طريقة البرنامج السابق ، باستثناء أنه عندما يتم إرسال أي حرف باستثناء 'a' أو 'b' ، يتم تشغيل كتلة else التي تومض الليد بشكل أسرع من معدلي الوميض السابقين.

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
  }
  if (rx_byte == 'a') {
    // the character 'a' was received, blink the LED once per second
    digitalWrite(13, HIGH);  // switch the LED on
    delay(500);              // leave the LED on for 500ms
    digitalWrite(13, LOW);  // switch the LED off
    delay(500);              // leave the LED off for 500ms
  }
  else if (rx_byte == 'b') {
    // the character 'b' was received, blink the LED every 400ms
    digitalWrite(13, HIGH);  // switch the LED on
    delay(200);              // leave the LED on for 200ms
    digitalWrite(13, LOW);  // switch the LED off
    delay(200);              // leave the LED off for 200ms
  }
  else {
    // any character except 'a' or 'b' was received
    digitalWrite(13, HIGH);  // switch the LED on
    delay(100);              // leave the LED on for 100ms
    digitalWrite(13, LOW);  // switch the LED off
    delay(100);              // leave the LED off for 100ms
  }
}

عندما يبدأ البرنامج في العمل ، يومض الليد على الفور بأسرع معدل عن طريق تشغيل الكود في كتلة else . هذا لأن المتغير rx_byte يتم تهيئته إلى 0 وهو بالطبع ليس 'a' أو 'b'.
إذا كنت تريد أن يومض الليد بأبطأ معدل عند بدء البرنامج ، فقم بتهيئة المتغير إلى 'a' كما هو موضح هنا.

الكود:
char rx_byte = 'a';

تقييم المزيد من التعبيرات الشرطية :
يمكن تقييم المزيد من التعبيرات الشرطية عن طريق إضافة المزيد من عبارات else if بعد عبارة if الأولى كما هو موضح هنا.

الكود:
if (conditional expression 1) {
}
else if (conditional expression 2) {
}
else if (conditional expression 3) {
}
else if (conditional expression 4) {
}
etc. ...

لتنفيذ مهمة فقط إذا لم يتم تقييم أي من التعبيرات الشرطية على "صحيح" true ، يمكن إضافة شرط آخر في النهاية كما هو موضح أدناه.

الكود:
 if (conditional expression 1) {
}
else if (conditional expression 2) {
}
else if (conditional expression 3) {
}
else if (conditional expression 4) {
}
else {
}

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الثانى عشر العوامل المنطقية Logical Operators :

مُساهمة من طرف Admin الإثنين مارس 30, 2020 12:13 pm

دورة برمجة الاردوينو : الدرس الثانى عشر
العوامل المنطقية Logical Operators :


يمكن استخدام العوامل المنطقية مع if و if-else لتبسيط وتوسيع عملية صنع القرار.
العوامل المنطقية الثلاثة هي "أو" OR (||) و "و" AND (&&) و "نفى" NOT (!) التي يتم شرحها وتوضيحها في هذا الدرس .

1- العامل المنطقي OR (||) : The OR Logical Operator (||)
يتم كتابة العامل المنطقي OR في البرامج على هيئة الرمز (||) الموجودة على نفس مفتاح الشرطة المائلة للخلف (\) في لوحة المفاتيح . الضغط على Shift + مفتاح الخط المائل للخلف سيكتب هذا الرمز ( || ) .
يوضح البرنامج التالي استخدام العامل المنطقي OR للتحقق من الحروف الأبجدية ، الكبيرة والصغيرة .

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
    if (rx_byte == 'a' || rx_byte == 'A') {
      digitalWrite(13, HIGH);
    }
    else {
      digitalWrite(13, LOW);
    }
  }
}

سيقوم البرنامج لتشغيل الليد على لوحة Arduino Uno إذا تم إرسال الحرف الصغير 'a' أو or الحرف الكبير 'A' من نافذة الشاشة التسلسلية. إذا تم إرسال أي حرف آخر ، يتم إيقاف تشغيل الليد .

• كيف يعمل العامل المنطقي OR
الكود أدناه مأخوذ من البرنامج أعلاه ويعرض العامل المنطقي OR.

الكود:
if (rx_byte == 'a' || rx_byte == 'A') {
  digitalWrite(13, HIGH);
}

سيتم تشغيل الكود الموجود في جسم عبارة if إذا كان المتغير rx_byte يحتوي على 'a' أو OR (||) إذا كان يحتوي على 'A'. تم استخدام العامل OR لاختبار حرف أو آخر (A OR a).
يمكن تعديل الكود لتشغيل الليد إذا تم استقبال الحرف 'a' أو الحرف'b' أو الحرف 'c' ، كما يوضح هذا الكود التالي.

الكود:
if ((rx_byte == 'a') || (rx_byte == 'b') || (rx_byte == 'c')) {
  digitalWrite(13, HIGH);
}
 
في الكود أعلاه ، تم وضع كل عامل المقارنة يساوى (==) للمقارنة بين قوسين () لتسهيل قراءة الكود. يؤدي هذا أيضًا إلى تجنب أي سوء فهم بشأن أي عامل يتم تقييمه أولاً (هل يتم تقييم == أو || أولاً؟).
عامل المقارنة == له أسبقية أعلى من العامل المنطقى || مما يعني أن == يتم تقييمه أولاً. الأقواس لها أعلى أسبقية ، لذلك سيتم تقييم أي شيء يوضع بين قوسين أولاً. في هذه الحالة ، ليس من الضروري وضع الأقواس ، ولكنه يسهل القراءة.

2- العامل المنطقي "و" AND (&&) : The AND Logical Operator (&&)
يوضح البرنامج التالي استخدام العامل المنطقي AND. يختبر البرنامج لمعرفة أنه تم استلام تسلسل (تتابع) sequenc من حرفين قبل تشغيل الليد .

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char first_char = 0;

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();      // read the character
    if ((first_char == 'c') && (rx_byte == 'd')) {
      digitalWrite(13, HIGH);
    }
    else {
      first_char = rx_byte;        // save the character for next comparison
      digitalWrite(13, LOW);
    }
  }
}

في هذا البرنامج ، يجب إرسال حرفين بالترتيب الصحيح لتشغيل الليد LED. يجب أولاً إرسال حرف 'c' متبوعة بحرف 'd'.

• كيف يعمل العامل المنطقى AND :
يظهر العامل AND من البرنامج أعلاه كما يلى .

الكود:
 if ((first_char == 'c') && (rx_byte == 'd')) {
  digitalWrite(13, HIGH);
}

سيتم تشغيل الليد LED فقط عندما يحتوي المتغير first_char على 'c' و AND المتغير rx_byte يحتوي على 'd'.
يتم استخدام المتغير first_char لتخزين الحرف الحالي المستقبل بحيث يمكننا في المرة القادمة تقييم العبارة if ، يمكننا أن نرى ما إذا كان متبوعًا بالحرف 'd' وإذا كان يحتوي على 'c'.

3- العامل المنطقى (نفى أو معكوس) NOT : The Logical NOT Operator (!)
يمكن استخدام العامل NOT للتحقق مما إذا كان المتغير يحتوي على القيمة 0 - بمعنى آخر ، يمكن استخدامه للتحقق مما إذا كان المتغير يقيم على أنه خطأ false .

الكود:
int x = 0;
if(!x) {
   // if not x - if x evaluates to false, code here will run
}

// this code is another way of writing the above code
if (x == 0) {
}

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

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
 
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();      // read the character
    if (!(rx_byte == 'a')) {
      digitalWrite(13, HIGH);
    }
    else {
      digitalWrite(13, LOW);
    }
  }
}

يقوم العامل not بعكس inverts المنطق في عبارة if الثانية كما هو موضح أدناه .

الكود:
if (!(rx_byte == 'a')) {
  digitalWrite(13, HIGH);
}

إذا كان المتغير rx_byte يحتوي على الحرف 'a' ، فسيتم تقييم التعبير في عبارة if إلى true ، ولكن العامل NOT يغير النتيجة إلى false بحيث يتم إيقاف تشغيل LED عند استلام 'a'.
وبالمثل ، إذا كان المتغير rx_byte يحتوي على أي حرف باستثناء 'a' ، فسيتم تقييم التعبير إلى false ، ولكن عامل التشغيل NOT يحول النتيجة false إلى true.

يمكن كتابة الكود أعلاه بسهولة أكبر باستخدام عامل المقارنة (!=) لا يساوي كما يلي.

الكود:
if (rx_byte != 'a') {
  digitalWrite(13, HIGH);
}

العامل المنطقي NOT لديه تطبيق عملي في البرامج الأكثر تعقيدًا. تذكر فقط أنه إذا كانت نتيجة المقارنة بحاجة إلى عكسها ، فيمكن استخدام العامل المنطقي NOT. يمكن استخدامه لفرض (لإجبار) عبارة if للتقييم إلى true عندما يتم تقييمها عادةً على false ، وبالتالي تنفيذ الكود في جسم عبارة if بدلاً من الحاجة إلى وجود عبارة if فارغة وتشغيل الكود في كتلة else المقابلة .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الثالث عشر عبارات switch و break

مُساهمة من طرف Admin الثلاثاء مارس 31, 2020 10:51 am

دورة برمجة الاردوينو : الدرس الثالث عشر
عبارات switch و break : Arduino switch and break Statements


عبارة switch تشبه استخدام if مع عدة أبنية else-if . يتم استخدام switch بالتزامن (مقترنة) مع break التى سيتم شرحها أيضًا في هذا الدرس .
استخدام switch بدلاً من العديد من أبنية else-if أسهل في القراءة ولديها المزيد من المرونة.

مثال عبارة switch :
يوضح برنامج اردوينو التالي عبارة switch التى يتم استخدامها بالاقتران مع عبارة break .
قم بتحميل البرنامج إلى Arduino ثم ابدأ تشغيل نافذة الشاشة التسلسلية. سيؤدي إرسال 1 من نافذة الشاشة التسلسلية إلى Arduino إلى تشغيل الليد الموجود على اللوحة ، بينما يؤدي إرسال 2 إلى إيقاف تشغيل الليد .
سيعرض إرسال 3 قائمة الخيارات التي يعمل عليها البرنامج . سيؤدي إرسال أي حرف آخر إلى ظهور رسالة افتراضية توضح أن الخيار الذي تم اختياره غير صالح.

الكود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
 
    switch (rx_byte) {
      case '1':
        digitalWrite(13, HIGH);
        Serial.println("LED is ON");
      break;
     
      case '2':
        digitalWrite(13, LOW);
        Serial.println("LED is OFF");
      break;
     
      case '3':
        Serial.println("------- MENU -------");
        Serial.println("1. Switch LED on.");
        Serial.println("2. Switch LED off.");
        Serial.println("3. This menu.");
        Serial.println("--------------------");
      break;
     
      default:
        Serial.println("Invalid option");
      break;
    } // end: switch (rx_byte)
  } // end: if (Serial.available() > 0)
}

سيتم شرح كيفية عمل البرنامج لاحقًا ، ولكن يجب علينا أولاً أن ننظر إلى بنية عبارة switch وكيف تعمل عبارة break .

بناء عبارة switch : Structure of the switch Statement
توضح الصورة أدناه بناء عبارة switch .

الأردوينو Arduino للمبتدئين  Ec092f62d18a44ccb6db028d1835b18e

تحتوي عبارة switch على متغير (switch_var في الصورة أعلاه أو rx_byte في المثال السابق ) يمكن أن يكون متغيرًا صحيحًا (int) أو حرفًا (char).
سيتم اختبار متغير switch مقابل القيمة في كل حالة case لمعرفة ما إذا كانت متطابقة. عندما يتم العثور على حالة تطابق ، سيتم تشغيل العبارات الموجودة أسفل الحالة case حتى يتم الوصول إلى الكلمة الأساسية break . سيؤدي ذلك إلى كسر تدفق البرنامج خارج جسم عبارة switch وسيستمر تنفيذ البرنامج أسفل قوس إغلاق عبارة switch .
إذا لم يتم العثور على حالة case مطابقة ، فسيتم تشغيل الكود الموجود أسفل الكلمة الرئيسية default حتى يتم العثور على عبارة break .

كيف يعمل برنامج المثال :
في برنامج المثال، يتم وضع عبارة switch داخل عبارة if في الحلقة الرئيسية. عندئذٍ ، يتم تشغيل عبارة switch فقط في حالة استقبال حرف جديد من نافذة Serial Monitor.
عند استقبال حرف من نافذة Serial Monitor ، ستتحقق عبارة switch من وجود قيمة حالة case مطابقة. في حالة استقبال الحرف '1' ، يتم تشغيل الليد ويتم عرض رسالة في نافذة الشاشة التسلسلية.
إذا تم استقبال '2' ، يتم إيقاف تشغيل الليد . يعرض '3' قائمة بالخيارات المتاحة في البرنامج .
إذا تم إرسال أي حرف لا يتطابق مع الأحرف الموجودة في أي من عبارات الحالة case ، يتم تشغيل الكود الموجود في الجزء الافتراضي default من جسم switch والذي يعرض رسالة افتراضية.

عبارة break : The break Statement
يتم استخدام عبارة break في برنامج المثال للخروج من جسم عبارة switch .
يمكن أيضًا استخدام break للخروج من أي حلقة مثل while أو for . على سبيل المثال ، يمكن اختبار شرط معين في حلقة باستخدام عبارة if وإذا تم تقييم العبارة إلى true ، يمكن تشغيل عبارة break للخروج من الحلقة.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty لدرس الرابع عشر التعبير الشرطى Conditional expression والعامل الشرطى Conditional Oper

مُساهمة من طرف Admin الثلاثاء مارس 31, 2020 12:06 pm

دورة برمجة الاردوينو : الدرس الرابع عشر
التعبير الشرطى Conditional expression والعامل الشرطى Conditional Operator

العامل الشرطي conditional operator هو بناء صنع قرار آخر في برمجة Arduino.
يتكون العامل الشرطي من شرط condition ، يمكن تقييمه إلى صواب true أو خطأ false ، وتعبيران expressions.

إذا تم تقييم الشرط بالقيمة true ، يصبح "التعبير الشرطي" conditional expression مساوياً للتعبير الأول.
إذا تم تقييم الشرط على أنه false ، يصبح "التعبير الشرطى" مساوياً للتعبير الثاني.
سيشرح الجزء المتبقي من هذا الدرس ويوضح كيفية عمل العامل الشرطي.

بناء العامل الشرطى Structure of the Conditional Operator (? Smile
العامل الشرطي يكون له البناء التالي:

الكود:
condition ? first_expression : second_expression;

حيث يتم تقييم الشرط condition إما إلى صواب true أو خطأ false مما يؤدي إلى أن يصبح التعبير بأكمله مساويًا للتعبير الأول first_expres​sion(إذا تم تقييم الشرط condition إلى صواب true ) أو التعبير الثاني second_expres​sion(إذا تم تقييم الشرط إلى خطأ false ).

كما يتضح من الكود أعلاه ، يتكون العامل الشرطي conditional operator من علامة الاستفهام (؟) وعلامة النقطتين (Smile.
البرنامج أدناه لإظهار كيفية استخدام التعبير الشرطي.

مثال برنامج "التعبير الشرطي" Conditional Expression
يستخدم البرنامج أدناه العامل الشرطي لتحديد أي رقم أكبر من رقمين.

الكود:
int val1, val2, result;

void setup() {
  Serial.begin(9600);
 
  // change the values of val1 and val2 to see what the
  // conditional expression does
  val1 = 2;
  val2 = 5;
  // if val1 is bigger than val2, return val1
  // else if val1 is less than val2, return val2
  result = (val1 > val2) ? val1 : val2;
 
  // show result in serial monitor window
  Serial.print("The bigger number is: ");
  Serial.println(result);
}

void loop() {
}

قم بتغيير قيمة المتغيرات val1 و val2 في البرنامج ، وسيتم عرض أكبر الرقمين دائمًا في نافذة الشاشة التسلسلية في Arduino IDE.

كيف يعمل البرنامج :
يتم تقييم الشرط (val1> val2) وسيتم تقييمه إما إلى صواب true أو خطأ false.
تقييم الشرط خطأ false
إذا كانت val1 أقل من val2 ، يتم تقييم الشرط إلى false. يأخذ التعبير الشرطي ككل الآن قيمة التعبير الثاني - وهو val2.
ثم يتم تعيين result لقيمة التعبير وهي val2 (أى 5 فى البرنامج ) وهي أكبر رقم من القيمتين val1 و val2.
تقييم الشرط صواب true
إذا قمنا بتغيير قيمة val1 إلى 12 بحيث يكون لدينا:

الكود:
val1 = 12;
val2 = 5;

val1 الآن أكبر من val2 ويتم تقييم الشرط إلى true. يأخذ التعبير الشرطي قيمة التعبير الأول - وهو val1.
يتم تعيين المتغير result لقيمة التعبير وهي val1. val1 هي أكبر القيمتين (بقيمة 12).

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الخامس عشر الدوال والاردوينو Arduino Functions

مُساهمة من طرف Admin الثلاثاء مارس 31, 2020 7:22 pm

دورة برمجة الاردوينو : الدرس الخامس عشر
الدوال والاردوينو Arduino Functions


في هذا الدرس ، ستتعلم كيفية كتابة الدوال الخاصة بك واستخدامها في برامجك . يتم شرح بناء structure واستخدام الدوال بشكل كامل.
تم تناول الدوال بإيجاز في الدرس الأول حيث تعرفنا على بعض الحقائق الأساسية حول الدوال حيث تم ذكرها :
1) يجب أن يكون لكل دالة اسم فريد ،
2) يتبع اسم الدالة بأقواس ()
3) الدوال لها نوع إرجاع ، على سبيل المثال void
4) جسم الدالة محاط داخل أقواس الفتح والإغلاق {}.
سنبدأ بفحص بناء الدالة ثم نرى كيفية كتابة الدوال .

بناء الدالة The Structure of a Function
قبل أن يتم (يمكن) استخدام دالة في برنامج ، يجب إنشاؤها. الكود التالى هو مثال على دالة تم إنشاؤها لطباعة خط متقطع dashed line في Arduino IDE.

الكود:
void DashedLine()
{
    Serial.println("----------------");
}

الكود أعلاه والذي ينشىء creates الدالة يسمى "تعريف الدالة" function definition . توضح الصورة أدناه مكونات الدالة .

الأردوينو Arduino للمبتدئين  118a269d6bbd437a926767f149d44b65

1- اسم الدالة Function Name
عندما نقوم بإنشاء دالة ، يجب أن يكون لها اسم name. اصطلاح التسمية للدوال هو نفسه للمتغيرات:
• يمكن أن يتكون اسم الدالة من أحرف أبجدية (A to Z; a to z; 0 to 9) والشرطة السفلية (_).
• لا يبدأ اسم الدالة برقم number ، أي الأرقام من 0 إلى 9.
• يجب عدم استخدام اسم دالة هو نفس الكلمة الرئيسية للغة أو دالة موجودة.
ينتهي اسم الدالة بالأقواس (). لا يتم تمرير أي شيء إلى دالة المثال أعلاه ، لذلك تكون الأقواس فارغة. سيتم شرح تمرير القيم values أو البارامترات parameters إلى الدوال لاحقًا في هذا الدرس .


2- نوع الإرجاع Return Type
يجب أن يكون للدالة نوع إرجاع. لا ترجع دالة المثال أي شيء ، لذلك يوجد لها نوع إرجاع فارغ void. سيتم شرح إرجاع قيمة من دالة في الجزء التالي من هذا الدرس .

3- جسم الدالة Function Body
يتكون جسم الدالة من العبارات statements الموضوعة بين القوسين {}. تشكل العبارات وظيفة الدالة (ماذا ستفعل الدالة عندما يتم استدعاؤها).
عند استخدام دالة ، يقال أنها "تستدعى " "called". سنلقي نظرة على كيفية استدعاء دالة بعد ذلك.

استدعاء دالة Calling a Function
لاستخدام الدالة التي تم إنشاؤها أعلاه ، يجب استدعاؤها في البرنامج كما هو موضح في البرنامج أدناه.

الكود:
void setup() {
  Serial.begin(9600);
 
  DashedLine();
  Serial.println("| Program Menu |");
  DashedLine();
}

void loop() {
}

void DashedLine()
{
  Serial.println("----------------");
}

في البرنامج أعلاه ، يتم إنشاء الدالة DashedLine() في أسفل البرنامج ثم يتم استدعاؤها مرتين في أعلى البرنامج كما هو موضح في الصورة أدناه.

الأردوينو Arduino للمبتدئين  8ebe892b01a641bb8607e9562b8dacb3

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

الأردوينو Arduino للمبتدئين  50c1bbe44652468ea81a5eaa81829803

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

لماذا استخدام الدوال Why Use Functions
الدالة المستخدمة في المثال أعلاه بسيطة للغاية ، لذلك لن يتم رؤية جميع مزايا استخدام الدوال على الفور.
إحدى مزايا استخدام الدوال هي أنها تتجنب الاضطرار إلى كتابة نفس الكود مرارًا وتكرارًا في البرنامج يوفر الوقت والذاكرة. في كل مرة يتم فيها استدعاء دالة ، فإننا نعيد استخدام الكود الذي تمت كتابته مرة واحدة فقط.

إذا كانت هناك حاجة إلى تعديل دالة ما ، فيجب إجراؤها مرة واحدة فقط وستدخل التعديلات حيز التنفيذ في كل مكان في البرنامج الذي يتم استدعاء الدالة . إذا لم يتم استخدام دالة ، فسيكون من الضروري تحديد مكان وتعديل كل مكان توجد فيه العبارات في البرنامج للقيام بمهمة معينة.

يمكن استخدام الدوال الوظائف لتقطيع (تكسير - تجزئة) break برنامج إلى أجزاء تجعله أكثر وحدات modular وأسهل في الفهم. يمكن إعادة استخدام الدوال في برامج الأخرى.

تمرير قيمة إلى دالة Passing a Value to a Function
في البرنامج أعلاه ، طول الخط الذي تطبعه الدالة يكون ثابت فى الدالة . إذا قمنا بتغيير النص الموجود في المربع ، فقد لا يتناسب مع المربع بشكل صحيح. يجب تعديل الدالة حتى تتمكن من معرفة حجم الخط الذي يجب رسمه.
يمكن تعديل الدالة أعلاه لتمرير قيمة value لها تخبرها بعدد الأحرف التي تصنع الخط الذي ترسمه.
يظهر البرنامج المعدّل أدناه.

الكود:
 void setup() {
  Serial.begin(9600);
 
  // draw the menu box
  DashedLine(24);
  Serial.println("| Program Options Menu |");
  DashedLine(24);
}

void loop() {
}

void DashedLine(int len)
{
  int i;
 
  // draw the line
  for (i = 0; i < len; i++) {
    Serial.print("-");
  }
  // move the cursor to the next line
  Serial.println("");
}

يتم تعديل الدالة DashedLine() في البرنامج أعلاه بحيث يمكن تمرير قيمة عدد صحيح إليها. يجب أن يتألف الخط (السطر) line من 24 حرفًا ليتناسب مع نص القائمة الجديدة ، لذلك نمرر لها القيمة 24.

الكود:
DashedLine(24);  // passing a value of 24 to the function

بالطبع يجب تعديل الدالة للتعامل مع القيمة التي يتم تمريرها إليها:

الكود:
void DashedLine(int len)
{
  int i;
 
  // draw the line
  for (i = 0; i < len; i++) {
    Serial.print("-");
  }
  // move the cursor to the next line
  Serial.println("");
}

يجب أن تكون الدالة قادرة على قبول قيمة عدد صحيح يتم تمريره إليها. يتم إدراج نوع المتغير واسم المتغير بين قوسى الفتح والإغلاق بعد اسم الدالة .

الكود:
void DashedLine(int len)

يمكننا الآن استخدام متغير العدد الصحيح len في جسم الدالة DashedLine() . سيحتوي المتغير على أي قيمة يتم تمريرها إليها عند استدعاء الدالة .
يستخدم جسم الدالة المتغير len في حلقة لطباعة العدد الصحيح من الشرطات التي تشكل الخط المتقطع لمربع القائمة.
يتم نقل المؤشر إلى السطر التالي في جهاز العرض التسلسلي عن طريق استدعاء Serial.println(""); بسلسلة فارغة.
بعد أن تقوم الدالة بتشغيل العبارة الأخيرة في جسمها ، يقال أنها "تعود أو ترجع" "return". عندما تعود إحدى الدوال ، يستمر تنفيذ البرنامج أسفل العبارة التي تستدعى الدالة - أي يتم تشغيل العبارة التالية لاستدعاء الدالة بعد ذلك.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس السادس عشر إرجاع (إعادة) قيمة من دالة Returning a Value from a Function

مُساهمة من طرف Admin الأربعاء أبريل 01, 2020 11:36 am

دورة برمجة الاردوينو : الدرس السادس عشر
إرجاع (إعادة) قيمة من دالة Returning a Value from a Function


في الدرس السابق ، تناولنا في كيفية تمرير قيمة إلى دالة. الآن نلقي نظرة على كيفية استعادة قيمة من دالة.
تسمى استعادة قيمة من دالة "إرجاع أو إعادة" "returning"القيمة من الدالة. يتم استخدام الكلمة الأساسية "العائد" return في نهاية الدالة لاستعادة القيمة. يجب أن نذكر أيضًا نوع القيمة التي ترجعها الدالة ، على سبيل المثال int ، float ، إلخ.
يستخدم البرنامج أدناه دالة لإجراء حساب رياضي ثم إرجاع return نتيجة الحساب التي يمكن استخدامها بعد ذلك في برنامج الاردوينو الرئيسي.

الدالة التى تعيد (ترجع) قيمة Function that Returns a Value

الكود:
void setup() {
    float area;
 
    Serial.begin(9600);
    // calculate the area of a circle with radius of 9.2
    area = CircleArea(9.2);
    Serial.print("Area of circle is: ");
    // print area to 4 decimal places
    Serial.println(area, 4);
}

void loop() {
}

// calculate the area of a circle
float CircleArea(float radius)
{
    float result;
   
    result = 3.141592654 * radius * radius;
   
    return result;
}

ما الذى يفعله البرنامج :
يحسب البرنامج مساحة الدائرة من قيمة نصف قطر الدائرة التي تم تحديدها بشكل ثابت في البرنامج - في المثال ، يتم تعيين القيمة على 9.2 ، ولكن يمكنك تعيينها إلى أي قيمة تريدها. ثم يتم إرسال نتيجة الحساب خارج المنفذ التسلسلي بحيث يمكن رؤيته في نافذة الشاشة التسلسلية Arduino IDE.

صيغة حساب مساحة الدائرة هي:

الكود:
A = π × r²
OR
A = π × r × r

Where:
A = area of the circle
π = PI = 3.141592654
r = radius of the circle

بمعنى آخر ، إذا كنا نعرف نصف قطر الدائرة (نصف القطر هو المسافة من مركز الدائرة إلى الحافة) يمكننا حساب مساحة الدائرة.
يمكن أن تكون الوحدة unit التي يوجد بها نصف القطر أي وحدة تُستخدم لقياس المسافة وستكون المساحة مربعات للوحدة المستخدمة ، على سبيل المثال إذا كان نصف القطر بالسنتيمتر ، فستكون المساحة بالسنتيمتر المربع ، إذا كان نصف القطر بالقدم ، فستكون النتيجة بالأقدام المربعة.

كيف يعمل البرنامج :
يجب أن تُرجع الدالة CircleArea() قيمة ، لذلك يسبقها نوع القيمة التي يجب أن تُرجعها - في هذه الحالة float . يتم أيضًا تمرير قيمة float تسمى radius إلى الدالة كما هو موضح في الدرس السابق .

الكود:
float CircleArea(float radius)

داخل جسم الدالة ، يتم الحساب على نصف القطر ويتم وضع نتيجة الحساب في المتغير result وهو متغير تم إنشاؤه في الدالة .
تقوم الدالة بعد ذلك بإرجاع النتيجة باستخدام الكلمة الأساسية للإرجاع return في أسفل الدالة .

الكود:
return result;

يتم ترجمة الصيغة إلى كود Arduino على النحو التالي:

الكود:
A = π × r × r

Becomes:

result = 3.141592654 * radius * radius;

في جزء البرنامج الذي يستدعي الدالة CircleArea() ، تصبح الدالة بشكل أساسي القيمة التي تُرجعها ويمكن تعيينها لمتغير.
يتم تعيين المتغير area للقيمة التي ترجعها الدالة CircleArea() :

الكود:
 area = CircleArea(9.2);

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

نسخة أقصر من البرنامج :
يمكن كتابة البرنامج أعلاه بطريقة أقصر بدون استخدام بعض المتغيرات المتوسطة كما هو موضح أدناه.

الكود:
void setup() {
    Serial.begin(9600);
    Serial.print("Area of circle is: ");
    // print area to 4 decimal places
    Serial.println(CircleArea(9.2), 4);
}

void loop() {
}

// calculate the area of a circle
float CircleArea(float radius)
{
    return (3.141592654 * radius * radius);
}

 

في هذا البرنامج ، تُرجع الدالة CircleArea() نتيجة الحساب على سطر واحد دون تعيينها أولاً إلى متغير.

الكود:
return (3.141592654 * radius * radius);

لا بأس بهذه الطريقة في إجراء الحساب وإرجاع القيمة ، على الرغم من أنه قد لا يكون من السهل قراءة الكود مثل المثال الأول.
عندما يتم استدعاء الدالة CircleArea() في البرنامج ، يتم تمريرها إلى Serial.println() كما لو كانت متغير. هذا ممكن لأنه عندما تقوم دالة بإرجاع متغير ، فإنها تأخذ قيمة المتغير. وبالتالي فإن البرنامج يعمل بنفس الطريقة مثل البرنامج الأول ، على الرغم من أنه من الأصعب قراءة الكود .

الكود:
Serial.println(CircleArea(9.2), 4);
 
حجم ملف الإخراج الثنائي (الملف الذي يتم تحميله إلى Arduino بعد الترجمة) من مترجم Arduino هو 4,040 bytes لكل من البرنامجين في الإصدار Arduino IDE 1.0.6.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس السابع عشر المصفوفات والاردوينو Arduino Arrays

مُساهمة من طرف Admin الأربعاء أبريل 01, 2020 6:11 pm

دورة برمجة الاردوينو : الدرس السابع عشر
المصفوفات والاردوينو 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 ، وهي أسطر نصية ، هي في الواقع مصفوفات كما سنرى في الدرس التالي .

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس الثامن عشر السلاسل النصية والاردوينو Arduino Strings

مُساهمة من طرف Admin الخميس أبريل 02, 2020 6:23 pm

دورة برمجة الاردوينو : الدرس الثامن عشر
السلاسل النصية والاردوينو 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
تناول هذا الدرس ما هي السلاسل وكيف تبدو في الذاكرة وبعض العمليات التي يمكن القيام بها على السلاسل.
سيتم تغطية الاستخدامات العملية الفعلية للسلاسل في الدرس التالي عندما نتناول كيفية الحصول على إدخال المستخدم من نافذة الشاشة التسلسلية وحفظ الإدخال في سلسلة.

Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الأردوينو Arduino للمبتدئين  Empty الدرس التاسع عشر الحصول على واستخدام الإدخال التسلسلى

مُساهمة من طرف Admin الجمعة أبريل 03, 2020 6:26 pm

دورة برمجة الاردوينو : الدرس التاسع عشر
الحصول على واستخدام الإدخال التسلسلى والاردوينو 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" كما هو موضح في هذه الصورة.

الأردوينو Arduino للمبتدئين  6969c2080984442b8b018cc04ec11a8b

عندما يتم تعيين "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.


Admin
Admin

عدد المساهمات : 1194
تاريخ التسجيل : 28/01/2014

https://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى