أساسیات برمجة Arduino | الجزء الثاني

برمجة Arduino

أساسیات برمجة Arduino | الجزء الأول

()Arduino Serial.print

يقوم ()serial.print  في Arduino بطباعة البيانات إلى المنفذ التسلسلي. يتم تخزين البيانات المطبوعة بتنسيق ASCII  (الكود القياسي الأمريكي لتبادل المعلومات) وهو نص يمكن قراءته بواسطة الإنسان.

تتم طباعة كل رقم في أي رقم باستخدام أحرف ASCII.

ستكون البيانات المطبوعة مرئية في الشاشة التسلسلية الموجودة في الزاوية اليمنى من شريط الأدوات.

يتم التصريح عن ()Serial.print بتنسيقين موضحين أدناه:

print( value )
print( value, format)
أساسیات برمجة Arduino | الجزء الثاني

serial: يشير إلى كائن المنفذ التسلسلي.

Print: تُرجع ()print العدد المحدد من البايتات المكتوبة.

value: تشير إلى القيمة المطلوب طباعتها والتي تتضمن أي قيمة لنوع البيانات.

format: يتكون من قاعدة رقم مثل OCT (Octal) ، BIN  (ثنائي) ، HEX (سداسي عشري) ، إلخ لأنواع البيانات المتكاملة. كما أنه يحدد عدد المنازل العشرية.

Serial.print( value )

يقبل ()serial.print  الرقم باستخدام حرف ASCII لكل رقم والقيمة تصل إلى منزلتين عشريتين لأرقام الفاصلة العائمة.

مثال 1:

Serial.print(15.452732) 

يرسل بايت إلى الطابعة كحرف واحد. في Arduino يتم إرسال السلاسل والأحرف التي تستخدم ()Serial.print كما هي.

المثال 2:

Serial.print("Hello Arduino")

انتاج:

Hello Arduino

Serial.print( value, format )

يحدد التنسيق الأساسي ويعطي الإخراج وفقًا للتنسيق المحدد. يتضمن التنسيقات Octal -OCT  (الأساس 8) و Binary-BIN  (الأساس 2) و Decimal-DEC  (الأساس 10) و Hexadecimal-HEX  (الأساس 16).

دعونا نفهم من خلال بعض الأمثلة.

مثال 1:

Serial.print(25, BIN)  

انتاج:

11001

تقوم بتحويل الرقم العشري 25 إلى رقم ثنائي 11001.

المثال 2:

Serial.print(58, HEX)  

انتاج:

3A

يقوم بتحويل الرقم العشري 58 إلى رقم سداسي عشري 3A.

المثال 3:

Serial.print(58, OCT)  

انتاج:

72

تقوم بتحويل الرقم العشري 58 إلى رقم ثماني 72.

سلاسل تستند إلى ذاكرة فلاش (Flash Memory based strings):

إذا أردنا تمرير ذاكرة الفلاش في ()Serial.print  استنادًا إلى السلسلة فنحن بحاجة إلى التفاف عبارة الدالة بـ F.

علي سبيل المثال:

Serial.print (F ("Hello Arduino"))

طباعة مسافة (Tab space)  Tab:

يمكننا أيضًا طباعة علامة التبويب في الإخراج. دعنا نفكر في الكود أدناه:

void setup ( )  
{   
Serial.begin ( 4800);  
}  
void loop ( )  
{  
Serial.print(" Hello Arduino" );  
Serial.print(" \ t '');  
}  

هنا يتم استخدام Serial.print (“\t”) لطباعة علامة التبويب في برنامج الإخراج.

()Serial.println

()Serial.println يعني سطر طباعة والذي يرسل السلسلة متبوعة بحرف الإرجاع (ASCII 13) وسطر جديد (‘ n \  ‘ أو ASCII 10) . له تأثير مشابه للضغط على مفتاح Enter أو Return على لوحة المفاتيح عند الكتابة باستخدام محرر النصوص.

يتم أيضًا الإعلان عن ()Serial.println  بتنسيقين موضحين أدناه:

println( value )
println( value, format) 

ما الفرق بين ()Serial.print  و ()Serial.println؟

يتحرك النص المكتوب داخل الأقواس المفتوحة والمغلقة في ()Serial.println  في سطر جديد. بمساعدة ()Serial.print  و ()Serial.println  يمكننا تحديد ترتيب وتنفيذ بعض الأشياء في التعليمات البرمجية الخاصة بنا.

دعنا نفهم بمثال:

النظر في الكود أدناه.

void setup ( )  
{   
Serial.begin ( 4800);  
}  
void loop ( )  
{  
Serial.print(" Hello");  
delay(1000);     
Serial.println("Arduino");  // It will print Arduino followed by a new line.  
delay ( 1500);  // delay of 1.5 seconds between each printed line.  
}  

انقر فوق الزر Upload  -> Serial monitor  للإخراج.

في الإخراج ستظهر كلمة Hello متبوعة بكلمة Arduino بعد ثانية واحدة. بعد 1.5 ثانية سيتم طباعة سطر آخر.

انتاج:

Hello Arduino  
Hello Arduino // The next line will be printed after the specified duration.  
.  
.  
.  
.  
The output will be printed repeatedly.  

اردوينو ميجا:

تحتوي لوحة Arduino Mega  (نوع من لوحة Arduino) على أربعة منافذ تسلسلية. أثناء برمجة Mega نحتاج إلى الإعلان عن جميع المنافذ التسلسلية الأربعة. يجب أن تكون معدلات البث بالباود لجميع المنافذ التسلسلية الأربعة مختلفة.

يظهر أدناه:

void setup() {  
  Serial.begin(4800);  
  Serial1.begin(28800);  
  Serial2.begin(38400);  
  Serial3.begin(9600);  
  
  Serial.println("Serial port");  
  Serial1.println("Serial port 1");  
  Serial2.println("Serial port 2");  
  Serial3.println("Serial port 3");  
}  
void loop()   
{  
}  

دالة ()Serial.available في Arduino

تحصل دالة ()Serial.available  في Arduino على وحدات البايت المخزنة من المنفذ التسلسلي المتاح للقراءة. إنها البيانات التي تم تخزينها بالفعل ووصولها إلى المخزن المؤقت التسلسلي. يحتوي المخزن المؤقت التسلسلي في Arduino على 64 بايت.

ترث الدالة ()Serial.available  من فئة الأداة المساعدة التي تسمى الدفق. يتم استدعاء الدفق فقط عندما يتم استدعاء الوظيفة التي تعتمد عليها. تعتبر فئة التدفق هي الفئة الأساسية للتدفقات الثنائية والقائمة على الأحرف.

أساسیات برمجة Arduino | الجزء الثاني

دعونا نفهم بمثال.

النظر في الكود أدناه.

int arrivingdatabyte = 0; // initializing the incoming serial byte  
void setup( )  
{  
Serial.begin(9600); // 9600 is the data rate in bps (bits per second).  
}  
void loop( ) // loop function that executes repeatedly  
{  
if(Serial.available( ) > 0) //  It will only send data when the received data is greater than 0.  
{  
arrivingdatabyte = Serial.read( );  // It will read the incoming or arriving data byte  
Serial.print("data byte received:");  
Serial.println(arrivingdatabyte, DEC); // here, DEC means Decimal  
}  
}  

في حالة Arduino Mega المنافذ المتاحة هي:

Serial1.available ()

Serial2.available ()

Serial3.available ()

دعونا نفهم مفهوم ميجا بمثال.

في هذا المثال ستتم قراءة البيانات وإرسالها من منفذ إلى آخر.

سيقرأ البيانات من المنفذ 0 ثم يرسل البيانات إلى المنفذ 1.

النظر في الكود أدناه.

void setup( )  
{  
Serial.begin(4800);  
Serial1.begin(4800);  
}  
// two if conditions will be used.  
//In first, if the data is available in the port 0, it will send to the port 1. In second, if the data is available in the port 1, it will send to the port 0.  
void loop( )  
{  
// Now,the data will be read from port 0 and will be sent to the port 1.  
if( Serial.available( ) )  
{  
int incomingdatabyte = Serial.read( );  
Serial1.print('incomingdatabyte, byte');  
}  
// Now,the data will be read from port 1 and will be sent to the port 0.  
if( Serial1.available( ) )  
{  
int incomingdatabyte = Serial1.read( );  
Serial.print('incomingdatabyte, byte');  
}  
}  

يمكننا أيضًا التحقق من الأخطاء في التعليمات البرمجية الخاصة بنا عن طريق التجميع. لذلك انقر فوق الزر Verify.

ستبدو شاشة Arduino مثل الصورة أدناه:

سيشير Done Compiling إلى التحويل البرمجي الناجح للشفرة.

()Arduino Serial.read

يقرأ ()Serial.read في Arduino البيانات التسلسلية الواردة في Arduino. يتم استخدام نوع البيانات int هنا. تقوم بإرجاع بايت البيانات الأول للبيانات التسلسلية القادمة. تقوم أيضًا بإرجاع -1 في حالة عدم توفر بيانات على المنفذ التسلسلي.

الصيغة المستخدمة في برمجة Arduino هي ()Serial.read.

أين، serial: يشير إلى كائن المنفذ التسلسلي.

أساسیات برمجة Arduino | الجزء الثاني

يتم تخزين البيانات في شكل بايت ، حيث 1 بايت = 8 بت.

دعونا نفهم بمثال.

النظر في الكود أدناه.

int arrivingdatabyte;  
void setup( )  
{  
Serial.begin(9600);  
}  
void loop( )  
{  
if(Serial.available( ) > 0)  
{  
arrivingdatabyte = Serial.read( );  // It will read the incoming or arriving data byte  
Serial.print("data byte received:");  
Serial.println(arrivingdatabyte);  
}  
}  

يوضح الكود أعلاه بوضوح أن ()Serial.available  يُستخدم للحصول على عدد البايت المتاح إذا كان أكبر من 0. ستقرأ الدالة ()Serial.read  البيانات من بايت البيانات وتطبع رسالة إذا كانت البيانات تم استلامه. يتم إرسال البيانات من الشاشة التسلسلية إلى Arduino.

()Serial.readString

يقرأ البيانات التسلسلية الواردة من المخزن المؤقت التسلسلي في السلسلة. يتم استخدام نوع البيانات String هنا.

أساسیات برمجة Arduino | الجزء الثاني

دعونا نفهم بمثال.

النظر في الكود أدناه.

String b;  
void setup( )  
{  
Serial.begin(4800);  
}  
void loop( )  
{  
while( Serial.available( ) )  
{  
b = Serial.readString( );  
Serial.println(b);  
}  
}  

يوضح الكود أعلاه بوضوح استخدام ()Serial.readString  لقراءة البيانات التسلسلية في السلسلة. السلسلة المحددة هنا هي ب.

تتم قراءة البيانات الموجودة في الوظيفة التسلسلية كسلسلة في الكود أعلاه.

كيف تتم قراءة البيانات التسلسلية بواسطة ()Serial.readString  و ()Serial.read ؟

تقرأ الدالة ()Serial.read  البيانات من حيث البايت بينما تقرأ ()Serial.readString  البيانات في مصطلح السلسلة.

()Serial.write

يرسل البيانات الثنائية إلى المنفذ التسلسلي في Arduino. يتم إرسال البيانات من خلال Serial.write كسلسلة من البايت أو بايت واحد. نوع البيانات هو size_t.

سترجع الدالة ()Serial.write  عدد وحدات البايت المكتوبة.

إذا أردنا إرسال أرقام الأرقام التي تمثلها الأحرف فنحن بحاجة إلى استخدام دالة ()Serial.print  بدلاً من ()Serial.write .

أساسیات برمجة Arduino | الجزء الثاني

تم التصريح عن ()Serial.write  بثلاثة تنسيقات موضحة أدناه:

write( str )
write( value )
write( buffer, len) 

Serial: يشير إلى كائن المنفذ التسلسلي.

Str: تشير كلمة str إلى سلسلة ترسل البيانات على شكل سلسلة من البايتات.

buffer: هو مصفوفة تُستخدم لإرسال البيانات كسلسلة من البايتات.

Value: يرسل البيانات إلى Arduino على هيئة بايت واحد.

Len: يشير إلى عدد البايتات التي يمكن إرسالها من المصفوفة.

دعونا نفهم بمثال بسيط.

النظر في الكود أدناه.

void setup( )  
{  
Serial.begin(14400);  
}  
void loop( )  
{  
Serial.write(55); // the specified value is 55.  
// Serial.write( ) send the data as a byte with this value (55).  
int Bytestosend = Serial.write( " Arduino" );  
// It sends the Arduino string.   
//The length of the string is a return parameter in this function.  

()Arduino analogRead

تقرأ الدالة analogRead ()  القيمة من الدبوس التمثيلي المحدد الموجود على لوحة Arduino المعينة.

ADC  (المحول التناظري إلى الرقمي) على لوحة Arduino هو محول متعدد القنوات. إنه يحدد جهد الدخل وجهد التشغيل بين القيمتين 0 و 1023. يمكن أن يكون جهد التشغيل 5V أو 3.3V.

القيم من 0 إلى 1023 هي القيم الصحيحة. يمكن كتابتها أيضًا بالرقم 0 إلى 1-(10^2).

المدة الزمنية لقراءة إشارة الإدخال التناظرية على اللوحات (UNO و Mega و Mini و Nano) هي حوالي 100 ميكروثانية أو 0.0001 ثانية.

ومن ثم فإن أقصى معدل قراءة للإدخال التناظري يبلغ حوالي 10000 مرة في الثانية.

دعونا نناقش جهد التشغيل ودقة بعض لوحات Arduino.

جهد التشغيل لـ Arduino UNO و Mini و Mega و Nano و Leonardo و Micro هو 5 فولت ودقة 10 بت.

جهد التشغيل للوحات عائلة MKR و Arduino Due و Zero هو 3 فولت والدقة 12 بت.

تغيير جهد الدخل والقرار (Changing the input voltage and resolution)

  • على لوحة معينة يمكننا تغيير جهد الدخل باستخدام دالة ()analogReference .

()analogReference

يتم تكوين الجهد المرجعي المستخدم للإدخال التناظري بواسطة ()analogReference .

analogReference (type)

 

  • يمكننا تغيير الدقة فقط لعائلة MKR ولوحة الصفر ولوحة الاستحقاق باستخدام الدالة ()analogReadResolution .

()analogReadResolution

تتمتع عائلة MKR و Zero و Due بدقة ADC تبلغ 12 بت.

سترجع الدالة ()analogReadResolution القيم الصحيحة بين 0 و 4095 من دالة ()analogRead .

 

analogReadResolution (bits)

bits: يشير إلى بتات الدقة التي تعيدها الدالة analogRead (). يمكننا ضبط قيمة البتات بين 1 و 32.

بناء جملة ()analogRead

الصيغة هي:

analogRead(pin)  

pin: يتضمن اسم الدبوس التمثيلي المعين للقراءة منه.

نوع البيانات هو int.

يمكن أيضًا أن يُرجع not-connected analog pin بعض القيمة. تعتمد هذه القيمة على موضع يدنا على السبورة والمدخلات التناظرية الأخرى القريبة.

دعونا نفهم مفهوم التناظرية اقرأ بمثال.

ضع في اعتبارك الكود أدناه:

Below is an example for the better understanding of the analogRead( ) function   
 int AnaPin = A3; // Analog pin A3 is specified here  
int value = 0;  // variable declared to store the value read  
void setup()   
{  
  Serial.begin(9600);           //  It sets the serial rate at bps  
}  
void loop()   
{  
  value = analogRead(AnaPin);  // It reads the input pin    
  Serial.println(value);            
}  

يقرأ الكود أعلاه الجهد من الدبوس التناظري المحدد (AnaPin) ويعرضه.

دوال اردوينو (Arduino Functions)

تسمح الدوال للمبرمج بتقسيم رمز معين إلى أقسام مختلفة ويقوم كل قسم بمهمة معينة. يتم إنشاء الوظائف لأداء مهمة عدة مرات في البرنامج.

الدالة هي نوع من الإجراءات التي تُرجع منطقة التعليمات البرمجية التي يتم استدعاؤها منها.

على سبيل المثال لتكرار مهمة عدة مرات في الكود يمكننا استخدام نفس مجموعة العبارات في كل مرة يتم فيها تنفيذ المهمة.

مزايا استخدام الدوال

دعونا نناقش بعض مزايا استخدام الدوال في البرمجة والتي تم سردها أدناه:

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

يحتوي Arduino على دالتین شائعتين ()setup  و ()loop والتي يتم استدعاؤها تلقائيًا في الخلفية. تتم كتابة الكود المطلوب تنفيذه داخل الأقواس المتعرجة داخل هذه الدوال.

()void setup  – يتضمن الجزء الأولي من الكود والذي يتم تنفيذه مرة واحدة فقط. يطلق عليه كتلة التحضير.

()void loop  – تتضمن العبارات التي يتم تنفيذها بشكل متكرر. يطلق عليه كتلة التنفيذ.

لكن في بعض الأحيان نحتاج إلى كتابة دوالنا الخاصة.

لنبدأ في كتابة الدوال.

طریقة تعریف الدالة

طريقة الإعلان عن دالة مذكورة أدناه:

  • Function return type

نحتاج إلى نوع إرجاع للدالة. على سبيل المثال يمكننا تخزين القيمة المرجعة لدالة في متغير.

يمكننا استخدام أي نوع بيانات كنوع إرجاع مثل float و char وما إلى ذلك.

  • اسم الدالة

يتكون من اسم محدد للدالة. يمثل الجسم الحقيقي للدالة.

  • Function parameter

يتضمن المعلمات التي تم تمريرها إلى الدالة. يتم تعريف المعلمات على أنها المتغيرات الخاصة والتي تُستخدم لتمرير البيانات إلى وظيفة.

يجب أن تتبع الدالة بأقواس () وفاصلة منقوطة ؛

تسمى البيانات الفعلية التي تم تمريرها إلى الدالة كوسيطة.

دعونا نفهم مع بعض الأمثلة.

مثال 1:

انظر إلى الصورة أدناه:

مثال 2: هنا سنضيف رقمين.

ضع في اعتبارك الكود أدناه:

void setup()  
{  
  Serial.begin(9600);  
}  
void loop() {  
  int a = 5; // initialization of values to the variables a and b  
  int b = 4;  
  int c;  
  c = myAddfunction(a, b); // c will now contains the value 9  
  Serial.println(c); // to print the resulted value  
  delay(1000); // time delay of 1 second or 1000 milliseconds  
}  
int myAddfunction(int i, int j)   
{  
  int sum;  
  sum = i + j;  
  return sum;  
}  

وبالمثل يمكننا إجراء عمليات حسابية باستخدام المفهوم أعلاه.

المثال 3:

هنا سننشئ دالة تحدد ما إذا كان الرقم زوجيًا أم فرديًا.

النظر في الكود أدناه.

int a= 0;  
int b;  
void setup()  
{  
  Serial.begin(9600);  
}  
void loop()   
{  
b = Evenfunction(a); // we can store the function return value in variable b  
  Serial.print(a);  
  Serial.print(" : "); // to separate even or odd text  
  if (b==1)  
  {  
    Serial.println( " Number is even");  
  }  
    else  
    {  
      Serial.println("Number is odd");  
    }  
                       
      a++; // the function will increment and will again run  
                     delay(1000);  
}  
                    
 int Evenfunction(int d)  
                       {  
                       if (d% 2==0)  
                       {  
                         return 1;  
                       }  
                       else  
                       {  
                         return 0;  
                       }  
                     }  

انتاج:

الإخراج موضح أدناه:

المصادر

الأول
الثاني
الثالث
الرابع
الخامس

منشور ذات صلة
شمعة الإشعال 5 Minutes

کل ما یجب أن تعلم عن شموع السیارات

أمير مقدم

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

سلسلة دروس: برمجة Arduino

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة