close

أخر الاخبار

كود أردوينو كامل (ج5) للتحكم الذكي في مستودع هيدروبونيك زراعة أسماك نباتات


كود أردوينو كامل للتحكم الذكي في مستودع هيدروبونيك زراعة أسماك نباتات الجزء الجزء الخامس (5)

(شرح الكود / شرح لقسم void loop / الجزء "ب" )

Arduino-code-farme-hydroponic-control

===========

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




الكود مع الشرح / شرح لقسم void loop / الجزء "ب"

 

بداية منظومة الامن والحماية

//بداية منظومة الامن مع Wr و M

//تشغيل الإنذار

T1=millis();

 

  if (Ts >=33 && T1>T2+1000) {

     char w [13] =" Ts>=33      ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" Ts>=33      ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "Ts>=31");

     strcpy (RemoteXY.text_WNoThink0, "Ts>=31");}

 

  else if (Ti >= 33 && T1>T2+1000 ) {

    char w [13] =" Ti>=33      ";

    EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" Ti>=31      ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "Ti>=31");

     strcpy (RemoteXY.text_WNoThink0, "Ti>=31");}

  else if (Te >=31 && T1>T2+1000) {

     char w [13] =" Te>=31      ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" Te>=31      ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "Te>=31");

     strcpy (RemoteXY.text_WNoThink0, "Te>=31");}

 

  else if (C >= 5 && T1>T2+1000) {

     char w [13] =" C>=5        ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" C>=5        ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "C>=5");

     strcpy (RemoteXY.text_WNoThink0, "C>=5");}

 

  else if (L >=10 && T1>T2+1000) {

     char w [13] =" L>8         ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" L>8         ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "L>8");

     strcpy (RemoteXY.text_WNoThink0, "L>8");}

 

  else if (L >=10 && T1>T2+1000) { //هنا من المفروض L<=4

     char w [13] =" L>8         ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" L>8       ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "L>8");

     strcpy (RemoteXY.text_WNoThink0, "L>8");}

 

  else if (Gs > 25 && T1>300000 && T1>T2+1000) {   //هذا التاخير ل5 دقائق كي يسخن حساسات الغاز ولا تقطع الكهرباء عندما تعود

     char w [13] =" Gs>25       ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" Gs>25       ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "Gs>25");

     strcpy (RemoteXY.text_WNoThink0, "Gs>25");}

 

  else if (Gi > 25 && T1>300000 && T1>T2+1000) {   //هذا التاخير ل5 دقائق كي يسخن حساسات الغاز ولا تقطع الكهرباء عندما تعود

     char w [13] =" Gi>25       ";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" Gi>25       ");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "Gi>25");

     strcpy (RemoteXY.text_WNoThink0, "Gi>25");}

 

  else if (distance < 200 && distance > 50 && T1>T2+1000) { 

     char w [13] =" distance<100";

     EEPROM.put(500,w);

     x=!x;

     digitalWrite(Led_wr, x);

     T2=T1;

     lcd2.setCursor(3, 3);

     lcd2.print("W>");

     tone(Z, Sound1, 500);

     lcd2.setCursor(7, 3);

     lcd2.print(" distance<100");

     RemoteXY.led_W_r = 255;

     RemoteXY.led_W0_r = 255;

     strcpy (RemoteXY. text_W, "W>");

     strcpy (RemoteXY.text_WNoThink, "distance<200");

     strcpy (RemoteXY.text_WNoThink0, "distance<200");}

 

  if (millis() > time_now_Wr + period_Wr) {

     time_now_Wr = millis();

     digitalWrite(Led_wr, LOW);

     lcd2.setCursor(3, 3);

     lcd2.print("W<");

     lcd2.setCursor(7, 3);

     lcd2.print(" No think....");

     RemoteXY.led_W_r = 0;

     RemoteXY.led_W0_r = 0;

     strcpy (RemoteXY. text_W, "W<");

     strcpy (RemoteXY.text_WNoThink, "No think....");

     strcpy (RemoteXY.text_WNoThink0, "No think....");

     if (T1>43200000) { //تصفير ال w أو ال 500 بعد مرور نصف يوم واحد

     char w [13] =" No think 12H";

     EEPROM.put(500,w);

     T1=0;}}

 

//تشغيل المحرك

T1=millis();

  if (millis() > time_now_M + period_M) {

    time_now_M = millis();

  if ((Ts >= 33)

     || (Ti >= 33)

     || (Te >= 31)

     || (Gs > 25 && T1>300000)

     || (Gi > 25 && T1>300000)

     || (RemoteXY.switch_2!=0))

    

    {digitalWrite(M, HIGH);

     RemoteXY.led_M_g = 255;

     lcd2.setCursor(3, 2);

     lcd2.print("M>");

     strcpy (RemoteXY.text_M, "M>");}

  else  {

     digitalWrite(M, LOW);

     RemoteXY.led_M_g = 0;

     lcd2.setCursor(3, 2);

     lcd2.print("M<");

     strcpy (RemoteXY.text_M, "M<");}}

//نهاية منظومة الامن

 

ادخال بيانات المكان لتشغيل منظومة الآذان حسب منطقتنا نغير التي بالاحمر ويمكنك البحث عن بيانات منطقتك في محركات البحث...

//مواقيت الاذان

//المعلومات المدخلة

    //  MEKKA

     float latitude=35.8775;

     float longitude=7.1136;

      //هنا راجع الملف المرفق للمكتبة وستجد الخيارات طابقها مع قادجاتك

     set_asr_method(Shafii);

     set_calc_method(Jafari);

     set_fajr_angle(18.5);

     set_isha_angle(17.5);

     set_high_lats_adjust_method(AngleBased);

     int dst=1;

     get_prayer_times(Annee, Mois, Jour, latitude, longitude, dst, times);

//احضار اوقات الاذان

     //الفجر

     int hours1, minutes1;

     get_float_time_parts(times[0], hours1, minutes1);

     //شروق الشمس

     int hours11, minutes11;

     get_float_time_parts(times[1], hours11, minutes11);

     //الظهر

     int hours2, minutes2;

     get_float_time_parts(times[2], hours2, minutes2);

     //العصر

     int hours3, minutes3;

     get_float_time_parts(times[3], hours3, minutes3);

     //المغرب

     int hours4, minutes4;

     //times[4] هو لغروب الشمس لهذا نزعته

     get_float_time_parts(times[5], hours4, minutes4);

     //العشاء

     int hours5, minutes5;

     get_float_time_parts(times[6], hours5, minutes5);

هنا تشغيل رولي الآذان التي ستشغل جهاز الmp3 الذي سبق وتحدثنا عن كيفية توصيله بالأعلى...

//برمجة الاذان

  if   ((Hor == hours1 && Min == minutes1)          //الفجر

      ||(Hor == hours1 && Min == ((minutes1)+(1)))

      ||(Hor == hours1 && Min == ((minutes1)+(2)))

      ||(Hor == hours1 && Min == ((minutes1)+(3))))

     {digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

 else if((Hor == hours2 && Min == minutes2)         //الظهر

      ||(Hor == hours2 && Min == ((minutes2)+(1)))

      ||(Hor == hours2 && Min == ((minutes2)+(2)))

      ||(Hor == hours2 && Min == ((minutes2)+(3))))

     {digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

 else if((Hor == hours3 && Min == minutes3)         //العصر

      ||(Hor == hours3 && Min == ((minutes3)+(1)))

      ||(Hor == hours3 && Min == ((minutes3)+(2)))

      ||(Hor == hours3 && Min == ((minutes3)+(3))))

     {digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

 else if((Hor == hours4 && Min == minutes4)        //المغرب

      ||(Hor == hours4 && Min == ((minutes4)+(1)))

      ||(Hor == hours4 && Min == ((minutes4)+(2)))

      ||(Hor == hours4 && Min == ((minutes4)+(3))))

     {digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

 else if((Hor == hours5 && Min == minutes5)       //العشاء

      ||(Hor == hours5 && Min == ((minutes5)+(1)))

      ||(Hor == hours5 && Min == ((minutes5)+(2)))

      ||(Hor == hours5 && Min == ((minutes5)+(3))))

     {digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

تشغيل الآذان بالهاتف للتجربة...

else if (RemoteXY.switch_3!=0)  {               //السويتش

     digitalWrite(Q, HIGH);

     lcd2.setCursor(6, 2);

     lcd2.print("Q>");

     RemoteXY.led_Q_g = 255;

     strcpy (RemoteXY. text_Q, "Q>");}

  else {

     digitalWrite(Q, LOW);

     lcd2.setCursor(6, 2);

     lcd2.print("Q<");

     RemoteXY.led_Q_g = 0;

     strcpy (RemoteXY. text_Q, "Q<");}

//انتهى الآذان

هنا تشغيل افتراضي للمآخذ الزائدة الثلاثة بين ال12 و13 ظهرا تستطيع برمجتها حسب  الحاجة لتشغيل أجهزة أخرى...

//مواقيت اشعال المآخذ الإظافية الثلاثة

  if (Hor >= 12 && Hor < 13) {

//R1

     digitalWrite(R1, HIGH);

     lcd2.setCursor(9,2);  

     lcd2.print("R1>");

     RemoteXY.led_R1_g = 255;

     strcpy (RemoteXY. text_R1, "R1>");

//R2    

     digitalWrite(R2, HIGH);

     lcd2.setCursor(13,2);  

     lcd2.print("R2>");

     RemoteXY.led_R2_g = 255;

     strcpy (RemoteXY. text_R2, "R2>"); 

//R3

     digitalWrite(R3, HIGH);

     lcd2.setCursor(17,2);  

     lcd2.print("R3>");

     RemoteXY.led_R3_g = 255;

     strcpy (RemoteXY. text_R3, "R3>");}

  else {

     digitalWrite(R1, LOW);

     lcd2.setCursor(9,2);  

     lcd2.print("R1<");

     RemoteXY.led_R1_g = 0;

     strcpy (RemoteXY. text_R1, "R1<");

     digitalWrite(R2, LOW);

     lcd2.setCursor(13,2);  

     lcd2.print("R2<");

     RemoteXY.led_R2_g = 0;

     strcpy (RemoteXY. text_R2, "R2<");

     digitalWrite(R3, LOW);

     lcd2.setCursor(17,2);  

     lcd2.print("R3<");

     RemoteXY.led_R3_g = 0;

     strcpy (RemoteXY. text_R3, "R3<");}

//السويتشات ريموت  1 10 2 3 مستعملة في Li M Q

 

الضوء الداخلي غير مفعل الخاص بالعمال نفعله حسب الحاجة

//---------------------الواجهة 1 للعرض ----------------------

//مواقيت اشعال الضوء الداخلي Li

//  if  ((Hor >= hours1 && Hor <= hours4)

//     || (RemoteXY.switch_1!=0)

//     || (RemoteXY.switch_10!=0))

//

//     {digitalWrite(Li, HIGH);

//     lcd1.setCursor(0, 2);

//     lcd1.print("Li>");

//     RemoteXY.led_Li_g = 255;

//     RemoteXY.led_0_g = 255;    

//     strcpy (RemoteXY. text_Li, "Li>");}

//  else {

//     digitalWrite(Li, LOW);

//     lcd1.setCursor(0, 2);

//     lcd1.print("Li<");

//     RemoteXY.led_Li_g = 0;

//     RemoteXY.led_0_g = 0;    

//     strcpy (RemoteXY. text_Li, "Li<");}

 

//للتجربة

//  if  ((Hor >= 7 && Hor < 17)

//     || (RemoteXY.switch_1!=0)

//     || (RemoteXY.switch_10!=0))

//

//     {digitalWrite(Li, HIGH);

//     lcd1.setCursor(0, 2);

//     lcd1.print("Li>");

//     RemoteXY.led_Li_g = 255;

//     RemoteXY.led_0_g = 255;    

//     strcpy (RemoteXY. text_Li, "Li>");}

//  else {

//     digitalWrite(Li, LOW);

//     lcd1.setCursor(0, 2);

//     lcd1.print("Li<");

//     RemoteXY.led_Li_g = 0;

//     RemoteXY.led_0_g = 0;    

//     strcpy (RemoteXY. text_Li, "Li<");}

 

     هنا شغلته صباحا بعد الفجر وبداية العمل مع تحكم بالهاتف فيه...

//مؤقتة

  if  ((Hor >= hours4 && Hor <= hours11)

     || (RemoteXY.switch_1!=0)

     || (RemoteXY.switch_10!=0))

 

     {digitalWrite(Li, HIGH);

     lcd1.setCursor(0, 2);

     lcd1.print("Li>");

     RemoteXY.led_Li_g = 255;

     RemoteXY.led_0_g = 255;    

     strcpy (RemoteXY. text_Li, "Li>");}

  else {

     digitalWrite(Li, LOW);

     lcd1.setCursor(0, 2);

     lcd1.print("Li<");

     RemoteXY.led_Li_g = 0;

     RemoteXY.led_0_g = 0;    

     strcpy (RemoteXY. text_Li, "Li<");}

 

 

مواقيت اشعال الضوء الخارجي فعلته بالاسفل بعد الفجر كتجربة...

//Lx شرط إشعال الضوء الخارجي

// unsigned long now = millis();

// if (now - time_now_Lx >= Min_Lx){

//     time_now_Lx += Min_Lx;

//  if ((D < 30)

//     || (digitalRead(Li) == LOW)) 

//     {  //هنا من المفروض 140

//     digitalWrite(Lx, HIGH);

//     lcd1.setCursor(4, 2);

//     lcd1.print("Lx>");

//     RemoteXY.led_Lx_g = 255;

//     strcpy (RemoteXY. text_Lx, "Lx>");}

//  else {

//     digitalWrite(Lx, LOW);

//     lcd1.setCursor(4, 2);

//     lcd1.print("Lx<");

//     RemoteXY.led_Lx_g = 0;

//     strcpy (RemoteXY. text_Lx, "Lx<");}}

 

//مؤقتة

 unsigned long now = millis();

 if (now - time_now_Lx >= Min_Lx){

     time_now_Lx += Min_Lx;

  if  (Hor >= hours4 && Hor <= hours11) 

     {

     digitalWrite(Lx, HIGH);

     lcd1.setCursor(4, 2);

     lcd1.print("Lx>");

     RemoteXY.led_Lx_g = 255;

     strcpy (RemoteXY. text_Lx, "Lx>");}

  else {

     digitalWrite(Lx, LOW);

     lcd1.setCursor(4, 2);

     lcd1.print("Lx<");

     RemoteXY.led_Lx_g = 0;

     strcpy (RemoteXY. text_Lx, "Lx<");}}

 

 

مواقيت اشعال ضوء النباتات فعلته بين ال11 وال4 للتجربة كذلك تستطيع تغييره حسب توافر الإظائة عندك...

//Lm مواقيت إشعال ضوء النبات

  if  (Hor >= hours11 && Hor <= hours4){

     digitalWrite(Lm, HIGH);

     lcd1.setCursor(8, 2);

     lcd1.print("Lm>");

     RemoteXY.led_Lm_g = 255;

     strcpy (RemoteXY. text_Lm, "Lm>");}

  else {

     digitalWrite(Lm, LOW);

     lcd1.setCursor(8, 2);

     lcd1.print("Lm<");

     RemoteXY.led_Lm_g = 0;

     strcpy (RemoteXY. text_Lm, "Lm<");}

 

مواقيت تأكيل السمك تستطيع إختيار أي وقت يناسبك لتوزيع الاكل والثواني حسب نوع الجهاز الذي تستخدمه لأككل السمك...

//Fd مواقيت توزيع الأكل على السمك

  if   ((Hor == 6 && Min == 5 && Sec == 5)

     || (Hor == 6 && Min == 5 && Sec == 6)

     || (Hor == 6 && Min == 5 && Sec == 7)

     || (Hor == 6 && Min == 5 && Sec == 8)

     || (Hor == 9 && Min == 5 && Sec == 5)

     || (Hor == 9 && Min == 5 && Sec == 6)

     || (Hor == 9 && Min == 5 && Sec == 7)

     || (Hor == 9 && Min == 5 && Sec == 8)

     || (Hor == 12 && Min == 5 && Sec == 5)

     || (Hor == 12 && Min == 5 && Sec == 6)

     || (Hor == 12 && Min == 5 && Sec == 7)

     || (Hor == 12 && Min == 5 && Sec == 8)

     || (Hor == 15 && Min == 5 && Sec == 5)

     || (Hor == 15 && Min == 5 && Sec == 6)

     || (Hor == 15 && Min == 5 && Sec == 7)

     || (Hor == 15 && Min == 5 && Sec == 8)

     || (Hor == 17 && Min == 5 && Sec == 5)

     || (Hor == 17 && Min == 5 && Sec == 6)

     || (Hor == 17 && Min == 5 && Sec == 7)

     || (Hor == 17 && Min == 5 && Sec == 8))

     {digitalWrite(Fd, HIGH);

     lcd1.setCursor(12, 2);

     lcd1.print("Fd>");

     RemoteXY.led_Fd_g = 255;

     strcpy (RemoteXY. text_Fd, "Fd>");}

  else {

     digitalWrite(Fd, LOW);

     lcd1.setCursor(12, 2);

     lcd1.print("Fd<");

     RemoteXY.led_Fd_g = 0;

     strcpy (RemoteXY. text_Fd, "Fd<");}

 

هنا عمل مضخة الماء تبعا لزر (حساس الفلوتور بالخزان اسفل الدورة او النباتات) فالتحكم بالفلوتور يمكنك اظافة شرط الزمن الليل النهار...

//Wt شرط عمل مضخة الماء

  if (digitalRead(B_Wt) == HIGH) {

     digitalWrite(Wt, HIGH);

     lcd1.setCursor(16, 2);

     lcd1.print("Wt>");

     lcd2.setCursor(1, 0);

     lcd2.print("T1");

     RemoteXY.led_Wt_g = 255;

     strcpy (RemoteXY.text_T, "1");

     strcpy (RemoteXY. text_Wt, "Wt>");}

  else  {

     digitalWrite(Wt, LOW);

     lcd1.setCursor(16, 2);

     lcd1.print("Wt<");

     lcd2.setCursor(1, 0);

     lcd2.print("T0");

     RemoteXY.led_Wt_g = 0;

     strcpy (RemoteXY.text_T, "0");

     strcpy (RemoteXY. text_Wt, "Wt<");}

===========================================






للتنقل السريع بين أجزاء الموضوع إستخدم الروابط بالأسفل...


(التعرف على مهام ودور الكود + العتاد المطلوب + كيفية طلب العتاد (للجزائريين)
(تحميل المكتبات + بداية شرح الكود / الجزء العلوي فوق void setup)
(شرح الكود / شرح لقسم void setup)
(شرح الكود / شرح لقسم void loop / الجزء "أ" )
(شرح الكود / شرح لقسم void loop / الجزء "ب" )
(شرح الكود / شرح لقسم void loop / الجزء "ج" )
(شرح الكود / شرح لقسم void loop / الجزء "د" + تحميل الكود كامل / المراجع / إمكانية شراء الخدمات المماثلة  )






إذا أعجبك الموضوع يمكنك مشاهدة مواضيع  مشابهة بقسم الأردوينو لاتقل أهمية إضغط هنا  للإنتقال لقسم الأردوينو.


ليصلك جديدنا تابعنا على صفحاتنا الاجتماعية: الفيسبوكالتويتر ,tumblrpinterestlinkedininstagram




الحصول على رابط هذا الموضوع

رابط:
رابط الموضوع بكود html:
رابط الموضوع للمنتديات:

مواضيع أخرى قد تهمك



تعليقات
ليست هناك تعليقات
إرسال تعليق



    وضع القراءة :
    حجم الخط
    +
    16
    -
    تباعد السطور
    +
    2
    -