درس ۱۴/۳۱-۳: مثال ۳ کدنویسی آردوینو با millis() و دکمه فشاری
آیا تا به حال نیاز داشتهاید که آردوینوی شما به خاطر بیاورد چه زمانی چیزی اتفاق افتاده است—مثل فشردن یک دکمه—و سپس دقیقاً پس از مدت زمان مشخصی اقدامی انجام دهد، در حالی که بقیه برنامه شما به نرمی در حال اجرا باشد؟ این یک چالش کلاسیک در برنامهنویسی آردوینو است و راهحل آن تابع millis() است. این آموزش، بخشی از دوره آردوینو Robojax، یک مثال عملی را نشان میدهد: تشخیص اینکه آیا یک دکمه فشاری برای بار دوم پس از گذشت تأخیر ۵ ثانیهای از اولین فشار، فشرده شده است یا خیر. این تکنیک برای ایجاد پروژههای پاسخگو و غیرمسدودکننده که زمانبندی در آنها حیاتی است، اساسی است.
این الگوی استفاده از millis() برای پیگیری زمان بدون توقف برنامه، برای طیف گستردهای از کاربردهای دنیای واقعی ضروری است. در اینجا چند ایده برای الهام بخشیدن به پروژههای خودتان آورده شده است:
- رابطهای دکمه با حذف اغتشاش (نویز) (Debounced): سیستمی پیادهسازی کنید که در آن یک دکمه باید برای مدت زمان مشخصی (مثلاً ۳ ثانیه) نگه داشته شود تا دستگاه روشن شود و از فشارهای تصادفی جلوگیری شود.
- اقدامات متوالی: سیستمی ایجاد کنید که در آن یک رویداد، مانند فعال شدن حساس(حس کننده) حرکت، یک اقدام ثانویه را مسلح کند که تنها در صورتی رخ دهد که رویداد دیگری در یک بازه زمانی مشخص اتفاق بیفتد.
- تایمرهای تعامل با کاربر: پروژهای بسازید که برای اجرای یک عملکرد حیاتی، مانند ارسال فرمان یا راهاندازی موتور، به ورودی «تأیید» (مانند فشار دوم دکمه) در یک زمان مشخص نیاز داشته باشد.
- دروازهبندی حساس(حس کننده): از اولین سیگنال یک حساس(حس کننده) برای شروع یک پنجره زمانی استفاده کنید که در طی آن، خواندن حساس(حس کننده) دوم و متفاوت معتبر در نظر گرفته شود یا نادیده گرفته شود.
سختافزار مورد نیاز
این پروژه از قطعات کیت ۳ در ۱ آردوینو SunFounder استفاده میکند که منبع عالی برای یادگیری است. شما نیاز دارید:
- برد آردوینو (Uno، Nano و غیره)
- یک دکمه فشاری لحظهای
- سیمهای جامپر
راهنمای سیمکشی
سیمکشی برای این مثال بسیار ساده است، به لطف مقاومتهای pull-up داخلی آردوینو، که نیاز به مقاومت خارجی را از بین میبرد. (در ویدیو در ۰۸:۲۹)
- یک پایه دکمه فشاری را به پایه GND روی آردوینو وصل کنید.
- پایه دیگر دکمه فشاری را به پایه دیجیتال ۲ روی آردوینو وصل کنید.
با استفاده از INPUT_PULLUP، پایه به صورت داخلی به ۵ ولت متصل میشود، بنابراین به طور معمول HIGH خوانده میشود. وقتی دکمه فشرده میشود، پایه را به GND متصل میکند و باعث میشود LOW خوانده شود. این منطقی است که در شِفر (کود) استفاده خواهیم کرد.
توضیح شِفر (کود)
هسته این پروژه منطقی است که اولین فشار دکمه را پیگیری میکند و سپس فشار دوم را پس از یک بازه زمانی مشخص بررسی میکند. شِفر (کود) به گونهای طراحی شده است که غیرمسدودکننده باشد، به این معنی که اجرای سایر وظایف در loop() شما را متوقف نمیکند.
در بالای اسکچ، متغیرهای کلیدی قابل تنظیم توسط کاربر را خواهید یافت که رفتار زمانبندی را کنترل میکنند:
unsigned long event = 5000;// 5 ثانیه
unsigned long buttonPushed =0;
event: این متغیر زمانبندی حیاتی است. مدت تأخیر را بر حسب میلیثانیه تنظیم میکند. در این مثال، روی5000تنظیم شده است که برابر با ۵ ثانیه است. میتوانید این مقدار را به هر مدت زمان دیگری برای نیازهای پروژه خود تغییر دهید.buttonPushed: این متغیر به عنوان یک پرچم و یک برچسب زمانی استفاده میشود. از0شروع میشود و اولین بار که دکمه فشرده میشود، به مقدارmillis()بهروزرسانی میشود. این زمان ذخیره شده سپس برای محاسبه اختلاف برای بررسی فشار دوم استفاده میشود.
منطق در تابع loop() در دو مرحله کار میکند. ابتدا، وضعیت دکمه را میخواند و اگر برای اولین بار فشرده شده باشد (pb == LOW && buttonPushed == 0)، زمان فعلی را از طریق millis() در متغیر buttonPushed ثبت میکند. مرحله دوم بررسی میکند که آیا دکمه هنوز فشرده است و آیا اولین فشار ثبت شده است یا خیر. اگر چنین باشد، اختلاف زمان بین زمان فعلی و زمان اولین فشار را محاسبه میکند. اگر این اختلاف بزرگتر یا مساوی زمان event شما باشد، اقدام را اجرا میکند—در این مورد، چاپ یک پیام در نمایشگر مسلسل.
نمایش زنده پروژه
در ویدیو، شِفر (کود) روی آردوینو بارگذاری میشود و نمایشگر مسلسل برای مشاهده رفتار باز میشود. (در ویدیو در ۱۶:۰۳) خواهید دید که مقدار millis() به طور مداوم چاپ میشود و زمان سپری شده از شروع برنامه را نشان میدهد. وقتی دکمه را برای اولین بار فشار دهید، پیامی مانند First push at:5019 چاپ میشود. اگر دکمه را دوباره فشار دهید و آن را برای بیش از ۵ ثانیه از اولین فشار نگه دارید، پیام Action after 5 seconds of first push چاپ میشود. این نشان میدهد که اقدام تنها زمانی فعال میشود که فشار دوم پس از گذشت تأخیر مشخص شده رخ دهد.
قدرت این رویکرد این است که خط Serial.println(millis()) در بالای حلقه بدون وقفه به اجرا ادامه میدهد و ثابت میکند که منطق زمانبندی اجرای کدهای دیگر را مسدود نمیکند. این مزیت اساسی استفاده از millis() نسبت به تابع delay() است.
پروژههای مرتبط از این ویدیو
- درس ۱۴/۳۱-۱: توابع Arduino Millis (بدون تأخیر) و map | SunFounder Robojax
- درس ۱۴/۳۱-۲: مثال ۲ کدنویسی millis() آردوینو با رویداد
- درس ۱۴/۳۱-۴: مثال ۱ کدنویسی map() آردوینو
- درس ۱۴/۳۱-۵: مثال ۲ کدنویسی map() آردوینو
فصلها
- [۰۰:۰۰] مقدمهای بر millis() و دوره
- [۰۱:۱۹] millis() چیست و چرا از آن استفاده کنیم؟
- [۰۳:۰۶] اولین مثال عملی: چاپ millis()
- [۰۵:۴۶] استفاده از millis() برای فعالسازی یک رویداد پس از ۵ ثانیه
- [۰۸:۲۹] مثال ۲: عملکرد دکمه فشاری با تأخیر ۵ ثانیهای
- [۱۲:۱۴] مثال ۳: تشخیص فشار دوم دکمه پس از یک تأخیر
- [۱۷:۲۰] مقدمهای بر تابع map()
- [۱۹:۴۷] مثال عملی نگاشت درصدهای روشنایی 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
-
آمازون
-
آمازون
-
آمازون
-
آمازون
منابع و مراجع
-
مستنداتمستندات برای کیت یادگیری ۳ در ۱ اینترنت اشیاء/ماشین هوشمند/سانفاندترdocs.sunfounder.com
-
خارجیکیت آموزشی هوشمند ۳ در ۱ ماشین سانفاندری را خریداری کنید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