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

آموزش راه‌اندازی کیپد keypad آردوینو با کتابخانه کیپد – بخش دوم

آموزش جامع کیپد آردوینو Arduino
نوشته شده توسط علیرضا قربانی

در پروژه های DIY کنترل درب به صورت اتوماتیک بسیار پرطرفدار است. در این خصوص روش های متفاوتی برای طراحی سیستم درب باز کن وجود دارد. یکی از این روش ها استفاده از کیپدهای ماتریسی است. کیپد ها دارای دو نوع فلت و معمولی و با ابعاد و کلیدهای متفاوتی هستند. در این آموزش به معرفی کیپد و نحوه‌ی استفاده از آن خواهیم پرداخت. .در جلسه دوم از آموزش کیپد keypad قصد داریم به کتابخانه‌ای بسیار مفید و کاربردی بپردازیم که به به کمک آن می‌توانید کیپد خود را به صورت حرفه‌ای راه اندازی کنید. به وسیله‌ی کتابخانه کیپد Keypad قادر خواهید بود انواع کیپد‌ها از قبیل کیپدهای قدیمی در تلفن‌ها و سایر لوازم الکترونیکی یا کیپدهای ۳*۴ یا ۴*۴ و  … را راه اندازی نمایید. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسیدیجی اسپارک همراه باشید

 


تحلیل کتابخانه کیپد Keypad


ویژگی کتابخانه کیپد Keypad

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

 

فراخوانی دستورات کیپد Keypad

برای شروع کار ابتدا باید تعداد سطر و ستون‌های کتابخانه را در یک متغیر در برنامه ذخیره کنیم. برای مثال در کد زیر ما تعداد ۴ سطر و ۴ ستون را درون متغیری در برنامه ذخیره می‌کنیم :

const byte ROWS= 4; //4 سطر
const byte COLS= 4;//4 ستون

سپس باید  در یک آرایه‌ی دو بعدی نقشه‌ی کیپد Keypad را ذخیره کنیم مانند عملیات زیر :

char keys[ROWS][COLS] =
  {
    { '۱', '۲', '۳', 'A', },
    { '۴', '۵', '۶', 'B', },
    { '۷', '۸', '۹', 'c', },
    { '*', '۰', '#', 'D'  }
  };

 

اکنون باید در دو آرایه مجزا شماره پین‌های آردوینو که به سطر و ستون keypad متصل شده است را در برنامه وارد کنیم.برای مثال ما پین‌های شماره ۲ , ۳ , ۴ , ۵ آردوینو را به سطر کیپد و پین های شماره ۶ , ۷ , ۸ , ۹ را به ستون کیپد متصل کرده ایم.

byte rowPins[ROWS] = { 2, 3, 4, 5 };
byte colPins[COLS] = { 6, 7, 8, 9 };

هم اکنون نوبت به ساخت یک آبجکت از کلاس keypad.h می‌رسد و باید مقدار سازنده‌های آن را وارد کنیم :

/*
Keypad (makeKeymap (userKeymap), row[], col[], rows, cols)
ساختاری که باید مطابق آن عمل کنیم

*/

Keypad kpd = Keypad (makeKeymap (keys), rowPins, colPins, ROWS, COLS);

 

 


توابع کتابخانه Keypad 


 

 تایع Waitforkey

این تابع منتظر می‌ماند تا کلیدی فشرده شود و مقداری دریافت نماید. این تابع باعث متوقف شدن  کد‎های دیگر برنامه (به جز وقفه‌ها) می‌شود، یعنی اگر بعد از این تابع برنامه روشن و خاموش شدن یک LED را قرار دهید ، LED تا زمانی که دکمه‌ای از کیپد فشرده نشود ،خاموش و روشن نمی‌شود. برای مثال در برنامه زیر عبارت “digispark”  بعد از هر بار فشرده شدن یک دکمه از keypad بر روی سریال مانیتور نمایش داده می‌شود.

void loop ()
{
  char ch = kpd.waitForKey();
  if (ch)
  {
    Serial.print(ch);
  }
  Serial.print("digispark");
}

 

تابع ()getKey

کاراکتر مربوط به کلید فشرده را برمی‌گرداند. این تابع بر خلاف تابع فوق در صورتی که کلید فشرده نشود باعث مسدود شدن برنامه نمی‌شود. مثال :

void loop ()
{
  char ch = kpd.getKey();
  if (ch)
  {
    Serial.print(ch);
  }
  Serial.print("digispark");
}

 

تابع ()getkeys

این تابع اگر دکمه‌ای فعال شد مقدار true و در غیر این صورت مقدار false را برمی‌گرداند.برای مثال در کد زیر هرگاه وضعیت یک کلید از کیپد تغییر کند پیغام keypad active.. بر روی سریال مانیتور نمایش داده می‌شود.

void loop()
{
  if ( kpd.getKeys() )
  {

    Serial.print("keypad avtive ...");
  }
}

 

تابع (addEventListener(KetpadEvent

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

ابتدا باید یک تابع با نام دلخواه بعد از loop برنامه می‌نویسیم مانند زیر:

void loop()
{
  char ch = keypad.getKey ();
}

void keypadEvent ( KeypadEvent key )
{

}

در مرحله بعد باید در setup برنامه به وسیله دستور addEventListener ، تابعی که در بالا نوشتیم به برنامه معرفی کنیم :

 

void setup()
{
  Serial.begin ( 9600 );
  keypad.addEventListener( keypadEvent );
}
void loop()
{
  char ch = keypad.getKey ();
}

void keypadEvent ( KeypadEvent key )
{
  /*
  کدهایی که هنگام event کیپد اجرا می شودند
   */

}

تابع فوق دارای یک سری تابع وابسته به خود می‌باشد که به شرح آن ها می‌پردازیم :

 

تایع ()KeyState getState

این تابع وضعیت دکمه مورد نظر را مشخص می‌کند و دارای چهار حالت IDLE , PRESSED , RELEASED و HOLD می‌باشد.توجه داشته باشید که از  این تابع زمانی می‌توان استفاده نمود که از تابع addEventListener استفاده شده باشد. مثال :

 

محدودیت در دسترسی کامل به این مجموعه آموزش

 

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

 

تابع ()KeyStateChanged

این تابع نیز همانند تابع فوق زمانی می‌توان از آن استفاده نمود که از تابع addEventListener نیز در برنامه استفاده شده باشد. در صورت تغییر وضعیت کلید مقدار true و در غیر  این صورت مقدار false را بر‌می‌گرداند. مثال :

 

void setup() {
  Serial.begin(9600);

  keypad.addEventListener(keypadEvent); //اضافه کردن تابع رخداد کیپد
}

void loop()
{
  char ch = keypad.getKey();
}


//تابع رخداد کیپد
void keypadEvent(KeypadEvent key)
{
  if (keypad.keyStateChanged())
  {
    Serial.println( " state change . . . " );
  }
}

 

دسترسی به هر دکمه از keypad

توسط توابعی که در بالا معرفی شد نمی‌توان به وضعیت تک تک دکمه‎های کیپد Keypad دسترسی پیدا کرد. برای انجام این کار باید از دستورات زیر استفاده نمود.

keypad.key[i].kstate;

به وسیله دستور فوق می‌توانید به وضعیت IDLE , PRESSED , HOLD , یا RELEASED دکمه i ام کیپد دسترسی پیدا کنید. مثال :

void loop ()
  {
  if ( kpd.key[2].kstate == HOLD )
    {
    Serial.println ("key 2  HOLD");
    }

  }

در این مثال اگر دستمان را بر روی دکمه دوم کیپد نگاه داریم پیغام  key 2  HOLD بر روی سریال مانیتور نمایش داده می‌شود.

 

تابع kpd.key[i].stateChanged

این تابع در صورت تغییر وضعیت دکمه i ام مقدار  true  و در غیر این‌صورت مقدار false را برمی‌گرداند. در مثال زیر در صورت تغییر وضعیت کلید دوم کیپد مقدار stateChanged را بر روی سریال مانیتور نمایش می‌دهد.

 

if ( kpd.key[i].kstate == stateChanged )
    {
    Serial.println (" stateChanged ");
    }

 

تایع (setHoldTime(unsigned int time

این تابع مقدار زمان ( بر حسب میلی ثانیه) برای اینکه وضعیت HOLD در دو تابع زیر به وجود آید ، را تعیین می‌کند(الزامی به استفاده از این تابع در برنامه نمی‌باشد زیرا دارای مقدار پیش فرض می‌باشد ).

keypad.key[i].kstate ;
getState ()

 

تابع (setDebounceTime(unsigned int time

این تابع زمان مورد نیاز برای عملیات Debouncing را بر حسب میلی‌‌ثانیه مشخص می‌کند.  برای آموش دیبانسینگ (Debouncing) می‌توانید به لینک‌های زیر مراجعه نمایید.

آموزش Debouncing یا نویزگیری کلید آردوینو بخش اول

آموزش دی بانسینگ کلید در آردوینو بخش دوم

 

در مثال زیر می‌توانید پروژه‌ای ساده با استفاده از کتابخانه کیپد Keypad را مشاهده کنید:

#include <Keypad.h>
const byte ROWS = 4; //تغداد سطر ها
const byte COLS = 4; //تعداد ستون ها
//نقشعه ی کیپد به صورت آرایه دو بعدی
char hexaKeys[ROWS][COLS] = {
    { '۱', '۲', '۳', 'A' },
    { '۴', '۵', '۶', 'B' },
    { '۷', '۸', '۹', 'C' },
    { 'C', 'D', '#', 'D' }
  };
byte rowPins[ROWS] = { 2, 3, 4, 5 }; //پین های متصل به سطر کیپد
byte colPins[COLS] = { 6, 7, 8, 9 }; //پین های متصل به ستون کیپد

//keypadساخت یک آبچکت از کلاس
Keypad kpd = Keypad (makeKeymap (hexaKeys), rowPins, colPins, ROWS, COLS);

void setup ()
  {
  kpd.setHoldTime (5000);
  Serial.begin (9600);
  }

void loop ()
  {
  char customKey = kpd.getKey ();

  if ( customKey ){
    Serial.println (customKey);
    }
  }

 

وسایل مورد نیاز

برد آردوینو Arduino

کیپد ماتریسی Keypad

 

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

 

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۰۳۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

 

درباره نویسنده

علیرضا قربانی

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۹ دیدگاه

  • سلام
    چند تا پروژه دارم.
    شاید بتونیم با هم کار کنیم
    در مورد اونها لطفا با من تماس بکیرید

    ******
    ممنونم

  • با سلام،
    من میخواهم اداپتوری بسازم که یک یا چند وسیله USB رو به اون متصل کنم و سپس اداپتور از طریق بلوتوث اطلاعات رو به کامپیوتر یا تبلت ارسال کنه.
    برای مثال، کیبورد و ماوس usb رو تبدیل به بلوتوث کنه.
    من در الکترونیک و کامپیوتر و برنامه نویسی مبتدی هستم و تا کنون با برد های آردوینو کار نکردم، ممکنه خواهش کنم راهنمایی بفرمایید.
    با تشکر
    محمودی

    • سلام

      کاری که میخواهین انجام بدین زیاد مشکل نیست

      سوالاتون رو بفرمایین تا راهنمایی کنم

  • سلام ی سوال داشتم….
    میخوام یک حلقه بنویسم که تا زمانی که یک کلید فشرده نشده ادامه داشته باشه… چطوری باید بنویسم؟

  • سلام میشه برنامه تایپ حروف رو هم بزارید من الان ۶۵روزه دارم کار میکنم ولی نتونستم بنویسم خییلی ممنون از اموزش های عالی تون

  • سلام اقای قربانی : یک برنامه دارم که برای دریافت ورودی از کلیدهای یک طرفه استفاده می کنه میخوام از کی پد برای ورودی استفاده کنم چیکار کنم . من برنامه نویسی آردینو رو یاد ندارم برنامه رو میفرستم به اضافه کیپد رو میشه برام تغییرات بدید.

    • درود برشما
      ضمن تشکر از توجه شما، متاسفانه چنین امکانی وجود ندارد. شما باید ابتدا برنامه نویسی را تا حدودی بلد باشید و برای رفع عیب از این طریق اقدام کنید. نه که در اوج سادگی تقاضای ارسال برنامه از طرف نویسنده‌های سایت را داشته باشید. دقت داشته باشید که دیجی اسپارک برای ارتقاء سطح سواد شما کاربران ایجاد شده است، نه برای راحتی کاربران
      شاد و پیروز باشید.

  • سلام مهندس
    من یه کد می خوام بنویسم که یک ورودی عددی از ما دریافت کنه و بعد ثبت ورودی به تعداد آن از ما ورودی در یافت کنه.
    ممنون میشم راه نماییم کنید

    • با سلام
      از توجه شما ممنونم، در حال حاضر نویسندگان دیجی اسپارک، امکان انجام چنین پروژه‌هایی را ندارند و شما میتوانید برای رفع عیب کدهایی که نوشته‌اید به این صفحه مراجعه کنید.

  • سلام. عملکرد کیپد باید اینطوری باشه که هر بار که فشار میدیم, یک عملی انجام بده. چطور میشه تعریف کرد که یک عدد ۵ یا ۶ رقمی بخونه.

  • با سلام
    ممنون بابت آموزش خوبتان من یک مشکلی دارم در نوشتن اعداد ۲ رقمی با keypad
    با برنامه زیر هر کلید به تنهایی کار می کند در حالی که من به بیشتر از این اعداد نیاز دارم ممنون می شوم جهت افزایش تعدا پین ها کمک کنید
    این برنامه در حلقه loop اردینو قرار دارد
    char key = keypad.getKey();
    //char key = kpd.getKey();

    if (key) // Check for a valid key.
    {
    switch (key)
    {
    case ‘1’:
    Serial.println(key);
    break;
    case ‘2’:
    Serial.println(key);
    break;
    case ‘3’:
    Serial.println(key);
    break;
    case ‘4’:
    Serial.println(key);
    break;
    case ‘5’:
    Serial.println(key);
    break;
    case ‘6’:
    Serial.println(key);
    break;
    case ‘7’:
    Serial.println(key);
    break;
    case ‘8’:
    Serial.println(key);
    break;
    case ‘9’:
    Serial.println(key);
    break;
    case ‘*’:
    Serial.println(key);
    break;
    case ‘#’:
    Serial.println(key);
    break;
    case ‘0’:
    Serial.println(key);
    break;
    }
    }

  • با سلام و خسته نباشید. در مورد ساختار keypad.key[i].kstate زمانی که از ان استفاده میکنیم برنامه متوقف که نمیشه؟ ینی هر زمانی که ما کلید i رو فشار بدیم میکروکنترولر متوجه میشه؟

    • با سلام
      در متن وضعیت های قابل تعریف برای این تابع تعریف شده است.
      توسط دستور فوق می‌توانید به وضعیت IDLE , PRESSED , HOLD , یا RELEASED دکمه i ام کیپد دسترسی پیدا کنید.

  • سلام
    در هنگام Verify کردن برنامه در خط زیر برای Keypad ارور میدهد.
    Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, Rows, Cols);

  • سلام خدا قوت،بنده برنامه راه اندازی صفحه کلید۴*۴ همراه lcd با ماژول i2c، هنگام فراخوانی کتابخانه صفحه کلید ارور میزنه کتابخانه های موجود در اینترنت رو وارد کردم اما ارور میزنه،ک.ه کتابخانه با نسخه اردوینو تطبیق نداره به نظر شما چکارکنم

      • سلام من یه که کی پد ۳*۴دارم با یک ماژول سون سگمنت مدل TM1637-4D میشه بگیپ اگه بخوام عدد کی پد را روی سون سگمنت نمایش بدم باید از چه کد های استفاده کنم ونحوه اتصالات به اردینو چگونه است ممنون میشم

  • سلام با تشکر از اموزش شما ببخشید برای ما این دستور رو ارور میگیرد
    const byte ROWS = 2; بعد این برنامه برای نسخه ۱٫۸٫۱۲کار میکند؟

    • با سلام
      تفاوتی در نوع ورژن نرم افزار وجود ندارد. لطفا ارور کامل را ارسال کنید تا بررسی شود.