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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 13-11-2019, 10:29 AM المشاركة 1   
افتراضي تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects Twitter FaceBook Google+



تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
1- وميض ليد Blinking LED





كود:
// Blinking LED
const int LED = 13; 			// LED connected to digital pin 13

void setup()
{
pinMode(LED, OUTPUT); 	// sets the digital pin as output
}

void loop()
{
digitalWrite(LED, HIGH); 	// turns the LED on
delay(1000); 			// waits for a second
digitalWrite(LED, LOW); 	// turns the LED off
delay(1000);			// waits for a second
}




• السطر :

كود:
// Blinking LED

عبارة عن تعليق comment . التعليق هو وسيلة مفيدة لكتابة الملاحظات الصغيرة. يذكرنا التعليق السابق بعنوان هذا البرنامج ، وهو "وميض ليد" Blinking LED . يبدأ التعليق بالشرطتين المائلتين “//” وينتهى بنهاية السطر . المترجم يهمل ترجمة التعليقات .

• السطر :

كود:
const int LED = 13;		 // LED connected to digital pin 13

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

• السطر:

كود:
void setup()

يخبر هذا السطر الاردوينو أن المجموعة (البلوك) block التالية من الكود ستكون دالة تسمى setup() .

• السطر:

كود:
{

بقوس الفتح هذا ، تبدأ مجموعة (كتلة) الكود .

• السطر :

كود:
pinMode(LED, OUTPUT); 		// sets the digital  pin as output


تخبر الدالة pinMode() اردوينو بكيفية تكوين (تهيئة) configure طرف pin معين. يمكن استخدام الأطراف الرقمية إما كمدخلات أو مخرجات ، لكننا بحاجة إلى إخبار الاردوينو Arduino كيف نعتزم استخدام الطرف . في هذه الحالة ، نحتاج إلى طرف إخراج للتحكم في الليد LED.
pinMode() هي دالة ، والكلمات (أو الأرقام) المحددة داخل الأقواس تسمى الوسائط arguments الخاصة بها. الوسائط هي أي معلومات تحتاجها الدالة من أجل القيام بوظيفتها.
تحتاج الدالة pinMode() إلى وسيطين. يخبر الوسيط الأول الدالة pinMode() عن الطرف الذي نتحدث عنه ، ويخبر الوسيط الثانى الدالة pinMode() عن ما إذا كنا نريد استخدام هذا الطرف كمدخل أو مخرج. تعد "مدخل" INPUT و "مخرج"OUTPUT ثوابت محددة مسبقًا في لغة الاردوينو Arduino.
تذكر أن كلمة LED هي اسم الثابت الذي تم تعيينه على الرقم 13 ، وهو رقم الطرف الذي تم توصيل الليد LED به. لذا ، فإن الوسيط الأول هو LED ، وهواسم الثابت.
الوسيط الثانى هو OUTPUT ، لأنه عندما يتخاطب الاردوينو إلى "منفذ" actuator، فإنه يرسل معلومات خرج out.

• السطر :

كود:
}

يشير قوس الغلق هذا إلى نهاية الدالة setup() .

• الأسطر:

كود:
void loop()
{

الدالة loop() هي المكان الذي تحدد فيه السلوك الرئيسي لجهازك التفاعلي. سيتم تكرارها مرارًا وتكرارًا حتى تقوم بإزالة القدرة الكهربية من اللوحة.

• السطر:

كود:
 digitalWrite(LED, HIGH); 		// turns the LED on

كما يقول التعليق ، الدالة digitalWrite() قادرة على تشغيل on (أو إيقاف off) أي طرف تكوينه (تهيئته) كمخرج. تمامًا كما رأينا باستخدام الدالة pinMode() ، الدالة digitalWrite() تقبل وسيطين ، وكما رأينا مع الدالة pinMode() ، يخبر الوسيط الأول الدالة digitalWrite() عن أي طرف نتحدث عنه ، تمامًا كما رأينا باستخدام الدالة pinMode() ، سنستخدم اسم LED الثابت للإشارة إلى الرقم 13 ، حيث يتم توصيل الليد LED المثبت مسبقًا.
الوسيط الثانى يختلف : في هذه الحالة ، يخبر الوسيط الثانى الدالة digitalWrite() عن ما إذا كنت تريد ضبط (تعيين) مستوى الجهد على 0 V(LOW) أو 5 V (HIGH) .
السحر هنا هو عندما يمكن للبرنامج التحكم في الأجهزة. عندما تكتب digitalWrite(LED, HIGH) ، فإنها تحول طرف الإخراج إلى 5 فولت ، وإذا قمت بتوصيل LED ، فسوف يضيء. لذلك في هذه المرحلة من الكود ، التعليمات في البرنامج تحدث شيئًا ما في العالم المادي عن طريق التحكم في تدفق الكهرباء إلى الأطراف . إن تشغيل وإغلاق الطرف سوف يتيح لنا الآن ترجمة هذه الأشياء إلى شيء أكثر وضوحًا للإنسان ؛ الليد هو المنفذ لدينا.
فى الاردوينو ، HIGH تعنى سيتم تعيين الطرف على 5 فولت ، بينما تعني LOW أن الطرف سيتم ضبطه على 0 فولت.

• السطر :

كود:
delay(1000); // waits for a second

على الرغم من أن Arduino أبطأ بكثير من الكمبيوتر المحمول ، إلا أنه لا يزال سريعًا للغاية. إذا قمنا بتشغيل الليد ثم أطفأناه على الفور ، فلن تتمكن أعيننا من رؤيته. نحتاج إلى الاحتفاظ بتشغيل الليد LED لفترة من الوقت حتى نتمكن من رؤيته ، والطريقة للقيام بذلك هي إخبار Arduino بالانتظار لفترة من الوقت قبل الانتقال إلى الخطوة التالية. دالة التأخير delay() تؤدي بشكل أساسي إلى جعل الميكروكونترولر ينتظر ولا يفعل شيئًا لمقدار المللي ثوانى التي تمرر بها كوسيط . 1000 ميلي ثانية يساوي 1 ثانية. لذلك يبقى الليد LED مضاء لمدة ثانية واحدة .

• السطر:

كود:
 digitalWrite(LED, LOW); // turns the LED off

تقوم هذا التعليمة الآن بإيقاف تشغيل الليد LED الذي قمنا بتشغيله من قبل.

• السطر:

كود:
delay(1000); // waits for a second

هنا ، تأخير لثانية أخرى. سيتم إيقاف تشغيل LED لمدة ثانية واحدة.

• السطر:

كود:
 }

قوس الغلق هذا علامة على نهاية الدالة loop() . عندما يصل Arduino إلى هذا القوس ، يبدأ من جديد من بداية الدالة loop() .

نتيجة هذا البرنامج تكون :
• تحويل (تهيئة) الطرف 13 إلى نظام الخرج (فقط مرة واحدة فى البداية) .
• الدخول إلى حلقة غير منتهية .
• تشغيل ON الليد المتصل بالطرف 13 .
• الانتظار لمدة واحد ثانية .
• فصل OFF الليد المتصل بالطرف 13 .
• الانتظار لمدة واحد ثانية .
• العودة إلى بداية الحلقة الغير منتهية .

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

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


2- وميض 2 ليد (أضواء تنبيه) Blinking Two LED’s using Arduino




كود:
const int LED1 = 12;
const int LED2 = 13;

void setup()
{
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
}

void loop()
{
  digitalWrite(LED1,HIGH);
  delay(1000);
  digitalWrite(LED1,LOW);

  digitalWrite(LED2,HIGH);
  delay(1000);
  digitalWrite(LED2,LOW);
}

• الفرق الوحيد في هذا البرنامج هو استخدام طرفين في وضع الإخراج OUTPUT . لقد استخدمنا الطرفين 12 و 13 كإخراج. يتم تهيئتهما كمخارج داخل الدالة setup() (تنفذ لمرة واحدة) .
• داخل الدالة loop() (حلقة تكرارغير منتهية) ، تم كتابة أوامر وميض الليدات على التتابع . عند تشغيل LED1 ، سيتم إيقاف تشغيل LED2. بعد 1 ثانية سوف يتم إيقاف تشغيل LED1 وفي نفس الوقت سيتم تشغيل LED2. انتظر ثانية واحدة أخرى وسترى LED2 قيد إيقاف التشغيل و LED1 قيد التشغيل. هذه الدورة تتكرر.

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

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


3- ربط RGB LED مفرد مع الاردوينو أونو Single RGB LED interfacing with Arduino Uno
في هذا المشروع ، سوف يتم "ربط" interface ليد ثلاثى RGB (أحمر – أخضر – أزرق) مع Arduino Uno. يظهر نموذج RGB LED في الشكل أدناه::



الليد RGB له أربعة أطراف كما هو موضح في الشكل.
• PIN1 الطرف السالب للون الأول فى نوع الأنود المشترك ، أو الطرف الموجب للون الأول فى نوع الكاثود المشترك.
• PIN2 الموجب المشترك للثلاثة ألوان فى نوع الأنود المشترك ، أو السالب المشترك للألوان الثلاثة فى نوع الكاثود المشترك.
• PIN3 الطرف السالب للون الثانى أو الطرف الموجب للون الثانى.
• PIN4 الطرف السالب للون الثالث أو الطرف الموجب للون الثالث.










فى هذا المشروع سوف نستخدم نوع "الأنود المشترك" CA (Common Anode or Common Positive) .

الدائرة الكهربية وشرح العمل :




هنا تم توصيل طرف الأنود المشترك لليد RGB بمصدر الجهد +5V من Arduino مع مقاومة 330R .
الآن يتم توصيل الأطراف السالبة (1, 3, 4) من RGB LED بـالأطراف 2 و 3 و 4 من الاردوينو . هنا RGB LED متصل بمنطق "عكسي" أى إذا جعلنا الطرف الأرضي (الكاثود) من LED مرتفعا high ، فسوف ينطفئ. نحن هنا نصنع طرف أرضى من RGB LED عالى high للحفاظ على LED في حالة فصل OFF . وإذا جعلنا الطرف الأرضى من RGB LED منخفض low فإنه سوف يتوهج.
كما رأينا بالفعل في الشكل أعلاه من RGB LED ، فإن الطرف 2 هو الأنود المشترك ، والأطراف 1 و 3 و 4 هي الأطراف الأرضية (الكاثودات) للألوان الأحمر والأزرق والأخضر على التوالي.

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

البرنامج :


كود:
void setup() 
{
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
  }

void loop() 
{
  digitalWrite(2, LOW);   //RED ON  
  delay(500);                         
  
  digitalWrite(2, HIGH);  //RED OFF    
  delay(500);                       
  
  digitalWrite(3, LOW);  //BLUE ON   
  delay(500);   
                     
  digitalWrite(3, HIGH); // BLUE OFF  
  delay(500);
  
  digitalWrite(4, LOW);  //GREEN ON   
  delay(500);                         
  
  digitalWrite(4, HIGH);  //GREEN OFF     
  delay(500);  
}

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

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


4- أضواء متسارعة فى الاتجاهين Arduino Knight Rider
الدائرة الكهربية :




البرنامج الأول باستخدام التعليمات السابقة :


كود:
// Arduino Knight Rider with 8 LED
	
const int ledPin1 = 13; 
const int ledPin2 = 12;
const int ledPin3 = 11;
const int ledPin4 = 10;
const int ledPin5 = 9;
const int ledPin6 = 8;
const int ledPin7 = 7;
const int ledPin8 = 6;
 
const int delayTime = 50; 
	
void setup () 
	
{
pinMode(ledPin1, OUTPUT); 
pinMode(ledPin2, OUTPUT); 
pinMode(ledPin3, OUTPUT); 
pinMode(ledPin4, OUTPUT); 
pinMode(ledPin5, OUTPUT); 
pinMode(ledPin6, OUTPUT); 
pinMode(ledPin7, OUTPUT); 
pinMode(ledPin8, OUTPUT);
} 
	
void loop() 
{ 
digitalWrite(ledPin1,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin1,LOW); // LED OFF
	
digitalWrite(ledPin2,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin2,LOW); // LED OFF
	
digitalWrite(ledPin3,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin3,LOW); // LED OFF
	
digitalWrite(ledPin4,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin4,LOW); // LED OFF

digitalWrite(ledPin5,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin5,LOW); // LED OFF
	
digitalWrite(ledPin6,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin6,LOW); // LED OFF
	
digitalWrite(ledPin7,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin7,LOW); // LED OFF
	
digitalWrite(ledPin8,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin8,LOW); // LED OFF
	
//turn

digitalWrite(ledPin8,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin8,LOW); // LED OFF

digitalWrite(ledPin7,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin7,LOW); // LED OFF
	
digitalWrite(ledPin6,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin6,LOW); // LED OFF
	
digitalWrite(ledPin5,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin5,LOW); // LED OFF
	
digitalWrite(ledPin4,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin4,LOW); // LED OFF

digitalWrite(ledPin3,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin3,LOW); // LED OFF
	
digitalWrite(ledPin2,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin2,LOW); // LED OFF
	
digitalWrite(ledPin1,HIGH); // LED ON
delay(delayTime); 
digitalWrite(ledPin1,LOW); // LED OFF
	
	}


البرنامج الثانى باستعمال التعليمات السابقة وحلقة for والمصفوفات array :

كود:
// Arduino Knight Rider with 8 LED
const int ledPin1 = 13; 
const int ledPin2 = 12;
const int ledPin3 = 11; 
const int ledPin4 = 10;
const int ledPin5 = 9; 
const int ledPin6 = 8; 
const int ledPin7 = 7; 
const int ledPin8 = 6; 

const int delayTime = 50;
 
const int pinArray[] = {6, 7, 8, 9, 10, 11, 12, 13};

int count = 0;

void setup () 
{ 
pinMode(ledPin1, OUTPUT); 
pinMode(ledPin2, OUTPUT); 
pinMode(ledPin3, OUTPUT); 
pinMode(ledPin4, OUTPUT); 
pinMode(ledPin5, OUTPUT); 
pinMode(ledPin6, OUTPUT); 
pinMode(ledPin7, OUTPUT); 
pinMode(ledPin8, OUTPUT); 
}
 
void loop() 
{ 
for (count=0;count<8;count++) 
	{
	digitalWrite(pinArray[count], HIGH);
	delay(delayTime);
	digitalWrite(pinArray[count], LOW);
	delay(delayTime);
	}
	
for (count=7;count>=0;count--) 
	{
	digitalWrite(pinArray[count], HIGH);
	delay(delayTime);
	digitalWrite(pinArray[count], LOW);
	delay(delayTime);
	}
}



برنامج أخر لعدد 10 ليد


كود:
int pinsCount=10;                        // declaring the integer variable pinsCount
int pins[] = {2,3,4,5,6,7,8,9,10,11};          // declaring the array pins[]
 
void setup() {                
  for (int i=0; i<pinsCount; i=i+1){    // counting the variable i from 0 to 9
    pinMode(pins[i], OUTPUT); // initialising the pin at index i of the array of pins as OUTPUT
  }
}
 
void loop() {
  for (int i=0; i<pinsCount; i=i+1){    // chasing right
    digitalWrite(pins[i], HIGH);         // switching the LED at index i on
    delay(100);                          // stopping the program for 100 milliseconds
    digitalWrite(pins[i], LOW);          // switching the LED at index i off
  }

  for (int i=pinsCount-1; i>0; i=i-1){   // chasing left (except the outer leds)
    digitalWrite(pins[i], HIGH);         // switching the LED at index i on
    delay(100);                          // stopping the program for 100 milliseconds
    digitalWrite(pins[i], LOW);          // switching the LED at index i off
  }
}


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


5- أضواء متحركة بنماذج متعددة (أضواء ديكور- عيد الميلاد - الكريسماس) :



كود:
void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop(){
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
 ////////////////////////////////////////
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
 ////////////////////////////////////////////
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
 //////////////////////////////////////
  digitalWrite(2,LOW);
  delay(100);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(4,LOW);
  delay(100);
  digitalWrite(5,LOW);
  delay(100);
  digitalWrite(6,LOW);
  delay(100);
  digitalWrite(7,LOW);
  delay(100);
  digitalWrite(8,LOW);
  delay(100);
  digitalWrite(9,LOW);
  delay(100);
  digitalWrite(10,LOW);
  delay(100);
  digitalWrite(11,LOW);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
  digitalWrite(13,LOW);
  delay(100);
 //////////////////////////////////
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(2,HIGH);
  delay(100);
  digitalWrite(12,HIGH);
  delay(100);
  digitalWrite(3,HIGH);
  delay(100);
  digitalWrite(11,HIGH);
  delay(100);
  digitalWrite(4,HIGH);
  delay(100);
  digitalWrite(10,HIGH);
  delay(100);
  digitalWrite(5,HIGH);
  delay(100);
  digitalWrite(9,HIGH);
  delay(100);
  digitalWrite(6,HIGH);
  delay(100);
  digitalWrite(8,HIGH);
  delay(100);
  digitalWrite(7,HIGH);
  delay(100);
 //////////////////////////////
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
 /////////////////////////////////////////
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
 /////////////////////////////////////////
  digitalWrite(13,LOW);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
  digitalWrite(11,LOW);
  delay(100);
  digitalWrite(10,LOW);
  delay(100);
  digitalWrite(9,LOW);
  delay(100);
  digitalWrite(8,LOW);
  delay(100);
  digitalWrite(7,LOW);
  delay(100);
  digitalWrite(6,LOW);
  delay(100);
  digitalWrite(5,LOW);
  delay(100);
  digitalWrite(4,LOW);
  delay(100);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(2,LOW);
  delay(100);
 //////////////////////////////////////////
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
 /////////////////////////////////////
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
 ////////////////////////////////////////
  digitalWrite(13,LOW);
  delay(100);
  digitalWrite(2,LOW);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(11,LOW);
  delay(100);
  digitalWrite(4,LOW);
  delay(100);
  digitalWrite(10,LOW);
  delay(100);
  digitalWrite(5,LOW);
  delay(100);
  digitalWrite(9,LOW);
  delay(100);
  digitalWrite(6,LOW);
  delay(100);
  digitalWrite(8,LOW);
  delay(100);
  digitalWrite(7,LOW);
  delay(100);
 ////////////////////////////////////
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
 ///////////////////////////////
  digitalWrite(11,LOW);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
  digitalWrite(13,LOW);
  delay(100);
 ////////////////////////////////////////
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
 ///////////////////////////////////
  digitalWrite(8,LOW);
  delay(100);
  digitalWrite(9,LOW);
  delay(100);
  digitalWrite(10,LOW);
  delay(100);
 //////////////////////////////////////
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
 /////////////////////////////////
  digitalWrite(5,LOW);
  delay(100);
  digitalWrite(6,LOW);
  delay(100);
  digitalWrite(7,LOW);
  delay(100);
 ////////////////////////////////////////
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
 /////////////////////////////////////////////
  digitalWrite(2,LOW);
  delay(100);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(4,LOW);
  delay(100);
 /////////////////////////////////////////
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
 /////////////////////////////////////
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
 ///////////////////////////////////////
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(4, LOW);
  delay(100);
  digitalWrite(4, HIGH);
  delay(100);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(100);
  digitalWrite(6, LOW);
  delay(100);
  digitalWrite(6, HIGH);
  delay(100);
  digitalWrite(7, LOW);
  delay(100);
  digitalWrite(7, HIGH);
  delay(100);
  digitalWrite(8, LOW);
  delay(100);
  digitalWrite(8, HIGH);
  delay(100);
  digitalWrite(9, LOW);
  delay(100);
  digitalWrite(9, HIGH);
  delay(100);
  digitalWrite(10, LOW);
  delay(100);
  digitalWrite(10, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
  digitalWrite(13, HIGH);
  delay(100);
 ////////////////////////////////////
  digitalWrite(13,LOW);
  delay(100);
  digitalWrite(12,LOW);
  delay(100);
  digitalWrite(11,LOW);
  delay(100);
  digitalWrite(10,LOW);
  delay(100);
  digitalWrite(9,LOW);
  delay(100);
  digitalWrite(8,LOW);
  delay(100);
  digitalWrite(7,LOW);
  delay(100);
  digitalWrite(6,LOW);
  delay(100);
  digitalWrite(5,LOW);
  delay(100);
  digitalWrite(4,LOW);
  delay(100);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(2,LOW);
  delay(100);
}


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


مرجعية لغة الأردوينو :

• يمكن تقسيم برامج الاردوينو Arduino إلى ثلاثة أجزاء رئيسية : البنية structure والقيم values (المتغيرات والثوابت) والدوال functions . تعتمد لغة Arduino على لغة C/C++ .

• يتم تشغيل برنامج Arduino في جزأين (دالتين) :

كود:
void setup()
void loop()

• الدالة setup() هى الإعداد preparation ، والدالة loop() هي التنفيذ execution . في قسم الإعداد setup ، دائمًا في الجزء العلوي من البرنامج ، يمكنك تعيين "أوضاع الأطراف" pinModes ، وتهيئة الاتصال التسلسلي ، إلخ. قسم "الحلقة" loop هو الكود الذي سيتم تنفيذه - قراءة المدخلات ، وإطلاق المخرجات ، إلخ.

قسم الإعداد ، الدالة setup() :
يتم إستدعاء الدالة setup() عندما يبدأ البرنامج . يتم استخدامها لبداية تهيئة initialize المتغيرات variables ،وأوضاع الأطراف pin modes ، وبداية استخدام المكتبات libraries ، ألخ .
دالة الإعداد setup() سوف يتم تشغيلها لمرة واحدة فقط ، بعد كل توصيل قدرة كهربية أو إعادة تشغيل reset للوحة الاردوينو .

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

كود:
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}


الدالة

كود:
 pinMode(pin, mode)

الوصف :
تقوم بتهيئة Configures الطرف المحدد ليتصرف إما كمدخل أو مخرج .

البارامترات :
"الطرف" pin : رقم الطرف المراد ضبط وضعه (نوع int ) .
"الوضع" mode : إما دخل INPUT أو خرج OUTPUT .

العائد :
لاشىء .

ملاحظة :
أطراف الدخل التناظرى يمكن أن تستخدم كأطراف رقمية ، ويشار إليها بالأرقام 14 (للدخل التناظرى 0 ) إلى 19 ( للدخل التناظرى 5 ) .

الدالة


كود:
digitalWrite(pin, value)

الوصف :
ضبط طرف تم إعداده (تكوينه) على أنه OUTPUT إما إلى الحالة HIGH أو LOW عند الطرف المحدد.
تُستخدم الدالة digitalWrite() أيضًا لتعيين مقاومات السحب لأعلى pullup عند تكوين طرف كدخل INPUT.

البارامترات :
"الطرف" pin : رقم الطرف
"القيمة" value : HIGH أو LOW .

العائد :
لا شىء .

ملاحظة :
أطراف الدخل التناظرى يمكن أن تستخدم كأطراف رقمية ، ويشار إليها بالأرقام 14 (للدخل التناظرى 0 ) إلى 19 ( للدخل التناظرى 5 ) .



الدالة


كود:
 delay(ms)

الوصف :
توقف Pauses برنامجك مؤقتًا لمقدار من الوقت (بالمللي ثانية) المحدد كبارامتر .

البارامترات :
"ملى ثانية" unsigned long ms : عدد الملى ثوانى المطلوب توقفها (تأخيرها) .

العائد :
لا شىء .

تحذير:
بارامتر التأخير من النوع unsigned long . عند استخدام عدد صحيح ثابت أكبر من حوالي 32767 كبارامتر للتأخير ، قم بإلحاق لاحقة "UL" فى النهاية. على سبيل المثال :

كود:
delay(60000UL);

وبالمثل ، فإن تحويل المتغيرات إلى unsigned longs سيضمن أن المترجم يعالجها بشكل صحيح. على سبيل المثال :

كود:
 delay((unsigned long)tdelay * 100UL);


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


6- استخدام المفتاح الضاغط (دخل) للتحكم فى ليد (خرج) Using a Pushbutton to Control the LED

طرق توصيل المفتاح الضاغط إلى الأردوينو :
• توصيل الزر الضاغط مع مقاومة سحل لأعلى PULL UP Resistor .
• توصيل الزر الضاغط مع مقاومة سحل لأسفل PULL DOWN Resistor .





وميض الليد كان أمرًا سهلاً ، لكنك تحتاج إلى معرفة كيفية التحكم فيه. فيما سبق ، كان الليد هو المنفذ actuator ، وكان Arduino يتحكم فيه. ما يفتقد لإكمال الصورة هو جهاز استشعار (حساس) sensor .
في هذه الحالة ، سنستخدم أبسط أشكال أجهزة الاستشعار المتاحة : مفتاح زر ضغط pushbutton ، وهو جهاز بسيط للغاية : قطعتان من المعدن مفصولتان بياى spring ، وغطاء بلاستيك ، عند الضغط عليه تصبح قطعتي المعدن فى حالة تلامس . عندما تكون أجزاء المعدن منفصلة ، لا يوجد مرور للتيار الكهربى في زر الضغط ؛ وعند الضغط عليه ، يمكن إجراء اتصال ومرور التيار الكهربى .
جميع المفاتيح هي في الأساس مجرد: قطعتين (أو أكثر) من المعدن يمكن تلامسهما مع بعض ، مما يسمح بتدفق الكهرباء من واحد إلى الآخر ، أو فصلهما ، مما يمنع تدفق الكهرباء.

لمراقبة حالة المفتاح ، هناك تعليمة جديدة فى لغة Arduino ستتعلمها : وهى الدالة digitalRead() .
الدالة digitalRead() تتحقق لمعرفة ما إذا كان هناك أي جهد مطبق على الطرف الذي تحدده بين الأقواس ، وتعيد القيمة HIGH أو LOW ، اعتمادًا على النتائج التي تتوصل إليها. التعليمات (الدوال) الأخرى التي استخدمتها حتى الآن لم تُرجع أي معلومات – فهى تنفذ فقط ما طلبنا منهم القيام به. لكن هذا النوع من الدوال محدود بعض الشيء ، لأنه سيجبرك على الالتزام بسلسلة من التعليمات المتوقعة ، دون أي دخل من العالم الخارجي. باستخدام الدالة digitalRead() ، يمكنك "طرح سؤال" من Arduino وتلقي إجابة يمكن تخزينها في الذاكرة في مكان ما واستخدامها في اتخاذ القرارات على الفور أو لاحقًا.


مثال1 : تشغيل (إضاءة) ليد أثناء الضغط على الزر الضاغط .

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




البرنامج :


كود:
// Turn on LED while the button is pressed
const int LED = 13; // the pin for the LED
const int BUTTON = 7; // the input pin where the  pushbutton is connected
int val = 0; // val will be used to store the state of the input pin

void setup() 
{
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
}

void loop()
{
val = digitalRead(BUTTON); // read input value and store it
// check whether the input is HIGH (button pressed)
if (val == HIGH) 
{
digitalWrite(LED, HIGH); // turn LED ON
} 
else 
{
digitalWrite(LED, LOW);
}
}

كيفية العمل :
لقد أدخلنا مفهومين جديدين مع هذا البرنامج : الدوال التي تُرجع نتيجة عملها ، وعبارة if.
إن عبارة if هي أهم تعليمة في لغة البرمجة ، لأنها تتيح لجهاز الكمبيوتر (وتذكر أن Arduino عبارة عن كمبيوتر صغير) لاتخاذ القرارات.
بعد الكلمة المفتاحية if ، يجب عليك كتابة "سؤال شرط" داخل الأقواس ، وإذا كانت "الإجابة" ، أو النتيجة ، صحيحة true ، سيتم تنفيذ أول كتلة من التعليمات البرمجية ؛ خلاف ذلك ، سيتم تنفيذ كتلة التعليمات البرمجية بعد else .
لاحظ أن الرمز == مختلف تمامًا عن الرمز =. يتم استخدام الأول عند "مقارنة" كيانين وإرجاع true أو false ؛ و"يعين" الأخير قيمة إلى ثابت أو متغير. تأكد من استخدام الرمز الصحيح ، لأنه من السهل جدًا ارتكاب هذا الخطأ واستخدام = فقط ، وفي هذه الحالة لن يعمل البرنامج أبدًا.
من المهم أن ندرك أن المفتاح غير متصل مباشرة بالليد . يقوم برنامج Arduino بفحص المفتاح ، ثم يتخذ قرارًا بشأن تشغيل أو إيقاف تشغيل الليد . إن الاتصال بين المفتاح والليد يحدث بالفعل في البرنامج .
الضغط بأصابعك على الزر طالما احتجت إلى إضاءة ليس أمرًا عمليًا.

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

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


الدائرة واحدة والسلوكيات متعددة :
أصبحت الميزة الكبيرة للإلكترونيات الرقمية القابلة للبرمجة على الإلكترونيات الكلاسيكية الآن واضحة : سأوضح لك كيفية تنفيذ العديد من "السلوكيات" المختلفة باستخدام نفس الدائرة الإلكترونية في القسم السابق ، فقط عن طريق تغيير البرنامج.
كما ذكرت من قبل ، ليس من العملي أبدا أن تضغط بإصبعك على الزر لإضاءة الضوء. لذلك يجب عليك تطبيق بعض أشكال "الذاكرة" ، في شكل آلية برمجية تتذكر عندما تضغط على الزر وستبقي الضوء حتى بعد تحريره .
للقيام بذلك ، ستستخدم ما يسمى المتغير variable . (لقد استخدمت واحد بالفعل ، لكننا لم نوضحه.) المتغير هو مكان في ذاكرة Arduino حيث يمكنك تخزين البيانات. فكر في الأمر كواحدة من تلك الملاحظات اللاصقة التي تستخدمها لتذكير نفسك بشيء ما ، مثل رقم الهاتف : فأنت تأخذ واحدة وتكتب "Luisa 02 555 1212" عليه وتلصق به على شاشة الكمبيوتر أو الثلاجة. في لغة Arduino ، الأمر بسيط بنفس القدر: عليك فقط تحديد نوع البيانات التي تريد تخزينها (رقم أو بعض النصوص ، على سبيل المثال) ، وإعطاء اسم لها ، وعندما تريد ، يمكنك تخزين البيانات أو استردادها . فمثلا:


كود:
int val = 0;

int تعني أن المتغير الخاص بك سيخزن عددا صحيحًا integer ، val هي اسم المتغير ، و = 0 تعيّنه بقيمة أولية بقيمة صفر.
يمكن تعديل المتغير ، كما يشير الاسم ، في أي مكان في التعليمات البرمجية الخاصة بك ، بحيث يمكنك في وقت لاحق في البرنامج الخاص بك ، وكتابة العبارة :

كود:
val = 112;

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

في البرنامج التالي ، يخزن المتغير val نتيجة الدالة digitalRead(); كل ما يحصل عليه اردوينو من المدخلات ينتهي في المتغير وسيبقى هناك حتى سطر آخر من التعليمات البرمجية تعمل على تغييره. لاحظ أن المتغيرات تستخدم نوعًا من الذاكرة يسمى RAM (ذاكرة الوصول العشوائى) . إنها سريعة جدًا ، ولكن عند إيقاف تشغيل اللوحة ، يتم فقد جميع البيانات المخزنة في ذاكرة الوصول العشوائي (مما يعني أن كل متغير يتم إعادة تعيينه إلى قيمته الأولية عندما يتم تشغيل اللوحة مرة أخرى). يتم تخزين البرامج الخاصة بك في ذاكرة فلاش - وهى نفس النوع الذي يستخدمه هاتفك المحمول لتخزين أرقام الهواتف – والتى يحتفظ بمحتواها حتى عند إيقاف تشغيل اللوحة.
وسوف نستخدم متغيرًا آخر لتذكر ما إذا كان يجب أن يظل الليد قيد التشغيل أو إيقاف التشغيل بعد أن نحرر الزر .


مثال2 : إضاءة ليد عند الضغط على زر ويظل مضاء بعد تحرير الضغط ، وعند الضغط عليه مرة أخرى ينطفىء ، أى يعمل كمفتاح تبديل ON OFF Toggle Switch.



كود:
const int LED = 13; // the pin for the LED
const int BUTTON = 7; // the input pin where the pushbutton is connected
int val = 0; // val will be used to store the state of the input pin
int state = 0; // 0 = LED off while 1 = LED on

void setup() 
{
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
}

void loop() 
{
val = digitalRead(BUTTON); // read input value and store it
// check if the input is HIGH (button pressed)
// and change the state
if (val == HIGH) 
{
state = 1 - state;
}
if (state == 1) 
{
digitalWrite(LED, HIGH); // turn LED ON
} 
else 
{
digitalWrite(LED, LOW);
}
}


اختبر هذا البرنامج . ستلاحظ أنه يعمل ... إلى حد ما.
ستجد أن الضوء يتغير بسرعة بحيث لا يمكنك ضبط تشغيله أو إيقاف تشغيله بشكل موثوق بضغطة زر.
دعونا نلقي نظرة على الأجزاء المهمة من الكود : state عبارة عن متغير يقوم بتخزين 0 أو 1 لتذكر ما إذا كان الليد قيد التشغيل أم لا. بعد تحرير الزر ، نقوم بتهيئته إلى 0 (إيقاف LED).
لاحقا ، نقرأ الحالة الحالية للزر ، وإذا تم الضغط عليه (val == HIGH) ، فإننا نغير state من 0 إلى 1 ، أو العكس. نقوم بذلك باستخدام خدعة صغيرة ، حيث يمكن أن تكون state إما 1 أو 0. تتضمن الخدعة التي أستخدمها تعبيرًا رياضيًا صغيرًا استنادًا إلى فكرة أن 1 – 0 هي 1 وأن 1 - 1 هي 0:

كود:
state = 1 - state;

هذا السطر قد لا يكون له معنى كبير في الرياضيات ، لكنه كذلك في البرمجة. الرمز = يعني "تعيين نتيجة ما هو بعدي إلى اسم المتغير قبلي" - في هذه الحالة ، يتم تعيين قيمة state الجديدة بقيمة 1 ناقص قيمة state القديمة .
لاحقا فى البرنامج ، يمكنك أن ترى أننا نستخدم state لمعرفة ما إذا كان يجب أن يكون الليد قيد التشغيل أم لا. كما ذكرت ، هذا يؤدي إلى نتائج متقلبة إلى حد ما.
النتائج المتقلبة بسبب الطريقة التي نقرأ بها الزر.
الاردوينو سريع حقا. فهو ينفذ التعليمات الداخلية الخاصة به بمعدل 16 مليون في الثانية - يمكن أن ينفذ بضعة ملايين سطر من الكود في الثانية. وهذا يعني أنه بينما يضغط إصبعك على الزر ، قد يقرأ Arduino موضع الزر عدة آلاف من المرات ويغير الحالة وفقًا لذلك. وبالتالي فإن النتائج لا يمكن التنبؤ بها ؛ قد تكون إيقاف عند الرغبة في التشغيل ، أو العكس. قد يظهر البرنامج السلوك الصحيح كل فترة ، لكن في أغلب الأحيان سيكون خطأ.
كيف تصلح هذا؟ حسنًا ، تحتاج إلى اكتشاف اللحظة الدقيقة (المضبوطة)عند الضغط على الزر - تلك هي اللحظة الوحيدة التي يجب عليك فيها تغيير الحالة. الطريقة التي نحب القيام بها هي تخزين قيمة val قبل أن نقرأ واحدة جديدة ؛ يسمح لك هذا بمقارنة الموضع الحالي للزر مع الموضع السابق وتغيير state فقط عندما يتغير الزر من LOW إلى HIGH .


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

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

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

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


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

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