الدرس 14/31-3: مثال 3 على برمجة Arduino باستخدام millis() مع زر الضغط
هل احتجت يومًا إلى أن يتذكر الاردوينو الخاص بك متى حدث شيء ما—مثل الضغط على زر—ثم يتخذ إجراءً بعد مقدار محدد من الوقت لاحقًا، كل ذلك مع إبقاء بقية برنامجك يعمل بسلاسة؟ هذا تحدٍّ كلاسيكي في برمجة الاردوينو، والحل هو دالة millis(). هذا الدرس، وهو جزء من دورة Robojax للاردوينو، يوضح مثالًا عمليًا: اكتشاف ما إذا تم الضغط على زر ضغط مرة ثانية بعد انقضاء تأخير قدره 5 ثوانٍ منذ الضغطة الأولى. هذه التقنية أساسية لإنشاء مشاريع سريعة الاستجابة وغير معطِّلة حيث يكون التوقيت أمرًا حاسمًا.
هذا النمط من استخدام 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().
مشاريع ذات صلة من هذا الفيديو
- الدرس 14/31-1: دوال Arduino Millis (بدون تأخير) و map | SunFounder Robojax
- الدرس 14/31-2: مثال 2 لبرمجة Arduino millis() مع حدث
- الدرس 14/31-4: مثال 1 لبرمجة Arduino map()
- الدرس 14/31-5: مثال 2 لبرمجة Arduino map()
الفصول
- [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
/*
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");
}
}
}
الأشياء التي قد تحتاجها
-
أمازونSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
أمازون
-
أمازون
-
أمازون
-
أمازون
الموارد والمراجع
-
توثيقوثائق لمجموعة SunFounder 3 في 1 لإنترنت الأشياء/السيارات الذكية/التعلمdocs.sunfounder.com
-
خارجياشترِ مجموعة التعلم الذكية 3 في 1 من سن فاونديرsunfounder.com
ملفات📁
دليل المستخدم
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB