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

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

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

در این آموزش، یاد خواهید گرفت که چگونه از تابع millis() آردوینو برای فعال کردن یک عمل فقط پس از گذشت یک دوره زمانی مشخص استفاده کنید، همه اینها بدون مسدود کردن بقیه برنامه شما. این یک تکنیک اساسی برای ایجاد پروژه‌های آردوینو واکنش‌گرا است که در آن چندین وظیفه باید به طور همزمان اجرا شوند، مانند چشمک زدن LEDها در حین خواندن سنسورها یا نظارت بر فشار دکمه‌ها. این مثال خاص بر فعال کردن یک رویداد پس از پنج ثانیه تمرکز دارد، اما منطق آن را می‌توان در سناریوهای بی‌شماری از دنیای واقعی به کار برد.

ماشین سان‌فاندر مونتاژ شده

در اینجا چند مثال عملی از نحوه استفاده از این الگو در پروژه‌های خودتان آورده شده است:

  • فعال‌سازی با تأخیر: روشن کردن یک فن یا پمپ فقط پس از اینکه سیستم برای مدت زمان مشخصی کار کرده باشد.
  • قفل‌های ایمنی: نیاز به فشار دادن و نگه داشتن یک دکمه برای مدتی قبل از انجام یک عمل خطرناک، مانند روشن کردن موتور.
  • هشدارهای مبتنی بر زمان: فعال کردن یک زنگ هشدار یا اعلان اگر خواندن حساس(حس کننده) در یک بازه زمانی مشخص تغییر نکرده باشد.
  • تایمرهای غیرمسدودکننده: ایجاد یک تایمر «نگهبان» که دستگاه را در صورت عدم پاسخگویی بازنشانی می‌کند.

مشکل اصلی که این روش حل می‌کند، محدودیت تابع delay() است. وقتی از delay(5000) استفاده می‌کنید، آردوینو اجرای هر شِفر (کود) دیگری را برای آن پنج ثانیه متوقف می‌کند. این برای اسکچ‌های ساده خوب است، اما در پروژه‌های پیچیده‌تر که نیاز به خواندن سنسورها، به‌روزرسانی نمایشگرها یا گوش دادن به فشار دکمه‌ها در حین انتظار دارید، به یک مشکل بزرگ تبدیل می‌شود. تابع millis() که میلی‌ثانیه‌های سپری شده از روشن شدن برد را شمارش می‌کند، به شما امکان می‌دهد زمان را بدون توقف برنامه بررسی کنید.

سخت‌افزار مورد نیاز

  • برد آردوینو (Uno، Nano، Mega و غیره)
  • یک دکمه فشاری
  • سیم‌های جامپر

راهنمای سیم‌کشی

سیم‌کشی برای این مثال بسیار ساده است. از مقاومت pull-up داخلی استفاده می‌کند، بنابراین برای دکمه به مقاومت خارجی نیازی نیست.

  • یک پایه دکمه فشاری را به پایه GND روی آردوینو وصل کنید.
  • پایه دیگر دکمه فشاری را به پایه دیجیتال 2 روی آردوینو وصل کنید.

چون در شِفر (کود) از INPUT_PULLUP استفاده می‌کنیم، پایه وقتی دکمه فشار داده نشده است HIGH و وقتی فشار داده شده و پایه به زمین متصل می‌شود LOW خواهد خواند. (در ویدیو در 08:29)

درک شِفر (کود)

این شِفر (کود) یک تایمر ساده مبتنی بر رویداد را نشان می‌دهد. برنامه به طور مداوم مقدار فعلی millis() را در نمایشگر مسلسل چاپ می‌کند. وقتی دکمه فشاری فشار داده شده و نگه داشته شود، و آردوینو حداقل ۵ ثانیه در حال اجرا بوده باشد، عبارت «Take action» را در نمایشگر مسلسل چاپ می‌کند. نکته کلیدی این است که بررسی millis() چاپ مداوم زمان را متوقف نمی‌کند.

بیایید بخش‌های قابل تنظیم توسط کاربر شِفر (کود) را تجزیه کنیم:

unsigned long event = 5000;// 5 seconds

این مهم‌ترین متغیر برای پیکربندی است. مدت زمان «رویداد» شما را بر حسب میلی‌ثانیه تعریف می‌کند. در این مثال، روی 5000 تنظیم شده است که برابر با ۵ ثانیه است. برای تغییر تأخیر، کافی است این عدد را تغییر دهید. به عنوان مثال، تنظیم آن روی 10000 باعث می‌شود عمل پس از ۱۰ ثانیه فعال شود. استفاده از نوع داده unsigned long بسیار مهم است، زیرا مقدار millis() می‌تواند بسیار بزرگ شود و در نهایت از حداکثر مقدار یک متغیر استاندارد int فراتر رود و باعث خطا در مقایسه شود. (در ویدیو در 05:46)

pinMode(2,INPUT_PULLUP);

این خط پایه دیجیتال ۲ را به عنوان ورودی پیکربندی می‌کند و مقاومت pull-up داخلی آن را فعال می‌کند. این یک مرحله پیکربندی کلیدی است که به شما امکان می‌دهد بدون مقاومت خارجی یک دکمه را وصل کنید. پایه به طور پیش‌فرض HIGH خواهد خواند و وقتی دکمه فشار داده شود و آن را به زمین متصل کند، LOW می‌شود. اگر می‌خواهید از پایه دیگری استفاده کنید، عدد 2 را در اینجا و در خط digitalRead(2) داخل حلقه تغییر دهید. (در ویدیو در 08:46)

منطق داخل loop() ساده است. وضعیت دکمه را می‌خواند. اگر دکمه فشار داده شده باشد (pb == LOW)، سپس بررسی می‌کند که آیا زمان فعلی (millis()) بزرگ‌تر یا مساوی زمان event تعریف شده شما است. اگر هر دو شرط درست باشند، پیام عمل را چاپ می‌کند. بقیه حلقه، که زمان را چاپ می‌کند، بدون وقفه به اجرا ادامه می‌دهد و قدرت millis() را نسبت به delay() نشان می‌دهد.

این مثال زمان را از لحظه شروع آردوینو بررسی می‌کند. مثال سوم در سری ویدیوها بر این اساس ساخته شده است و زمان اولین فشار دکمه را ثبت می‌کند و فقط در صورتی عمل را فعال می‌کند که فشار دوم حداقل ۵ ثانیه بعد رخ دهد. آن منطق در درس 14/31-3: مثال ۳ کدنویسی آردوینو millis() با دکمه فشاری پوشش داده شده است.

نمایش زنده پروژه

پس از آپلود شِفر (کود) و باز کردن نمایشگر مسلسل (با نرخ 9600 باد)، جریان پیوسته‌ای از اعداد را مشاهده خواهید کرد که میلی‌ثانیه‌های سپری شده از روشن شدن برد را نشان می‌دهد. اگر دکمه فشاری را قبل از گذشت ۵ ثانیه فشار دهید و نگه دارید، هیچ اتفاقی نمی‌افتد. با این حال، اگر دکمه را بعد از علامت ۵ ثانیه فشار دهید و نگه دارید، پیام «Take action» را در نمایشگر مسلسل چاپ شده خواهید دید. عمل تا زمانی که دکمه نگه داشته شود به چاپ ادامه می‌دهد. این یک تایمر غیرمسدودکننده را نشان می‌دهد که به کدهای دیگر (چاپ) اجازه می‌دهد به طور یکپارچه اجرا شوند. (در ویدیو در 10:52)

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

این ویدیو بخشی از یک مجموعه چند قسمتی درباره توابع زمان‌بندی و نگاشت آردوینو است. آموزش‌های دیگری که از همین منبع ساخته شده‌اند را کاوش کنید:

فصل‌ها

  • [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

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

فایل‌ها📁

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