در پروژه های 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); } }
وسایل مورد نیاز
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۰۳۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام
لایبرری بسیار جالی رو معرفی کردین
ممنون از اینکه وقت میزارین
سلام
چند تا پروژه دارم.
شاید بتونیم با هم کار کنیم
در مورد اونها لطفا با من تماس بکیرید
******
ممنونم
slm
man mikhastam yek mashin hesab dorost konam mishe mano rahnamaee konin?
سلام مشکلتون رو بفرمایین
mikhasam bebinam vaghti mikham az kepad adad bekhonam chejori character ha ra be adad tabdeil konam?
maslan mikhab adad 8563 ra bekhonam.
mammon misham rahnamaie konid
سلام آموزش همین پروژه را قرار میدم به زودی
ماشین حساب پیشرفته با آردوینو مینویسم
مطالب ما را دنبال کنید
salam- mishe begin key mizarin? man kheili besh niaz daram
با سلام،
من میخواهم اداپتوری بسازم که یک یا چند وسیله 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; بعد این برنامه برای نسخه ۱٫۸٫۱۲کار میکند؟
با سلام
تفاوتی در نوع ورژن نرم افزار وجود ندارد. لطفا ارور کامل را ارسال کنید تا بررسی شود.