كود البحث

الدرس 14/31-3: مثال 3 على برمجة Arduino باستخدام millis() مع زر الضغط

الدرس 14/31-3: مثال 3 على برمجة Arduino باستخدام millis() مع زر الضغط

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

سيارة Sunfounder مجمّعة

هذا النمط من استخدام millis() لتتبع الوقت دون إيقاف البرنامج هو أمر أساسي لمجموعة واسعة من التطبيقات الواقعية. إليك بعض الأفكار لإلهام مشاريعك الخاصة:

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

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

يستخدم هذا المشروع مكونات من مجموعة SunFounder 3-in-1 للاردوينو، وهي مورد رائع للتعلم. ستحتاج إلى:

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

دليل التوصيل

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

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

باستخدام INPUT_PULLUP، يتم توصيل الدبوس داخليًا بـ 5V، لذلك يقرأ HIGH بشكل طبيعي. عند الضغط على الزر، يتم توصيل الدبوس بـ GND، مما يجعله يقرأ LOW. هذا هو المنطق الذي سنستخدمه في الكود.

شرح الكود

جوهر هذا المشروع هو المنطق الذي يتتبع الضغطة الأولى على الزر ثم يتحقق من ضغطة ثانية بعد فترة زمنية محددة. تم تصميم الكود ليكون غير معطِّل، مما يعني أنه لن يوقف تنفيذ المهام الأخرى في loop() الخاصة بك.

في أعلى الرسم البرمجي، ستجد المتغيرات الرئيسية القابلة للتخصيص من قبل المستخدم والتي تتحكم في سلوك التوقيت:

unsigned long event = 5000;// 5 ثوانٍ
unsigned long buttonPushed =0;
  • event: هذا هو متغير التوقيت الحاسم. يحدد مدة التأخير بالمللي ثانية. في هذا المثال، تم ضبطه على 5000، وهو ما يساوي 5 ثوانٍ. يمكنك تغيير هذه القيمة إلى أي مدة أخرى لتناسب احتياجات مشروعك.
  • buttonPushed: يُستخدم هذا المتغير كعلامة وطابع زمني. يبدأ عند 0 ويتم تحديثه إلى قيمة millis() في المرة الأولى التي يتم فيها الضغط على الزر. يتم استخدام هذا الوقت المخزن لحساب الفرق لفحص الضغطة الثانية.

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

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

في الفيديو، يتم رفع الكود إلى الاردوينو، ويتم فتح الشاشة التسلسلية لملاحظة السلوك. (في الفيديو عند 16:03) سترى قيمة millis() تُطبع باستمرار، مما يُظهر الوقت منذ بدء البرنامج. عند الضغط على الزر لأول مرة، تتم طباعة رسالة مثل First push at:5019. إذا ضغطت على الزر مرة أخرى واستمريت في الضغط لأكثر من 5 ثوانٍ من الضغطة الأولى، تتم طباعة الرسالة Action after 5 seconds of first push. هذا يوضح أن الإجراء يتم تشغيله فقط عندما تحدث الضغطة الثانية بعد انقضاء التأخير المحدد.

قوة هذا النهج هي أن سطر Serial.println(millis()) في أعلى الحلقة يستمر في العمل دون انقطاع، مما يثبت أن منطق التوقيت لا يمنع تنفيذ الكود الآخر. هذه هي الميزة الأساسية لاستخدام millis() بدلاً من دالة delay().

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

الفصول

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

الصور

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
اللغة: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

الأشياء التي قد تحتاجها

ملفات📁

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