تعیین مدت‌زمان فشرده‌شدن یک کلید | قسمت بیست و ششم آموزش آردوینو

blog
gasemi.m100
۱۴۰۳-۱۱-۲۷
6 دقیقه

در قسمت بیست و پنجم از آموزش آردوینو به بررسی استفاده از سوئیچ پرداختیم. در این قسمت قصد داریم درباره تعیین مدت‌زمان فشرده‌شدن یک کلید صحبت کنیم.

در اسکچ زیر، نحوه تنظیم یک تایمر کانتر معکوس نمایش‌داده‌شده است. با فشاردادن یک کلید، تایمر تنظیم می‌شود و مقدار تایمر کانتر افزایش می‌یابد؛ با رهاکردن کلید، شمارش معکوس آغاز می‌شود.

ویژگی‌های کد

  1. دیبانس (Debouncing) کلید: کد شامل مکانیزمی برای حذف لرزش‌های مکانیکی کلید است تا از ثبت چندین فشار ناخواسته جلوگیری شود.
  2. افزایش نرخ شمارش با نگه‌داشتن کلید: وقتی کلید برای اولین‌بار فشرده می‌شود (بعد از دیبانس)، مقدار تایمر کانتر یک واحد افزایش می‌یابد.
    • اگر کلید بیش از یک ثانیه نگه داشته شود، نرخ افزایش شمارنده 4 برابر سریع‌تر می‌شود.
    • اگر کلید چهار ثانیه یا بیشتر نگه داشته شود، نرخ افزایش به 10 برابر افزایش می‌یابد.
  1. شروع شمارش معکوس: با رهاکردن کلید، شمارش معکوس آغاز می‌شود.
  2. پایان شمارش: زمانی که شمارنده به صفر برسد، یک پین به وضعیت HIGH تغییر می‌کند. (در این مثال، یک LED روشن می‌شود).

هسته اصلی این برنامه، تابع switchTime است. این تابع مدت زمانی (بر حسب میلی‌ثانیه) که کلید فشرده شده است را برمی‌گرداند.

که خود این تابع از تابع millis آردوینو استفاده می‌کند تابع millis تعداد میلی‌ثانیه‌هایی را که از زمانی که برد آردوینو شروع به اجرای برنامه فعلی کرده است را برمی‌گرداند. این عدد تقریباً پس از 50 روز سرریز می‌شود (به صفر برمی‌گردد). برای فهمیدن مقدار گذر زمان مقدار قبلی این تابع را از مقدار فعلی آن کم می‌کنیم. (برای تفهیم بیشتر به کامنت های انگلیسی داخل کد دقت کنید)

✅ نکته مهم

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

عملکرد کلی تابع switchTime

  • تشخیص فشردن کلید: بررسی می‌کند که آیا کلید فشرده شده است یا خیر.
  • ثبت زمان شروع: اگر کلید فشرده شود، زمان شروع فشار ثبت می‌شود.
  • محاسبه مدت‌زمان فشار: مدت زمانی که کلید در وضعیت فشرده قرار داشته است، محاسبه و برگردانده می‌شود.

عملکرد حلقه (Loop)

حلقه اصلی اسکچ مقدار برگشتی از تابع switchTime را بررسی می‌کند تا تصمیم بگیرد چه اقدامی باید انجام شود. مراحل به‌صورت زیر است:

  • بررسی طول مدت فشار کلید: اگر مدت‌زمان فشار کلید به‌اندازه‌ای طولانی باشد که به بیشترین سرعت افزایش برسد، مقدار شمارنده به همان میزان زیاد می‌شود.
  • بررسی زمان فشار برای سرعت زیادتر: اگر زمان فشار کمتر از مقدار موردنیاز برای بیشترین سرعت باشد، اسکچ بررسی می‌کند که آیا باید از مقدار افزایش سریع‌تر استفاده کند یا خیر.
  • بررسی زمان فشار برای دیبانس: اگر زمان فشار کلید به اندازه کافی طولانی باشد تا از لرزش (debouncing) عبور کرده باشد، شمارنده با مقدار کوچک‌تری افزایش می‌یابد.

✅ نکته مهم

در هر لحظه، فقط یکی از این سه حالت اتفاق می‌افتد.

  • عدم فشار یا فشار ناکافی کلید: اگر هیچ‌کدام از شرایط فوق برقرار نباشد، یعنی کلید یا فشرده نشده است یا مدت‌زمان فشردن آن برای عبور از مرحله دیبانس کافی نبوده است.
  • بررسی مقدار شمارنده: اگر مقدار شمارنده به صفر برسد، LED روشن می‌شود. اگر مقدار شمارنده بیشتر از صفر باشد، مقدار آن کاهش می‌یابد و LED خاموش می‌شود.

شما می‌توانید از تابع switchTime فقط برای حذف نویز (debouncing) یک سوئیچ استفاده کنید. کد زیر منطق حذف نویز را با فراخوانی تابع switchTime مدیریت می‌کند:

این روش برای حذف نویز (debouncing) زمانی مفید است که بیش از یک سوئیچ داشته باشید، زیرا می‌توانید زمان فشرده‌شدن یک سوئیچ را بررسی کرده و هم‌زمان وظایف دیگر را پردازش کنید، درحالی‌که منتظر پایدار شدن وضعیت سوئیچ هستید. برای پیاده‌سازی این روش، باید وضعیت فعلی سوئیچ (فشرده شده یا نه) و زمان آخرین تغییر وضعیت را ذخیره کنید.

روش‌های مختلفی برای انجام این کار وجود دارد—در این مثال، برای هر سوئیچ از یک تابع جداگانه استفاده خواهید کرد.

شما می‌توانید متغیرهای مربوط به تمام سوئیچ‌ها را در ابتدای اسکچ به‌عنوان متغیرهای سراسری (که به آن‌ها “global” گفته می‌شود، زیرا در همه‌جا قابل‌دسترسی هستند) ذخیره کنید. بااین‌حال، راحت‌تر است که متغیرهای هر سوئیچ در داخل تابع مربوط به آن سوئیچ قرار داده شوند.

برای حفظ مقادیر متغیرهایی که در داخل یک تابع تعریف شده‌اند، این اسکچ از متغیرهای استاتیک (static variables) استفاده می‌کند.

✅نکته

متغیرهای استاتیک در داخل یک تابع، فضای ذخیره‌سازی دائمی برای مقادیری فراهم می‌کنند که باید بین فراخوانی‌های تابع حفظ شوند. مقداری که به یک متغیر استاتیک اختصاص داده می‌شود، حتی پس از بازگشت تابع نیز حفظ می‌شود. مقدار آخر تنظیم‌شده برای متغیر، در فراخوانی بعدی تابع در دسترس خواهد بود.

از این نظر، متغیرهای استاتیک مشابه متغیرهای سراسری (global variables) هستند (متغیرهای سراسری متغیرهایی هستند که خارج از یک تابع و معمولاً در ابتدای اسکچ تعریف می‌شوند و در سایر توابع نیز قابل‌دسترسی هستند.)

اما برخلاف متغیرهای سراسری، متغیرهای استاتیک که در یک تابع تعریف می‌شوند، فقط در همان تابع قابل‌دسترسی هستند.

مزیت متغیرهای استاتیک این است که نمی‌توانند به طور تصادفی توسط توابع دیگر تغییر داده شوند که این ویژگی باعث می‌شود امنیت بیشتری داشته باشند.

این اسکچ یک مثال را نشان می‌دهد که چگونه می‌توانید برای سوئیچ‌های مختلف، توابع جداگانه اضافه کنید.

این اسکچ محاسبات زمانی خود را در تابعی به نام switchTime() انجام می‌دهد. این تابع وضعیت کلید و مدت‌زمان را بررسی و به‌روزرسانی می‌کند.

یک تابع برای هر کلید ( switchATime() و switchBTime() ) استفاده می‌شود تا زمان شروع و وضعیت هر کلید را حفظ کند. ازآنجاکه متغیرهای نگهدارنده این مقادیر به‌صورت استاتیک تعریف شده‌اند، مقادیر هنگام خروج از تابع حفظ خواهند شد.

نگهداری این متغیرها درون تابع تضمین می‌کند که از متغیر اشتباهی استفاده نخواهد شد.

پین‌های مورداستفاده برای کلیدها به‌عنوان متغیرهای سراسری تعریف شده‌اند؛ زیرا این مقادیر در تابع setup برای پیکربندی پین‌ها موردنیاز هستند. اما چون این متغیرها با کلیدواژه const تعریف شده‌اند، کامپایلر اجازه تغییر این مقادیر را نخواهد داد؛ بنابراین، هیچ خطری برای تغییر تصادفی آن‌ها توسط کد اسکچ وجود ندارد.

✅نکته

محدودکردن میزان دسترسی به یک متغیر با پیچیده‌تر شدن پروژه‌ها اهمیت بیشتری پیدا می‌کند. محیط Arduino روشی کارآمدتر و شیک‌تر برای مدیریت این موضوع ارائه می‌دهد.

درون حلقه loop، این اسکچ بررسی می‌کند که دکمه برای چه مدت نگه داشته شده است. اگر هر یک از دکمه‌ها برای مدت بیش از صفر میلی‌ثانیه فشرده شده باشند، اسکچ مدت زمانی را که هر کلید نگه داشته شده است، چاپ می‌کند.

اگر سریال مانیتور را باز کنید و یکی یا هر دو دکمه را نگه دارید، مشاهده خواهید کرد که مقادیر زمانی افزایش می‌یابند و به‌صورت پیمایشی نمایش داده می‌شوند. اگر هر دو دکمه را رها کنید، تابع switchTime مقدار صفر را برمی‌گرداند؛ بنابراین، اسکچ تا زمانی که یکی یا هر دو دکمه را دوباره فشار دهید، خروجی را متوقف می‌کند.

اطلاعات
0
0
لینک و اشتراک
profile

Arduino captain

متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله