شِفر (کود) جستجو

درس ۱۴/۳۱-۳: مثال ۳ کدنویسی آردوینو با millis() و دکمه فشاری

درس ۱۴/۳۱-۳: مثال ۳ کدنویسی آردوینو با millis() و دکمه فشاری

آیا تا به حال نیاز داشتهاید که آردوینوی شما به خاطر بیاورد چه زمانی چیزی اتفاق افتاده است—مثل فشردن یک دکمه—و سپس دقیقاً پس از مدت زمان مشخصی اقدامی انجام دهد، در حالی که بقیه برنامه شما به نرمی در حال اجرا باشد؟ این یک چالش کلاسیک در برنامهنویسی آردوینو است و راهحل آن تابع millis() است. این آموزش، بخشی از دوره آردوینو Robojax، یک مثال عملی را نشان میدهد: تشخیص اینکه آیا یک دکمه فشاری برای بار دوم پس از گذشت تأخیر ۵ ثانیهای از اولین فشار، فشرده شده است یا خیر. این تکنیک برای ایجاد پروژههای پاسخگو و غیرمسدودکننده که زمانبندی در آنها حیاتی است، اساسی است.

خودروی مونتاژ شده Sunfounder

این الگوی استفاده از 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() است.

پروژههای مرتبط از این ویدیو

فصل‌ها

  • [۰۰:۰۰] مقدمه‌ای بر millis() و دوره
  • [۰۱:۱۹] millis() چیست و چرا از آن استفاده کنیم؟
  • [۰۳:۰۶] اولین مثال عملی: چاپ millis()
  • [۰۵:۴۶] استفاده از millis() برای فعال‌سازی یک رویداد پس از ۵ ثانیه
  • [۰۸:۲۹] مثال ۲: عملکرد دکمه فشاری با تأخیر ۵ ثانیه‌ای
  • [۱۲:۱۴] مثال ۳: تشخیص فشار دوم دکمه پس از یک تأخیر
  • [۱۷:۲۰] مقدمه‌ای بر تابع map()
  • [۱۹:۴۷] مثال عملی نگاشت درصدهای روشنایی 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");
      }
  }
  
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

راهنمای کاربر