كود البحث

الدرس 14/31-2: مثال 2 على ترميز Arduino باستخدام millis() مع الحدث

الدرس 14/31-2: مثال 2 على ترميز Arduino باستخدام millis() مع الحدث

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

سيارة سنفوندر المجمعة

فيما يلي بعض الأمثلة العملية لكيفية استخدام هذا النمط في مشاريعك الخاصة:

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

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

المكونات المطلوبة

  • لوحة أردوينو (Uno، Nano، Mega، إلخ)
  • زر ضغط
  • أسلاك توصيل

دليل التوصيل

التوصيل لهذا المثال بسيط جدًا. يستخدم مقاومة سحب داخلية، لذا لا حاجة لمقاومة خارجية للزر.

  • قم بتوصيل أحد أطراف زر الضغط بمنفذ GND في الأردوينو.
  • قم بتوصيل الطرف الآخر من زر الضغط بالمنفذ الرقمي 2 في الأردوينو.

نظرًا لأننا نستخدم INPUT_PULLUP في الكود، سيقرأ المنفذ قيمة HIGH عندما لا يكون الزر مضغوطًا و LOW عندما يكون مضغوطًا، مما يربط المنفذ بالأرضي. (في الفيديو عند 08:29)

فهم الكود

يوضح هذا الكود مؤقتًا بسيطًا قائمًا على الأحداث. يطبع البرنامج باستمرار قيمة millis() الحالية إلى الشاشة التسلسلية. عندما يتم الضغط على الزر والاستمرار في الضغط، وكان الأردوينو يعمل لمدة 5 ثوانٍ على الأقل، سيطبع "Take action" إلى الشاشة التسلسلية. المفتاح هو أن فحص millis() لا يوقف الطباعة المستمرة للوقت.

دعنا نحلل الأجزاء القابلة للتخصيص من الكود:

unsigned long event = 5000;// 5 ثوانٍ

هذا هو المتغير الأكثر أهمية للتكوين. يحدد مدة "الحدث" الخاص بك بالميلي ثانية. في هذا المثال، تم ضبطه على 5000، وهو ما يساوي 5 ثوانٍ. لتغيير التأخير، ببساطة قم بتعديل هذا الرقم. على سبيل المثال، ضبطه على 10000 سيجعل الإجراء يُفعَّل بعد 10 ثوانٍ. من الضروري استخدام نوع البيانات unsigned long، لأن قيمة millis() يمكن أن تنمو بشكل كبير جدًا وستتجاوز في النهاية القيمة القصوى لمتغير int القياسي، مما يسبب أخطاء في المقارنة. (في الفيديو عند 05:46)

pinMode(2,INPUT_PULLUP);

يقوم هذا السطر بتكوين المنفذ الرقمي 2 كمدخل وتفعيل المقاومة الداخلية للسحب. هذه خطوة تكوين أساسية تسمح لك بتوصيل زر دون مقاومة خارجية. سيقرأ المنفذ قيمة HIGH افتراضيًا وسيصبح LOW عند الضغط على الزر، مما يربطه بالأرضي. إذا كنت ترغب في استخدام منفذ مختلف، قم بتغيير الرقم 2 هنا وفي سطر digitalRead(2) داخل الحلقة. (في الفيديو عند 08:46)

المنطق داخل loop() واضح. يقرأ حالة الزر. إذا كان الزر مضغوطًا (pb == LOW)، فإنه يتحقق بعد ذلك مما إذا كان الوقت الحالي (millis()) أكبر من أو يساوي وقت event المحدد. إذا كان كلا الشرطين صحيحين، فإنه يطبع رسالة الإجراء. بقية الحلقة، التي تطبع الوقت، تستمر في العمل دون انقطاع، مما يوضح قوة millis() على delay().

يتحقق هذا المثال من الوقت منذ لحظة بدء تشغيل الأردوينو. المثال الثالث في سلسلة الفيديو يبني على هذا من خلال تسجيل وقت أول ضغطة زر وتفعيل إجراء فقط إذا حدثت ضغطة ثانية بعد 5 ثوانٍ على الأقل. هذا المنطق مغطى في الدرس 14/31-3: مثال 3 على كود millis() في الأردوينو مع زر ضغط.

عرض المشروع المباشر

بمجرد رفع الكود وفتح الشاشة التسلسلية (بمعدل 9600 باود)، سترى تدفقًا مستمرًا من الأرقام، تمثل الميلي ثانية منذ تشغيل اللوحة. إذا ضغطت على زر الضغط واستمررت في الضغط قبل مرور 5 ثوانٍ، فلن يحدث شيء. ومع ذلك، إذا ضغطت على الزر واستمررت في الضغط بعد علامة الخمس ثوانٍ، سترى رسالة "Take action" مطبوعة في الشاشة التسلسلية. سيستمر الإجراء في الطباعة طالما كان الزر مضغوطًا. هذا يوضح مؤقتًا غير معطل يسمح لكود آخر (الطباعة) بالعمل بسلاسة. (في الفيديو عند 10:52)

مشاريع ذات صلة من هذا الفيديو

هذا الفيديو جزء من سلسلة متعددة الأجزاء حول دوال التوقيت والتحويل في Arduino. استكشف الدروس الأخرى المُنشأة من نفس المادة المصدرية:

الفصول

  • [00:00] مقدمة إلى millis() وطقم SunFounder
  • [01:19] ما هي millis() ولماذا نستخدمها بدلاً من delay()؟
  • [03:06] عرض عملي: طباعة قيمة millis()
  • [05:46] إنشاء حدث باستخدام millis() و unsigned long
  • [08:29] توصيل وبرمجة زر ضغط مع INPUT_PULLUP
  • [10:52] تشغيل مثال الحدث مع زر الضغط
  • [12:14] معاينة المثال 3: اكتشاف ضغطة زر ثانية
  • [17:20] مقدمة إلى دالة map()
  • [19:47] برمجة وعرض دالة map() مع مصباح LED

الصور

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
اللغة: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

الموارد والمراجع

ملفات📁

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