arduino

  • تحكم في ليد Arduino: دورة تشغيل ثلاث مرات

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

    أولًا وقبل كل شيء، يجب عليك أن تعلم أن دالة exit(0) تستخدم لإنهاء تشغيل البرنامج بشكل فوري، ولكن يفضل تجنب استخدامها في برامج Arduino لأنها قد تؤدي إلى نتائج غير متوقعة.

    لتحقيق تشغيل الحلقة لثلاث مرات وإيقافها، يمكنك استخدام الشرط Loops < 3 كما هو الحال في الكود الحالي. ولكن يجب أن تقوم بوضع الكود الخاص بإيقاف التشغيل في مكان صحيح.

    لتصحيح الكود، إليك نسخة معدلة:

    cpp
    int LedPin = 13; int Loops = 0; void setup() { pinMode(LedPin, OUTPUT); } void loop() { digitalWrite(LedPin, HIGH); delay(2000); digitalWrite(LedPin, LOW); Loops = Loops + 1; if (Loops >= 3) { // قم بوضع الكود هنا الذي تريد تنفيذه بعد تكرار الحلقة 3 مرات // على سبيل المثال، يمكنك إضافة تأخير إضافي أو تنفيذ إجراء إضافي delay(1000); } }

    يرجى مراجعة الكود وتجربته على لوحة Arduino الخاصة بك، وتأكد من أنه يحقق الغرض الذي تريده. في هذا المثال، يتم تشغيل الحلقة لثلاث مرات، ثم يمكنك إضافة الكود الإضافي الذي ترغب في تنفيذه بعد تكرار الحلقة 3 مرات.

    المزيد من المعلومات

    بالتأكيد، دعوني أقدم لك مزيدًا من المعلومات حول برنامج Arduino الذي قمت بكتابته والتعديلات التي قمت بها:

    1. تعريف المتغيرات:

      • int LedPin = 13;: يتم استخدام هذا المتغير لتحديد رقم التوصيل الذي يتم توصيل الليد به في لوحة Arduino.
      • int Loops = 0;: يُستخدم هذا المتغير لتتبع عدد مرات تكرار الحلقة.
    2. دالة setup():

      • في هذه الدالة، تم استخدام pinMode(LedPin, OUTPUT); لتحديد أن دبوس الليد هو إخراج.
    3. دالة loop():

      • يتم استخدام digitalWrite(LedPin, HIGH); لتشغيل الليد.
      • delay(2000);: يتم تأخير البرنامج لمدة 2 ثانية.
      • digitalWrite(LedPin, LOW);: يتم إيقاف تشغيل الليد.
      • Loops = Loops + 1;: يتم زيادة قيمة المتغير Loops بواحد في كل تكرار.
      • يتم فحص إذا ما كانت قيمة Loops أقل من 3. إذا كانت أقل، يتم تشغيل الليد مرة أخرى. إذا كانت تساوي أو تزيد عن 3، يمكنك إضافة الكود الإضافي الذي تريده.
    4. استخدام delay(1000); بعد تكرار الحلقة 3 مرات:

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

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

  • فهم برمجة MPU-6050 باستخدام Arduino وبروتوكول I2C

    فيما يتعلق بالشيفرة التي قدمتها، يبدو أنها تستخدم مستشعر MPU-6050 الذي يعمل عبر بروتوكول I2C. لنقم بتفسير الشيفرة خطوة بخطوة لفهم كيف يعمل البرنامج.

    أولاً، يتم تضمين مكتبة Wire.h التي تستخدم للتحكم في تواصل I2C. يتم تحديد عنوان MPU-6050 كـ 0x68.

    في دالة setup():

    1. يتم بداية اتصال I2C باستخدام Wire.begin().
    2. يتم بداية اتصال I2C مع جهاز MPU-6050 باستخدام Wire.beginTransmission(MPU).
    3. يتم كتابة قيمة 0 إلى العنوان 0x6B في السجل PWR_MGMT_1 لتفعيل جهاز MPU-6050 باستخدام Wire.write(0x6B).
    4. يتم إنهاء اتصال I2C مع Wire.endTransmission(true).
    5. يتم بدء Serial communication بسرعة 9600 بت/ثانية.

    في دالة loop():

    1. يتم بدء اتصال I2C مع جهاز MPU-6050 باستخدام Wire.beginTransmission(MPU).
    2. يتم كتابة عنوان البداية للقراءة (register 0x3B) باستخدام Wire.write(0x3B).
    3. يتم إنهاء اتصال I2C بـ Wire.endTransmission(false).
    4. يتم طلب 14 مستندًا من MPU-6050 باستخدام Wire.requestFrom(MPU, 14, true).
    5. يتم قراءة قيم التسارع (AcX، AcY، AcZ) ودرجة الحرارة (Tmp) وسرعة الدوران (GyX، GyY، GyZ) وتخزينها.
    6. تتم عمليات القراءة باستخدام الشيفرة Wire.read()<<8|Wire.read() للحصول على القيم بصيغة 16 بت.
    7. يتم طباعة القيم المقروءة عبر Serial communication.

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

    المزيد من المعلومات

    تعتبر شيفرة البرنامج المُقدمة مبنية على لغة البرمجة C++ باستخدام لوحة تطوير Arduino. البرنامج يستخدم مكتبة Wire.h لإدارة تواصل I2C، وهو نوع من البروتوكولات الخاصة بالتواصل بين أجهزة متصلة في نفس الدائرة الإلكترونية.

    في الجزء الخاص بإعداد البرنامج (دالة setup()):

    • تبدأ البرنامج بفتح اتصال I2C باستخدام Wire.begin()، ومن ثم يبدأ اتصال مع مستشعر MPU-6050 باستخدام Wire.beginTransmission(MPU).
    • يتم كتابة القيمة 0 إلى عنوان السجل PWR_MGMT_1 باستخدام Wire.write(0x6B)، وهذا يعمل على إيقاظ جهاز MPU-6050.
    • يُنهي الاتصال I2C مع Wire.endTransmission(true)، ثم يتم بدء Serial communication بسرعة 9600 بت/ثانية باستخدام Serial.begin(9600).

    في دالة loop():

    • يتم بدء اتصال I2C مع جهاز MPU-6050 باستخدام Wire.beginTransmission(MPU)، ثم يتم كتابة عنوان السجل الذي نريد قراءته (0x3B) باستخدام Wire.write(0x3B).
    • يُنهي الاتصال I2C بـ Wire.endTransmission(false).
    • يتم طلب 14 مستندًا (14 بايت) من MPU-6050 باستخدام Wire.requestFrom(MPU, 14, true)، حيث يتم قراءة هذه القيم باستخدام Wire.read() ومعالجتها للحصول على القيم النهائية.
    • يتم طباعة قيم التسارع (AcX، AcY، AcZ) ودرجة الحرارة (Tmp) وسرعة الدوران (GyX، GyY، GyZ) عبر Serial communication.

    تُستخدم الدالة delay(333) لتأخير البرنامج لمدة 333 مللي ثانية قبل بدء تكرار العملية مرة أخرى.

    يعتبر البرنامج فعّالًا لقراءة البيانات من MPU-6050 وطباعتها عبر واجهة Serial لتتمكن من فحص القيم المسترجعة من التسارع ودرجة الحرارة وسرعة الدوران للتحكم في الأجهزة الإلكترونية بشكل فعّال.

  • تحسين استقبال البيانات عبر UART في Arduino

    عند التعامل مع تبادل البيانات عبر UART في Arduino، يمكن أن تطرأ بعض التحديات في عملية استقبال البيانات بشكل صحيح. في الشيفرة التي قدمتها، تبدو عملية الاستقبال صحيحة، ولكن قد تواجه بعض المشكلات في عرض البيانات. سأقدم لك بعض النصائح لتحسين عملية الاستقبال وعرض البيانات بشكل صحيح.

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

    cpp
    #define RESPONSE_SIZE 24 byte RecieveArray[RESPONSE_SIZE]; // ... الشيفرة الأخرى ... for(k = 0; k < RESPONSE_SIZE; k++) { RecieveArray[k] = Serial.read(); }

    ثم، بعد استلام البيانات بنجاح، يجب عليك التأكد من أنك تقوم بعرضها بالطريقة الصحيحة. قد تحتاج إلى استخدام دالة Serial.print بدلاً من Serial.write لضمان عرض البيانات بشكل نصي.

    cpp
    for(int k = 0; k < RESPONSE_SIZE; k++) { Serial.print(RecieveArray[k]); Serial.print(" "); } Serial.println(); // إضافة سطر جديد للتنسيق

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

    المزيد من المعلومات

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

    1. تحديد معدل الباود:
      تأكد من أن معدل الباود (Baud Rate) الذي تستخدمه في الاتصال UART هو نفسه في كل الأجهزة المتصلة. يمكنك ضبطه في الكود باستخدام Serial.begin، على سبيل المثال:

      cpp
      Serial.begin(9600); // افتراضي: 9600 باود
    2. مراعاة التأخير:
      قد تحتاج إلى إضافة بعض التأخير بين عمليات الإرسال والاستقبال للتأكد من استلام البيانات بشكل كامل. يمكنك استخدام delay لهذا الغرض:

      cpp
      delay(100); // قد تحتاج لتعديل القيمة حسب حجم البيانات
    3. التعامل مع التكرار:
      في بعض الأحيان، يمكن أن تتلقى بيانات غير صحيحة بسبب التشويش أو التكرار. يمكنك التحقق من ذلك بفحص قيمة Serial.available للتأكد من وجود بيانات جاهزة للاستقبال.

      cpp
      if(Serial.available() >= RESPONSE_SIZE) { for(int k = 0; k < RESPONSE_SIZE; k++) { RecieveArray[k] = Serial.read(); } }
    4. تحسين عملية الإرسال:
      يمكنك تحسين عملية الإرسال عند استخدام دالة write عبر استخدام print بدلاً من ذلك. هذا يساعد في تحسين التفاعل مع بعض الأجهزة.

      cpp
      for(i = 0; i < 24; i++) { Serial.print(SendArray[i]); SendArray[i] = 0; }

    باعتبارها جزءًا من العملية التطويرية، يمكنك تجربة هذه الاقتراحات وضبطها حسب احتياجات مشروعك لضمان استقبال وعرض البيانات بشكل صحيح.

  • تحليل وتصحيح لخطأ too many arguments في برمجة تحكم ليزر الجويستيك بلغة C++ على Arduino.

    في البداية، يظهر أن لديك مشكلة في كودك الذي يتحكم في الليزر الذي تقوم ببنائه باستخدام لوحة أردوينو ولغة البرمجة C++. يبدو أن الخطأ الذي تواجهه يتعلق بـ “too many arguments” ويتعلق بدالة digitalRead. دعنا نقوم بتحليل الكود ومعالجة هذه المشكلة.

    أولًا، يتم استخدام دالة digitalRead بشكل غير صحيح في الأماكن التالية:

    cpp
    servoVal = digitalRead(joy1, joy2, joy3, joy4);

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

    cpp
    servoVal = digitalRead(joy1);

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

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

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

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

    المزيد من المعلومات

    لنتابع النقاش حول مشكلتك، سنقوم بتوسيع المحتوى لتقديم مزيد من المعلومات والتفاصيل.

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

    على سبيل المثال، يمكنك استخدام الكود التالي لقراءة حالة كل دبوس:

    cpp
    int joy1State = digitalRead(joy1); int joy2State = digitalRead(joy2); int joy3State = digitalRead(joy3); int joy4State = digitalRead(joy4);

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

    ثم، عند استخدام دالة map لتحويل القيم، تأكد من أن النطاق الذي تحدده يتناسب مع متطلبات السيرفو. يُفضل أيضًا استخدام نطاق القيم الصحيح للدبوس، والتأكد من تعيين نطاق صحيح للسيرفو.

    cpp
    servoVal = map(joy1State, 0, 1, 0, 180); // قد تحتاج لتعديل النطاق حسب متطلباتك

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

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

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

  • تحسين شيفرة Arduino: دوال وهياكل لتحكم فعّال بمصفوفة LED 8×8

    عندما نتحدث عن كتابة وظائف في لغة البرمجة C++، فإن إعادة استخدام الشيفرة وتنظيمها يمكن أن يكون ذا أهمية كبيرة لتحسين فهم الشيفرة وجعلها أكثر فعالية. إذا كنت تعمل على مشروع Arduino لتحكم في مصفوفة LED 8×8 باستخدام جويستيك، فإليك طريقة لتقليل حجم الشيفرة الخاصة بك وتحسينها.

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

    cpp
    #include const int matrixSize = 8; const byte empty = B00000000; // يمثل خلية فارغة byte createMatrix() { byte matrix[matrixSize] = {empty, empty, empty, empty, empty, empty, empty, empty}; // قم بتعيين القيم المناسبة لكل نقطة في المصفوفة بناءً على منطق التحكم بالجوستيك // على سبيل المثال، إذا كانت النقطة في الموقع (2, 3) مضاءة، قم بتعيين القيمة المناسبة في المصفوفة matrix[2] = B00010000; matrix[3] = B00010000; // استمر في تعيين القيم حسب احتياجاتك return matrix; } void setup() { // قم بتهيئة البيئة } void loop() { byte ledMatrix[matrixSize]; ledMatrix = createMatrix(); // استخدم المصفوفة المُنشأة في عرض النتائج على المصفوفة LED }

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

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

    المزيد من المعلومات

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

    1. استخدام هيكل تحكم للجويستيك:
      يمكنك استخدام هيكل تحكم لتحديد اتجاهات الجويستيك بشكل أفضل، مما يجعل الكود أكثر قابلية للفهم.

      cpp
      struct Joystick { int x; int y; }; Joystick readJoystick() { // قراءة قيم الجويستيك وإرجاعها ككائن من هيكل التحكم }
    2. استخدام دوال لتحديث المصفوفة:
      يمكنك تقسيم تحديث المصفوفة إلى دوال منفصلة لتحسين التنظيم.

      cpp
      void updateMatrix(byte matrix[], Joystick joystick) { // قم بتحديث المصفوفة بناءً على قيم الجويستيك }
    3. التعامل مع الإضاءة بشكل أفضل:
      قد يكون من المفيد استخدام متغيرات قابلة للقراءة لتمثيل الحالات الإضاءة وتحسين قراءة الكود.

      cpp
      const byte OFF = B00000000; const byte ON = B00010000; // ثم في الدالة updateMatrix يمكنك استخدام هذه المتغيرات بدلاً من القيم المباشرة matrix[2] = joystick.x > 0 ? ON : OFF;
    4. تحسين هيكل البرنامج:
      قم بتنظيم الشيفرة بشكل جيد في وظائف مستقلة واستخدم التعليقات لشرح الجزئيات الهامة.

      cpp
      void setup() { // قم بتهيئة البيئة } void loop() { Joystick joystick = readJoystick(); byte ledMatrix[matrixSize]; updateMatrix(ledMatrix, joystick); // استخدم المصفوفة المُحدثة في عرض النتائج على المصفوفة LED }

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

  • ما هي لغات البرمجة المتوافقة مع نظام Arduino؟

    لغات البرمجة المتوافقة مع نظام Arduino هي:

    1- لغة السلسلة الغيرية (C++): هي اللغة الرئيسية المستخدمة في برمجة نظام Arduino.

    2- لغة البرمجة الرسومية (Blockly): هي لغة برمجة مصممة للمبتدئين في عالم البرمجة، حيث يتم استخدام المفاتيح الرسومية لإنشاء برمجيات بطريقة سهلة وبسيطة.

    3- لغة البرمجة العامة (Python): يمكن استخدام لغة برمجة Python على نظام Arduino باستخدام مكتبة PySerial.

    4- لغة البرمجة الإفتراضية (Scratch): هي لغة برمجة إفتراضية، حيث يتم استخدام المفاتيح الرسومية لإنشاء البيانات والبرامج.

    5- لغة البرمجة المعززة (Processing): يمكن استخدام لغة برمجة Processing في التواصل مع Arduino باستخدام مكتبة serial، وذلك لعرض البيانات القادمة من Arduino بشكل جرافيكي.

  • ما هي لغات البرمجة المتوافقة مع Arduino؟

    يمكن برمجة Arduino باستخدام لغات عديدة مثل C و C++ و Python و Java و JavaScript و Lua و Scratch وغيرها. ومع ذلك، فإن لغة برمجة C++ هي اللغة الأساسية التي يستخدمها معظم المستخدمين لبرمجة Arduino.

  • ما مدى سهولة استخدام لغة برمجة Arduino؟

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

  • ما هي لغة البرمجة المستخدمة لبرمجة Arduino؟

    لغة البرمجة المستخدمة لبرمجة Arduino هي لغة C++ مع بعض المكتبات المخصصة لأجهزة Arduino. ويمكن للمستخدمين أيضاً استخدام لغات البرمجة الأخرى مثل Python و Java عن طريق برامج البرمجة المناسبة.

  • ما هي لغات البرمجة المتوافقة مع نظام Arduino؟

    لغات البرمجة المتوافقة مع نظام Arduino هي:

    1- لغة السلسلة الغيرية (C++): هي اللغة الرئيسية المستخدمة في برمجة نظام Arduino.

    2- لغة البرمجة الرسومية (Blockly): هي لغة برمجة مصممة للمبتدئين في عالم البرمجة، حيث يتم استخدام المفاتيح الرسومية لإنشاء برمجيات بطريقة سهلة وبسيطة.

    3- لغة البرمجة العامة (Python): يمكن استخدام لغة برمجة Python على نظام Arduino باستخدام مكتبة PySerial.

    4- لغة البرمجة الإفتراضية (Scratch): هي لغة برمجة إفتراضية، حيث يتم استخدام المفاتيح الرسومية لإنشاء البيانات والبرامج.

    5- لغة البرمجة المعززة (Processing): يمكن استخدام لغة برمجة Processing في التواصل مع Arduino باستخدام مكتبة serial، وذلك لعرض البيانات القادمة من Arduino بشكل جرافيكي.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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